home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / pgmutl / val_link.arc / LKSLIDES.ARC / SLSHOW.C < prev    next >
Text File  |  1989-02-18  |  16KB  |  444 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mem.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6. #include <string.h>
  7. #include "langext.h"
  8. /*+-------------------------------------------------------------------------+
  9.   |                                                                         |
  10.   |                                Constants                                |
  11.   |                                                                         |
  12.   +-------------------------------------------------------------------------+*/
  13. #define BLINK_ATTRIBUTE                0x80
  14. #define COLUMNS_PER_ROW                80
  15. #define COLUMNS_PER_TITLE              60
  16. #define MAX_LINE_SIZE                  1024
  17. #define MENU_ITEMS                     20
  18. #define NORMAL_ATTRIBUTE               0x07
  19. #define REVERSE_VIDEO                  0x70
  20. #define ROWS_PER_MENU_HEADER           5
  21. #define ROWS_PER_PAGE                  24
  22. /*+-------------------------------------------------------------------------+
  23.   |                                                                         |
  24.   |                                 Types                                   |
  25.   |                                                                         |
  26.   +-------------------------------------------------------------------------+*/
  27. Type char                              line_type[COLUMNS_PER_ROW];
  28. Type line_type                         page_type[ROWS_PER_PAGE];
  29. Structure slide_struct
  30.  BeginStructure
  31.   char                                 title[COLUMNS_PER_TITLE];
  32.   page_type                            screen;
  33.  EndStructure;
  34. Type Structure slide_struct            slide_type;
  35. /*+-------------------------------------------------------------------------+
  36.   |                                                                         |
  37.   |                               Prototypes                                |
  38.   |                                                                         |
  39.   +-------------------------------------------------------------------------+*/
  40. bit_16
  41.        get_key                         (void);
  42. bit_16
  43.        get_slide                       (bit_16 slide_num);
  44. bit_16
  45.        get_title                       (bit_16 slide_num);
  46. void
  47.        main                            (bit_16 argc,
  48.                                         char *argv[]);
  49. bit_16
  50.        menu                            (bit_16 slide_num);
  51. void
  52.        menu_header                     (void);
  53. void
  54.        menu_line                       (bit_16 line_num,
  55.                                         int    video_attr);
  56. void
  57.        menu_page                       (bit_16 slide_num);
  58. void
  59.        show_slide                      (void);
  60. char
  61.       *string                          (char *s,
  62.                                         bit_16 length);
  63. /*+-------------------------------------------------------------------------+
  64.   |                                                                         |
  65.   |                            Global Variables                             |
  66.   |                                                                         |
  67.   +-------------------------------------------------------------------------+*/
  68. union REGS                             dos_inregs;
  69. union REGS                             dos_outregs;
  70. bit_16                                 highest_slide_number_on_menu;
  71. bit_16                                 lowest_slide_number_on_menu;
  72. slide_type                             slide;
  73. FILE                                  *slide_input_file;
  74. char                                  *slide_input_file_name;
  75. bit_16                                 slide_number;
  76. char                                   temp_string[1024];
  77. int                                    text_attribute;
  78. /*+-------------------------------------------------------------------------+
  79.   |                                                                         |
  80.   |                                main                                     |
  81.   |                                                                         |
  82.   +-------------------------------------------------------------------------+*/
  83. void main(bit_16 argc, char *argv[])
  84. BeginDeclarations
  85. bit_16                                 function;
  86. bit_16                                 i;
  87. EndDeclarations
  88. BeginCode
  89.  clrscr();
  90.  If argc IsNot 2
  91.   Then
  92.    printf("Usage:\n");
  93.    printf("\n");
  94.    printf("  SLSHOW slideset\n");
  95.    printf("\n");
  96.    printf("    Where \"slideset\" is the name of a slide set file created\n");
  97.    printf("    by the SLCOMP program.\n");
  98.    printf("\n");
  99.    exit(1);
  100.   EndIf;
  101.  slide_input_file_name = argv[1];
  102.  slide_input_file = fopen(argv[1], "rb");
  103.  If slide_input_file IsNull
  104.   Then
  105.    printf("Could not open file \"%s\" for input.\n", argv[1]);
  106.    printf("\n");
  107.    exit(4);
  108.   EndIf;
  109.  slide_number = menu(1);
  110.  show_slide();
  111.  function = get_key();
  112.  Loop
  113.   BeginLoop
  114.    show_slide();
  115.    Using function
  116.     BeginCase
  117.      When 0x0D:
  118.      When 0x10D:  /* Enter */
  119.       slide_number = menu(slide_number);
  120.       show_slide();
  121.       break;
  122.      When 0x1B:   /* Esc */
  123.       clrscr();
  124.       break;
  125.      When 0x148:  /* Cursor Up */
  126.       If slide_number Is 1
  127.        Then
  128.         putch('\a');
  129.        Else
  130.         get_slide(slide_number-1);
  131.         show_slide();
  132.        EndIf;
  133.       break;
  134.      When 0x150: /* Cursor Down */
  135.       i = slide_number;
  136.       get_slide(slide_number+1);
  137.       If slide_number IsZero
  138.        Then
  139.         get_slide(i);
  140.         putch('\a');
  141.        Else
  142.         show_slide();
  143.        EndIf;
  144.       break;
  145.      Otherwise:
  146.       putch('\a');
  147.       break;
  148.     EndCase;
  149.    ExitIf(function Is 0x1B);
  150.    function = get_key();
  151.    EndLoop;
  152.  fclose(slide_input_file);
  153.  exit(0);
  154. EndCode
  155. /*+-------------------------------------------------------------------------+
  156.   |                                                                         |
  157.   |                                get_key                                  |
  158.   |                                                                         |
  159.   +-------------------------------------------------------------------------+*/
  160. bit_16 get_key()
  161. BeginDeclarations
  162. bit_16                                 key;
  163. EndDeclarations
  164. BeginCode
  165.  dos_inregs.h.ah = 0x08;
  166.  intdos(Addr(dos_inregs), Addr(dos_outregs));
  167.  If dos_outregs.h.al IsZero
  168.   Then
  169.    key = 256;
  170.    intdos(Addr(dos_inregs), Addr(dos_outregs));
  171.   Else
  172.    key = 0;
  173.   EndIf;
  174.  key += Bit_16(dos_outregs.h.al);
  175.  return(key);
  176. EndCode
  177. /*+-------------------------------------------------------------------------+
  178.   |                                                                         |
  179.   |                               get_slide                                 |
  180.   |                                                                         |
  181.   +-------------------------------------------------------------------------+*/
  182. bit_16 get_slide(bit_16 slide_num)
  183. BeginDeclarations
  184. bit_16                                 item_count;
  185. bit_16                                 slide_found;
  186. fpos_t                                 slide_position;
  187. EndDeclarations
  188. BeginCode
  189.  slide_position = Bit_32(slide_num-1) * Bit_32(sizeof(slide_type));
  190.  fsetpos(slide_input_file, Addr(slide_position));
  191.  item_count = fread(Addr(slide), sizeof(slide_type), 1, slide_input_file);
  192.  slide_found = item_count Is 1;
  193.  If slide_found
  194.   Then
  195.    slide_number = slide_num;
  196.   Else
  197.    slide_number = 0;
  198.   EndIf;
  199.  return(slide_found);
  200. EndCode
  201. /*+-------------------------------------------------------------------------+
  202.   |                                                                         |
  203.   |                               get_title                                 |
  204.   |                                                                         |
  205.   +-------------------------------------------------------------------------+*/
  206. bit_16 get_title(bit_16 slide_num)
  207. BeginDeclarations
  208. bit_16                                 item_count;
  209. bit_16                                 slide_found;
  210. fpos_t                                 slide_position;
  211. EndDeclarations
  212. BeginCode
  213.  slide_position = Bit_32(slide_num-1) * Bit_32(sizeof(slide_type));
  214.  fsetpos(slide_input_file, Addr(slide_position));
  215.  item_count = fread(Addr(slide), COLUMNS_PER_TITLE, 1, slide_input_file);
  216.  slide_found = item_count Is 1;
  217.  If slide_found
  218.   Then
  219.    slide_number = slide_num;
  220.   Else
  221.    slide_number = 0;
  222.   EndIf;
  223.  return(slide_found);
  224. EndCode
  225. /*+-------------------------------------------------------------------------+
  226.   |                                                                         |
  227.   |                                  menu                                   |
  228.   |                                                                         |
  229.   +-------------------------------------------------------------------------+*/
  230. bit_16 menu(bit_16 slide_num)
  231. BeginDeclarations
  232. bit_16                                 current_index;
  233. int                                    function;
  234. EndDeclarations
  235. BeginCode
  236.  menu_header();
  237.  menu_page(slide_num);
  238.  If lowest_slide_number_on_menu IsZero
  239.   Then
  240.    slide_num = 1;
  241.    menu_page(slide_num);
  242.    If lowest_slide_number_on_menu IsZero
  243.     Then
  244.      clrscr();
  245.      printf("Error:  No slides in file \"%s\".\n", slide_input_file_name);
  246.      exit(4);
  247.     EndIf;
  248.   EndIf;
  249.  current_index = 0;
  250.  function = get_key();
  251.  Loop
  252.   BeginLoop
  253.    Using function
  254.     BeginCase
  255.      When 0x0D:
  256.      When 0x10D:  /* Enter */
  257.       break;
  258.      When 0x148:  /* Cursor Up */
  259.       If current_index IsZero
  260.        Then
  261.         If lowest_slide_number_on_menu Exceeds 1
  262.          Then
  263.           menu_page(lowest_slide_number_on_menu-1);
  264.           current_index = 0;
  265.          Else
  266.           putch('\a');
  267.          EndIf;
  268.        Else
  269.         get_title(lowest_slide_number_on_menu + current_index);
  270.         menu_line(current_index+1, NORMAL_ATTRIBUTE);
  271.         current_index--;
  272.         get_title(lowest_slide_number_on_menu + current_index);
  273.         menu_line(current_index+1, REVERSE_VIDEO);
  274.         textattr(NORMAL_ATTRIBUTE);
  275.        EndIf;
  276.       break;
  277.      When 0x149:  /* PgUp */
  278.       If lowest_slide_number_on_menu Exceeds 1
  279.        Then
  280.         If lowest_slide_number_on_menu Exceeds MENU_ITEMS
  281.          Then
  282.           slide_num -= MENU_ITEMS;
  283.          Else
  284.           slide_num = 1;
  285.          EndIf;
  286.         menu_page(slide_num);
  287.         current_index = 0;
  288.        Else
  289.         putch('\a');
  290.        EndIf;
  291.       break;
  292.      When 0x150:  /* Cursor Down */
  293.       If lowest_slide_number_on_menu + current_index Is
  294.          highest_slide_number_on_menu
  295.        Then
  296.         get_title(highest_slide_number_on_menu+1);
  297.         If slide_number IsNotZero
  298.          Then
  299.           slide_num = highest_slide_number_on_menu+1;
  300.           menu_page(slide_num);
  301.           current_index = 0;
  302.          Else
  303.           putch('\a');
  304.          EndIf;
  305.        Else
  306.         get_title(lowest_slide_number_on_menu + current_index);
  307.         menu_line(current_index+1, NORMAL_ATTRIBUTE);
  308.         current_index++;
  309.         get_title(lowest_slide_number_on_menu + current_index);
  310.         menu_line(current_index+1, REVERSE_VIDEO);
  311.        EndIf;
  312.       break;
  313.      When 0x151:  /* PgDn */
  314.       get_title(highest_slide_number_on_menu+1);
  315.       If slide_number IsNotZero
  316.        Then
  317.         slide_num = highest_slide_number_on_menu+1;
  318.         menu_page(slide_num);
  319.         current_index = 0;
  320.        Else
  321.         putch('\a');
  322.        EndIf;
  323.       break;
  324.      Otherwise:
  325.       putch('\a');
  326.       break;
  327.     EndCase;
  328.    ExitIf((function Is 0x0D) OrIf (function Is 0x10D));
  329.    function = get_key();
  330.   EndLoop;
  331.  get_slide(lowest_slide_number_on_menu + current_index);
  332.  return(slide_number);
  333. EndCode
  334. /*+-------------------------------------------------------------------------+
  335.   |                                                                         |
  336.   |                              menu_header                                |
  337.   |                                                                         |
  338.   +-------------------------------------------------------------------------+*/
  339. void menu_header()
  340. BeginDeclarations
  341. EndDeclarations
  342. BeginCode
  343.  clrscr();
  344.  gotoxy(36,1);
  345.  cprintf("Slide Menu");
  346.  gotoxy(1,3);
  347.  cprintf("File:  %s", slide_input_file_name);
  348.  gotoxy(1, 5);
  349.  cprintf("Slide Number  ------------------------Slide Title"
  350.                        "-------------------------");
  351.  return;
  352. EndCode
  353. /*+-------------------------------------------------------------------------+
  354.   |                                                                         |
  355.   |                               menu_line                                 |
  356.   |                                                                         |
  357.   +-------------------------------------------------------------------------+*/
  358. void menu_line(bit_16 line_num, int video_attr)
  359. BeginDeclarations
  360. EndDeclarations
  361. BeginCode
  362.  text_attribute = video_attr;
  363.  textattr(text_attribute);
  364.  gotoxy(1, line_num + ROWS_PER_MENU_HEADER);
  365.  If slide_number IsZero
  366.   Then
  367.    clreol();
  368.    return;
  369.   EndIf;
  370.  cprintf("    %3u       %s", slide_number,
  371.                              string(slide.title, COLUMNS_PER_TITLE));
  372.  return;
  373. EndCode
  374. /*+-------------------------------------------------------------------------+
  375.   |                                                                         |
  376.   |                               menu_page                                 |
  377.   |                                                                         |
  378.   +-------------------------------------------------------------------------+*/
  379. void menu_page(bit_16 slide_num)
  380. BeginDeclarations
  381. bit_16                                 i;
  382. EndDeclarations
  383. BeginCode
  384.  lowest_slide_number_on_menu  =
  385.  highest_slide_number_on_menu = 0;
  386.  For i=0; i LessThan MENU_ITEMS; i++
  387.   BeginFor
  388.    get_title(slide_num+i);
  389.    If slide_number IsNotZero
  390.     Then
  391.      If i IsZero
  392.       Then
  393.        lowest_slide_number_on_menu = slide_num;
  394.       EndIf;
  395.      highest_slide_number_on_menu = slide_num + i;
  396.     EndIf;
  397.    If i IsZero
  398.     Then
  399.      menu_line(i+1, REVERSE_VIDEO);
  400.     Else
  401.      menu_line(i+1, NORMAL_ATTRIBUTE);
  402.     EndIf;
  403.   EndFor;
  404.  return;
  405. EndCode
  406. /*+-------------------------------------------------------------------------+
  407.   |                                                                         |
  408.   |                              show_slide                                 |
  409.   |                                                                         |
  410.   +-------------------------------------------------------------------------+*/
  411. void show_slide()
  412. BeginDeclarations
  413. bit_16                                 row;
  414. EndDeclarations
  415. BeginCode
  416.  text_attribute = NORMAL_ATTRIBUTE;
  417.  textattr(text_attribute);
  418.  clrscr();
  419.  For row=0; row LessThan ROWS_PER_PAGE; row++
  420.   BeginFor
  421.    gotoxy(1,row+1);
  422.    cprintf("%s", string(slide.screen[row], COLUMNS_PER_ROW));
  423.   EndFor;
  424.  gotoxy(1, ROWS_PER_PAGE + 1);
  425.  clreol();
  426.  cprintf("Slide:  %u", slide_number);
  427.  gotoxy(COLUMNS_PER_ROW - COLUMNS_PER_TITLE, ROWS_PER_PAGE + 1);
  428.  cprintf("%s", string(slide.title, COLUMNS_PER_TITLE));
  429.  return;
  430. EndCode
  431. /*+-------------------------------------------------------------------------+
  432.   |                                                                         |
  433.   |                                 string                                  |
  434.   |                                                                         |
  435.   +-------------------------------------------------------------------------+*/
  436. char *string(char *s, bit_16 length)
  437. BeginDeclarations
  438. EndDeclarations
  439. BeginCode
  440.  memmove(temp_string, s, length);
  441.  temp_string[length] = '\000';
  442.  return(temp_string);
  443. EndCode
  444.