home *** CD-ROM | disk | FTP | other *** search
/ Dream 45 / Amiga_Dream_45.iso / Atari / Graphics / gemgs13.zoo / gemgs.c next >
C/C++ Source or Header  |  1992-11-22  |  34KB  |  1,429 lines

  1. /*
  2.  * Gem shell for ghostscript.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <osbind.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <dirent.h>
  12. #include "objects.h"
  13. #include "keys.h"
  14. #include "ps.h"
  15.  
  16. #define MAXLEN        80
  17. #define MAXSTR        30
  18. #define CONFIGFILE    "gemgs.rc"
  19. #define PAGEFILE    "pspage.ps"
  20.  
  21. char command[2*MAXLEN]="";    /* command line for programs to be executed */
  22. char device[MAXLEN]="";        /* name of current device */
  23. char res[MAXLEN]="";        /* string containing current resolution */
  24. char geometry[MAXLEN]="";    /* geometry string */
  25. char tempgeom[MAXLEN];        /* temporary geometry string */
  26. char clist[MAXLEN]="";        /* clist string */
  27. char tempclist[MAXLEN]="";    /* temporary clist string */
  28.  
  29. char pages[MAXLEN];        /* string holding page selections */
  30. char configfile[MAXLEN];    /* name of configuration file */
  31.  
  32. char devmenu[9][MAXLEN];    /* entries in the device menu */
  33. char resmenu[9][MAXLEN];    /* entries in the resolution menu */
  34. char toolmenu[10][MAXLEN];    /* entries in the tool menu */
  35.  
  36. char toolexec[MAXLEN];        /* name of tool to be executed */
  37. char temptool[2*MAXLEN];    /* string for tool dialog */
  38. char toolcom[10][MAXLEN];    /* commands for toolmenu selections */
  39. char envvar[MAXSTR][MAXLEN];    /* storage for environment variables */
  40.  
  41. char line[2*MAXLEN];        /* general use string buffer */
  42.  
  43. char *commtitle[2] = {"Ghostscript Command Line",  /* title strings for */
  44.               "    Tool Parameters     "}; /* command param. dialogs */
  45.  
  46. char *othertitle[4] = {"  Device:  ",    /* title strings for a    */
  47.                "Resolution:",   /* generic dialog    */
  48.                " Geometry: ",
  49.                "Clist Size:"};
  50.  
  51. char *sptr;                    /* general use pointer */
  52. char home_dir[MAXLEN]="";            /* dir gemgs run from */
  53. char current_dir[MAXLEN]="";            /* current directory */
  54.  
  55. char infile[MAXLEN]="";                /* input file */
  56. char outfile[MAXLEN]="";            /* output file */
  57. char toolfile[MAXLEN]="";            /* file selected for tool */
  58.  
  59. char papersize[MAXLEN]="";            /* papersize */
  60.  
  61. int dev_checked=FIRSTDEV+1;    /* select first device by default */
  62. int res_checked=FIRSTRES+1;    /* select first resolution by default */
  63. int size_checked=FIRSTSIZE+1;    /* select first pagesize by default */
  64.  
  65. int i, j, ret, tool, exit_obj, win_dev=0;    /* general variables */
  66.  
  67. GRECT full;                    /* GEM related variables */
  68. int x_res, y_res, color_bits;        
  69. int cx, cy, cw, ch;
  70. int gem_handle, vdi_handle;
  71. int wchar, hchar, wbox, hbox;
  72. int work_in[11], work_out[57], pxy[4];
  73.  
  74. int confirm=1, quiet=1, nopause=1;        /* default options */
  75. int autoquit=1, pageselect=0, windows=0;
  76. int autorun=0;
  77.  
  78. FILE *pagein, *pageout;            /* variables used in page selection */
  79. int numpages, up_count, up_max;
  80. int lastbut, page_flag[10], inchanged=0;
  81. struct document *docinfo=NULL, *psscan();
  82.  
  83. main(int argc, char **argv, char **envp)
  84. {
  85.     OBJECT *object;                /* general object pointer */
  86.  
  87.     char dir_spec[MAXLEN], file_sel[MAXLEN];    /* used for file selector */
  88.  
  89.     char *toolptr, *presub(), *pathfind();
  90.     int quit, len, pause, gemtool, changed=1;
  91.  
  92.     int msgbuff[8], exit_but;        /* GEM related variables */
  93.     int mx, my, mb, mk, key, clicks;
  94.     int wait_event, event, button_state, menuitem=0;
  95.  
  96.     /* Append all the command line files together. */
  97.  
  98.     if (argc >= 2) {
  99.     strcpy(infile, argv[1]);
  100.     }
  101.  
  102.     for(i=2; i<argc; i++) {
  103.     strcat(infile, " ");
  104.     strcat(infile, argv[i]);
  105.     }
  106.  
  107.     /* GEM initialization */
  108.  
  109.     init();
  110.  
  111.     if (autorun) {            /* fake menu events for hot keys */
  112.     menuitem = RUN;
  113.     }
  114.  
  115.     wait_event = MU_MESAG | MU_KEYBD;
  116.     button_state = 1;
  117.  
  118.     /* Main event loop */
  119.  
  120.     for (quit=0; !quit;) {
  121.  
  122.     if (menuitem) {            /* fake menu events for hot keys */
  123.         event = MU_MESAG;
  124.         msgbuff[0] = MN_SELECTED;
  125.         msgbuff[4] = menuitem;
  126.         menuitem = 0;
  127.     }
  128.     else {
  129.         event = evnt_multi(wait_event, 2, 2, button_state,
  130.         1, mx, my, 1, 1, 0, 0, 0, 0, 0,
  131.         msgbuff, 0L, &mx, &my, &mb, &mk,
  132.         &key, &clicks);
  133.     }
  134.  
  135.     if (event & MU_KEYBD) {        /* hot keys for menus */
  136.  
  137.         if (key == ALT_R) {
  138.         menuitem = RUN;
  139.         }
  140.         else if (key == ALT_I) {
  141.         menuitem = INPUT;
  142.         }
  143.         else if (key == ALT_O) {
  144.         menuitem = OUTPUT;
  145.         }
  146.         else if (key == ALT_Q) {
  147.         menuitem = QUIT;
  148.         }
  149.         else if (key == ALT_G) {
  150.         menuitem = GEOMETRY;
  151.         }
  152.         else if (key == ALT_C) {
  153.         menuitem = CLIST;
  154.         }
  155.         else if (key == ALT_P) {
  156.         menuitem = PAGE;
  157.         }
  158.  
  159.     }
  160.  
  161.     if (event & MU_MESAG) {
  162.  
  163.         switch (msgbuff[0]) {
  164.  
  165.         case MN_SELECTED:
  166.         if (msgbuff[3] != -1) {
  167.             menu_tnormal(menubar, msgbuff[3], 1);
  168.         }
  169.  
  170.         switch (msgbuff[4]) {
  171.  
  172.         case ABOUT:    /* display "about" dialog */
  173.             exit_obj = dialog(about);
  174.             break;
  175.  
  176.         case RUN:    /* build command line and execute GS */
  177.             if (changed) {
  178.             strcpy(command, "gs.ttp ");
  179.  
  180.             if (quiet || (windows && win_dev)) {
  181.                 strcat(command, "-q ");
  182.             }
  183.  
  184.             if (nopause || (windows && win_dev)) {
  185.                 strcat(command, "-dNOPAUSE ");
  186.             }
  187.  
  188.             if (strlen(clist) && !win_dev) {
  189.                 strcat(command, "-dBufferSize=");
  190.                 strcat(command, clist);
  191.                 strcat(command, " ");
  192.             }
  193.  
  194.             if (strlen(device) && strcmp(device, "stvdi")) {
  195.                 strcat(command, "-sDEVICE=");
  196.                 strcat(command, device);
  197.                 strcat(command, " ");
  198.             }
  199.  
  200.             if (strlen(papersize) && strcmp(papersize, "Default")) {
  201.                 strcat(command, "-sPAPERSIZE=");
  202.                 strcat(command, papersize);
  203.                 strcat(command, " ");
  204.             }
  205.  
  206.             if (strlen(res) && strcmp(res, "Default")) {
  207.                 strcat(command, "-r");
  208.                 strcat(command, res);
  209.                 strcat(command, " ");
  210.             }
  211.  
  212.             if (strlen(geometry)) {
  213.                 strcat(command, "-g");
  214.                 strcat(command, geometry);
  215.                 strcat(command, " ");
  216.             }
  217.  
  218.             if (strlen(outfile)) {
  219.                 strcat(command, "-sOUTPUTFILE=");
  220.                 strcat(command, outfile);
  221.                 strcat(command, " ");
  222.             }
  223.  
  224.             if (pageselect) {
  225.                 strcat(command, PAGEFILE);
  226.                 strcat(command, " ");
  227.             }
  228.             else if (strlen(infile)) {
  229.                 strcat(command, infile);
  230.                 strcat(command, " ");
  231.             }
  232.  
  233.             if (autoquit || (windows && win_dev)) {
  234.                 strcat(command, "quit.ps");
  235.             }
  236.  
  237.             changed = 0;
  238.             }
  239.  
  240.             if (confirm && !autorun) {
  241.             commtedinf.te_ptext = command;
  242.             commline[1].ob_spec = UL commtitle[0];
  243.             if ((exit_obj = dialog(commline)) == RUN_CANCEL) {
  244.                 changed = 1;
  245.                 break;
  246.             }
  247.             }
  248.  
  249.             if (!windows) {    /* clear screen if using windows */
  250.             v_enter_cur(vdi_handle);
  251.             }
  252.             else {        /* turn menu off and busy bee on */
  253.             menu_bar(menubar, 0);
  254.             graf_mouse(BUSY_BEE, 0L);
  255.             }
  256.  
  257.             /* Execute GS */
  258.  
  259.              ret = system(command);
  260.  
  261.             /* Turn off the cursor, restore the desktop
  262.              * background, and then restore the menu bar.
  263.              */
  264.  
  265.             restore_bg();
  266.             menu_bar(menubar, 1);
  267.  
  268.             if (ret < 0) {
  269.             sprintf(line, "[1][Could not execute %s!][OK]", "gs.ttp");
  270.             form_alert(1, line);
  271.             }
  272.  
  273.             if (autorun) autorun = 0;    /* turn off autorun */
  274.  
  275.             break;
  276.  
  277.         case INPUT:
  278.             sprintf(dir_spec, "%s%s", current_dir, "*.PS");
  279.  
  280.             /* If a single input file has been specified,
  281.              * make it the default selection. If more than
  282.              * one input file exists, or no input is selected,
  283.              * use no default.
  284.              */
  285.  
  286.             if (strlen(infile) &&
  287.             ((sptr = strchr(infile, ' ')) == NULL)) {
  288.  
  289.             if ((sptr = strrchr(infile, '\\')) == NULL)
  290.                 strcpy(file_sel, infile);
  291.             else {
  292.                 strcpy(file_sel, ++sptr);
  293.             }
  294.             }
  295.             else {
  296.             strcpy(file_sel, "");
  297.             }
  298.  
  299.             ret = fsel_input(dir_spec, file_sel, &exit_but);
  300.  
  301.             if (exit_but) {
  302.             if (strlen(file_sel)) {
  303.                 sptr = strrchr(dir_spec, '\\');
  304.                 *++sptr = '\0';
  305.                 strcpy(current_dir, dir_spec);
  306.                 strcpy(infile, dir_spec);
  307.                 strcat(infile, file_sel);
  308.             }
  309.             else {
  310.                 strcpy(infile, "");
  311.             }
  312.  
  313.             changed = 1;
  314.             inchanged = 1;
  315.             }
  316.  
  317.             break;
  318.  
  319.         case OUTPUT:
  320.             exit_obj = dialog(output);
  321.  
  322.             switch (exit_obj) {
  323.  
  324.             case CEN_BUT:    /* directly to centronics port */
  325.             strcpy(outfile, "CEN:");
  326.             break;
  327.  
  328.             case PRN_BUT:    /* centronics port via gemdos */
  329.             strcpy(outfile, "PRN:");
  330.             break;
  331.  
  332.             case FILE_BUT:    /* output to 'outfile' */
  333.             if (!strlen(home_dir)) {
  334.                 strcpy(home_dir, current_dir);
  335.             }
  336.  
  337.             sprintf(dir_spec, "%s%s", home_dir, "*.*");
  338.             len = strlen(outfile);
  339.  
  340.             /* Use any selected output file as the default */
  341.  
  342.             if (len != 0 && outfile[len-1] != ':') {
  343.                 if ((sptr = strrchr(outfile, '\\')) == NULL)
  344.                     strcpy(file_sel, outfile);
  345.                 else {
  346.                 strcpy(file_sel, ++sptr);
  347.                 }
  348.             }
  349.             else {
  350.                 strcpy(file_sel, "");
  351.             }
  352.  
  353.             ret = fsel_input(dir_spec, file_sel, &exit_but);
  354.  
  355.             if (exit_but) {
  356.                 if (strlen(file_sel)) {
  357.                     sptr = strrchr(dir_spec, '\\');
  358.                     *++sptr = '\0';
  359.                     strcpy(current_dir, dir_spec);
  360.                     strcpy(outfile, dir_spec);
  361.                     strcat(outfile, file_sel);
  362.                 }
  363.                 else {
  364.                 strcpy(outfile, "");
  365.                 }
  366.             }
  367.  
  368.             break;
  369.             }
  370.  
  371.             changed = 1;
  372.             break;
  373.  
  374.         case QUIT:
  375.             if (access(PAGEFILE, 0) == 0) {
  376.             unlink(PAGEFILE);
  377.             }
  378.  
  379.             v_clsvwk(vdi_handle);
  380.             appl_exit();
  381.             quit = 1;
  382.             break;
  383.  
  384.         case FIRSTDEV+1: case FIRSTDEV+2: case FIRSTDEV+3:
  385.         case FIRSTDEV+4: case FIRSTDEV+5: case FIRSTDEV+6:
  386.         case FIRSTDEV+7: case FIRSTDEV+8: case FIRSTDEV+9:
  387.  
  388.             /* Set the selected device and check/enable the
  389.              * appropriate menu items.
  390.              */
  391.  
  392.             menu_icheck(menubar, dev_checked, 0);
  393.             dev_checked = msgbuff[4];
  394.             menu_icheck(menubar, dev_checked, 1);
  395.  
  396.             object = &menubar[dev_checked];
  397.             strcpy(device, (char *)(object->ob_spec + 2));
  398.  
  399.             if (!strcmp(device, "stvdi")) {
  400.             win_dev = 1;
  401.             menu_ienable(menubar, WINDOWS, 1);
  402.             menu_ienable(menubar, CLIST, 0);
  403.             }
  404.             else {
  405.             win_dev = 0;
  406.             menu_ienable(menubar, WINDOWS, 0);
  407.             menu_ienable(menubar, CLIST, 1);
  408.             }
  409.  
  410.             changed = 1;
  411.             break;
  412.  
  413.         case LASTDEV:
  414.             /* Display a dialog to let the user enter the
  415.              * device by hand
  416.              */
  417.  
  418.             othertedinf.te_ptext = devmenu[8];
  419.             other[1].ob_spec = UL othertitle[0];
  420.  
  421.             if ((exit_obj = dialog(other)) == OTHER_OK) {
  422.                 strcpy(device, devmenu[8]);
  423.  
  424.             if (strlen(device)) {
  425.                 menu_icheck(menubar, dev_checked, 0);
  426.                 dev_checked = msgbuff[4];
  427.                 menu_icheck(menubar, dev_checked, 1);
  428.  
  429.                 if (!strcmp(device, "stvdi")) {
  430.                 win_dev = 1;
  431.                 menu_ienable(menubar, WINDOWS, 1);
  432.                 menu_ienable(menubar, CLIST, 0);
  433.                 }
  434.                 else {
  435.                 win_dev = 0;
  436.                 menu_ienable(menubar, WINDOWS, 0);
  437.                 menu_ienable(menubar, CLIST, 1);
  438.                 }
  439.  
  440.             }
  441.             else {        /* use default */
  442.                 menu_icheck(menubar, dev_checked, 0);
  443.                 dev_checked = FIRSTDEV+1;
  444.                 menu_icheck(menubar, dev_checked, 1);
  445.                 win_dev = 1;
  446.                 menu_ienable(menubar, WINDOWS, 1);
  447.                 menu_ienable(menubar, CLIST, 0);
  448.             }
  449.  
  450.                 changed = 1;
  451.  
  452.             }
  453.  
  454.             break;
  455.  
  456.         case FIRSTRES+1: case FIRSTRES+2: case FIRSTRES+3:
  457.         case FIRSTRES+4: case FIRSTRES+5: case FIRSTRES+6:
  458.         case FIRSTRES+7: case FIRSTRES+8: case FIRSTRES+9:
  459.  
  460.             /* Set the selected resolution and check/enable
  461.              * the appropriate menu items
  462.              */
  463.  
  464.             menu_icheck(menubar, res_checked, 0);
  465.             res_checked = msgbuff[4];
  466.             menu_icheck(menubar, res_checked, 1);
  467.  
  468.             object = &menubar[msgbuff[4]];
  469.             strcpy(res, (char *)(object->ob_spec + 2));
  470.             changed = 1;
  471.             break;
  472.  
  473.         case LASTRES:
  474.             /* Display a dialog to let the user enter the
  475.              * resolution by hand
  476.              */
  477.  
  478.             othertedinf.te_ptext = resmenu[8];
  479.             other[1].ob_spec = UL othertitle[1];
  480.  
  481.             if ((exit_obj = dialog(other)) == OTHER_OK) {
  482.                 strcpy(res, resmenu[8]);
  483.  
  484.             if (strlen(res)) {
  485.                 menu_icheck(menubar, res_checked, 0);
  486.                 res_checked = msgbuff[4];
  487.                 menu_icheck(menubar, res_checked, 1);
  488.             }
  489.             else {
  490.                 menu_icheck(menubar, res_checked, 0);
  491.                 res_checked = FIRSTRES+1;
  492.                 menu_icheck(menubar, res_checked, 1);
  493.             }
  494.  
  495.                 changed = 1;
  496.             }
  497.             break;
  498.  
  499.         case FIRSTSIZE+1: case FIRSTSIZE+2: case FIRSTSIZE+3:
  500.         case FIRSTSIZE+4: case FIRSTSIZE+5: case FIRSTSIZE+6:
  501.         case FIRSTSIZE+7: case FIRSTSIZE+8: case FIRSTSIZE+9:
  502.         case FIRSTSIZE+10: case FIRSTSIZE+11: case FIRSTSIZE+12:
  503.         case FIRSTSIZE+13: case FIRSTSIZE+14:
  504.  
  505.             /* Set the selected page size and check/enable
  506.              * the appropriate menu item
  507.              */
  508.  
  509.             menu_icheck(menubar, size_checked, 0);
  510.             size_checked = msgbuff[4];
  511.             menu_icheck(menubar, size_checked, 1);
  512.  
  513.             object = &menubar[msgbuff[4]];
  514.             strcpy(papersize, (char *)(object->ob_spec + 2));
  515.             changed = 1;
  516.             break;
  517.  
  518.         case CONFIRM:
  519.             menu_icheck(menubar, msgbuff[4], !confirm);
  520.             confirm = !confirm;
  521.             changed = 1;
  522.             break;
  523.  
  524.         case QUIET:
  525.             menu_icheck(menubar, msgbuff[4], !quiet);
  526.             quiet = !quiet;
  527.             changed = 1;
  528.             break;
  529.  
  530.         case NOPAUSE:
  531.             menu_icheck(menubar, msgbuff[4], !nopause);
  532.             nopause = !nopause;
  533.             changed = 1;
  534.             break;
  535.  
  536.         case AUTOQUIT:
  537.             menu_icheck(menubar, msgbuff[4], !autoquit);
  538.             autoquit = !autoquit;
  539.             changed = 1;
  540.             break;
  541.  
  542.         case WINDOWS:
  543.             menu_icheck(menubar, msgbuff[4], !windows);
  544.             windows = !windows;
  545.  
  546.             /* If windows are selected, set the GS_WIN environment
  547.              * variable that instructs ghostscript to use windows.
  548.              */
  549.  
  550.             if (windows) {
  551.             ret = putenv("GS_WIN=batch");
  552.             }
  553.             else {
  554.             ret = putenv("GS_WIN=off");
  555.             }
  556.  
  557.             changed = 1;
  558.             break;
  559.  
  560.         case GEOMETRY:
  561.             /* Display a dialog that allows the gemometry to
  562.              * be entered by hand.
  563.              */
  564.  
  565.             othertedinf.te_ptext = tempgeom;
  566.             other[1].ob_spec = UL othertitle[2];
  567.  
  568.             if ((exit_obj = dialog(other)) == OTHER_OK) {
  569.                 strcpy(geometry, tempgeom);
  570.  
  571.             if (strlen(geometry)) {
  572.                 menu_icheck(menubar, msgbuff[4], 1);
  573.             }
  574.             else {
  575.                 menu_icheck(menubar, msgbuff[4], 0);
  576.             }
  577.  
  578.             changed = 1;
  579.             }
  580.             break;
  581.  
  582.         case CLIST:
  583.             /* Display a dialog that allows the size of the
  584.              * clist buffer to be entered by hand.
  585.              */
  586.  
  587.             othertedinf.te_ptext = tempclist;
  588.             other[1].ob_spec = UL othertitle[3];
  589.  
  590.             if ((exit_obj = dialog(other)) == OTHER_OK) {
  591.                 strcpy(clist, tempclist);
  592.  
  593.             if (strlen(clist)) {
  594.                 menu_icheck(menubar, msgbuff[4], 1);
  595.             }
  596.             else {
  597.                 menu_icheck(menubar, msgbuff[4], 0);
  598.             }
  599.  
  600.             changed = 1;
  601.             }
  602.  
  603.             break;
  604.  
  605.         case PAGE:
  606.             /* Display a dialog that allows specific pages
  607.              * in a document to be rendered individually.
  608.              */
  609.  
  610.             pagetedinf.te_ptext = pages;
  611.  
  612.             /* If no input file is selected, open a file selector. */
  613.  
  614.             if (!strlen(infile)) {
  615.             sprintf(dir_spec, "%s%s", current_dir, "*.PS");
  616.             strcpy(file_sel, "");
  617.             ret = fsel_input(dir_spec, file_sel, &exit_but);
  618.  
  619.             if (exit_but) {
  620.                 if (strlen(file_sel)) {
  621.                 sptr = strrchr(dir_spec, '\\');
  622.                 *++sptr = '\0';
  623.                 strcpy(current_dir, dir_spec);
  624.                 strcpy(infile, dir_spec);
  625.                 strcat(infile, file_sel);
  626.                 }
  627.                 else {
  628.                 break;
  629.                 }
  630.  
  631.             }
  632.  
  633.             }
  634.  
  635.             if ((sptr = pathfind("GS_LIB", infile, ",")) == NULL) {
  636.             sprintf(line, "[1][Could not find %s!][OK]", infile);
  637.             form_alert(1, line);
  638.             break;
  639.             }
  640.             else if ((pagein = fopen(sptr, "r")) == NULL) {
  641.             sprintf(line, "[1][Could not open %s!][OK]", sptr);
  642.             form_alert(1, line);
  643.             break;
  644.             }
  645.  
  646.             graf_mouse(BUSY_BEE, 0L);
  647.  
  648.             /* If the input file has not been scanned, search it
  649.              * for page information.
  650.              */
  651.  
  652.             if (docinfo == NULL || inchanged) {
  653.             docinfo = psscan(pagein);
  654.             }
  655.  
  656.             if (docinfo == NULL || docinfo->numpages == 0
  657.             || docinfo->pageorder == SPECIAL) {
  658.  
  659.             sprintf(line, "[1][%s|%s|%s|%s][OK]",
  660.                 "Page information cannot be",
  661.                 "extracted from this file.",
  662.                 "It probably does not conform",
  663.                 "to Adobe structuring conventions.");
  664.  
  665.             graf_mouse(ARROW, 0L);
  666.             form_alert(1, line);
  667.             pageselect = 0;
  668.             menu_icheck(menubar, msgbuff[4], 0);
  669.             break;
  670.             }
  671.  
  672.             fclose(pagein);
  673.  
  674.             graf_mouse(ARROW, 0L);
  675.  
  676.             numpages = docinfo->numpages;
  677.  
  678.             /* If page information has been successfully
  679.              * extracted, display a dialog to allow page
  680.              * selection.
  681.              */
  682.  
  683.             if ((exit_obj = page_dialog()) == PAGE_OK) {
  684.             if (strlen(pages)) {
  685.                 pageselect = 1;
  686.                 menu_icheck(menubar, msgbuff[4], 1);
  687.                 graf_mouse(BUSY_BEE, 0L);
  688.                 ret = page_filter(infile, pages, PAGEFILE);
  689.                 graf_mouse(ARROW, 0L);
  690.             }
  691.             else {
  692.                 pageselect = 0;
  693.                 menu_icheck(menubar, msgbuff[4], 0);
  694.             }
  695.  
  696.             }
  697.  
  698.             changed = 1;
  699.             break;
  700.  
  701.         case FIRSTOOL+1: case FIRSTOOL+2:
  702.         case FIRSTOOL+3: case FIRSTOOL+4:
  703.         case FIRSTOOL+5: case FIRSTOOL+6:
  704.         case FIRSTOOL+7: case FIRSTOOL+8:
  705.         case FIRSTOOL+9: case FIRSTOOL+10:
  706.  
  707.             /* Process the command line for the selected
  708.              * tool program and then execute it.
  709.              */
  710.  
  711.             tool = msgbuff[4] - FIRSTOOL - 1;
  712.             toolptr = presub(toolcom[tool], " ");
  713.  
  714.             strcpy(toolexec, toolptr);
  715.             strcpy(command, toolptr);
  716.             strcat(command, " ");
  717.  
  718.             pause = 0;
  719.             gemtool = 0;
  720.  
  721.             while ((toolptr = presub(NULL, " ")) != NULL) {
  722.             if (!strcmp(toolptr, "infile")) {
  723.  
  724.                 /* If the command line contains "infile",
  725.                  * use/get the input file.
  726.                  */
  727.  
  728.                 if (!strlen(infile) || strchr(infile, ' ')) {
  729.                 sprintf(dir_spec, "%s%s", current_dir, "*.*");
  730.                 strcpy(file_sel, "");
  731.  
  732.                 ret = fsel_input(dir_spec, file_sel, &exit_but);
  733.  
  734.                 if (exit_but) {
  735.                     if (strlen(file_sel)) {
  736.                     sptr = strrchr(dir_spec, '\\');
  737.                     *++sptr = '\0';
  738.                     strcpy(current_dir, dir_spec);
  739.                     strcpy(infile, dir_spec);
  740.                     strcat(infile, file_sel);
  741.                     }
  742.                     else {
  743.                     strcpy(infile, "");
  744.                     }
  745.                 }
  746.  
  747.                 }
  748.                 strcat(command, infile);
  749.                 strcat(command, " ");
  750.             }
  751.             else if (!strcmp(toolptr, "outfile")) {
  752.  
  753.                 /* If the command line contains "outfile",
  754.                  * use/get the output file.
  755.                  */
  756.  
  757.                 if (!strlen(outfile) || strchr(outfile, ' ')) {
  758.                 if (!strlen(home_dir)) {
  759.                     strcpy(home_dir, current_dir);
  760.                 }
  761.  
  762.                 sprintf(dir_spec, "%s%s", home_dir, "*.*");
  763.                 strcpy(file_sel, "");
  764.  
  765.                 ret = fsel_input(dir_spec, file_sel, &exit_but);
  766.  
  767.                 if (exit_but) {
  768.                     if (strlen(file_sel)) {
  769.                     sptr = strrchr(dir_spec, '\\');
  770.                     *++sptr = '\0';
  771.                     strcpy(current_dir, dir_spec);
  772.                     strcpy(outfile, dir_spec);
  773.                     strcat(outfile, file_sel);
  774.                     }
  775.                     else {
  776.                         strcpy(outfile, "");
  777.                     }
  778.                 }
  779.  
  780.                 }
  781.  
  782.                 strcat(command, outfile);
  783.                 strcat(command, " ");
  784.  
  785.             }
  786.             else if (!strcmp(toolptr, "fsel")) {
  787.  
  788.                 /* If the command line contains "fsel",
  789.                  * display a file selector.
  790.                  */
  791.  
  792.                 if (!strlen(home_dir)) {
  793.                 strcpy(home_dir, current_dir);
  794.                 }
  795.  
  796.                 sprintf(dir_spec, "%s%s", home_dir, "*.*");
  797.                 strcpy(file_sel, "");
  798.  
  799.                 ret = fsel_input(dir_spec, file_sel, &exit_but);
  800.  
  801.                 if (exit_but) {
  802.                 if (strlen(file_sel)) {
  803.                     sptr = strrchr(dir_spec, '\\');
  804.                     *++sptr = '\0';
  805.                     strcpy(current_dir, dir_spec);
  806.                     strcpy(toolfile, dir_spec);
  807.                     strcat(toolfile, file_sel);
  808.                 }
  809.                 else {
  810.                         strcpy(toolfile, "");
  811.                 }
  812.                 }
  813.  
  814.                 strcat(command, toolfile);
  815.                 strcat(command, " ");
  816.  
  817.             }
  818.             else if (!strcmp(toolptr, "dialog")) {
  819.  
  820.                 /* If the command line contains "dialog",
  821.                  * display a dialog for entry of command
  822.                  * line parameters.
  823.                  */
  824.  
  825.                 commtedinf.te_ptext = temptool;
  826.                 commline[1].ob_spec = UL commtitle[1];
  827.  
  828.                 if ((exit_obj = dialog(commline)) != RUN_CANCEL) {
  829.                 strcat(command, temptool);
  830.                 strcat(command, " ");
  831.                 }
  832.  
  833.                 strcpy(temptool, "");
  834.  
  835.             }
  836.             else if (!strcmp(toolptr, "pause")) {
  837.  
  838.                 /* If the command line contains "pause",
  839.                  * set a flag to pause after program
  840.                  * execution.
  841.                  */
  842.  
  843.                 pause = 1;
  844.             }
  845.             else if (!strcmp(toolptr, "gem")) {
  846.  
  847.                 /* If the command line contains "gem",
  848.                  * set a flag to initialize the screen
  849.                  * and mouse before execution.
  850.                  */
  851.  
  852.                 gemtool = 1;
  853.             }
  854.             else {
  855.  
  856.                 /* Put all other command line arguments
  857.                  * in the command line for the tool.
  858.                  */
  859.  
  860.                 strcat(command, toolptr);
  861.                 strcat(command, " ");
  862.             }
  863.  
  864.             }
  865.  
  866.             /* Fake a dialog that covers the screen, so that
  867.              * the background can be restored when GS exits.
  868.              * Then clear the screen.
  869.              */
  870.  
  871. /*            form_dial(FMD_START, 0, 0, wchar, hchar, 0, 0, x_res, y_res);
  872. */
  873.             menu_bar(menubar, 0);
  874.             if (!gemtool) {
  875.             v_enter_cur(vdi_handle);
  876.             }
  877.  
  878.             /* Execute tool */
  879.  
  880.             ret = system(command);
  881.  
  882.             if (pause) {
  883.             puts("\nPress RETURN to continue.");
  884.             getchar();
  885.             }
  886.  
  887.             /* Turn off the cursor, restore the desktop
  888.              * background, and then restore the menu bar.
  889.              */
  890.  
  891. #if 0
  892.             v_exit_cur(vdi_handle);
  893.             form_dial(FMD_FINISH, 0, 0, wchar, hchar, 0, 0, x_res, y_res);
  894. #endif
  895.             restore_bg();
  896.             menu_bar(menubar, 1);
  897.  
  898.             if (ret < 0) {
  899.             sprintf(line, "[1][Could not execute %s!][OK]",
  900.                 toolexec);
  901.             form_alert(1, line);
  902.             }
  903.  
  904.             pause = 0;
  905.             changed = 1;
  906.  
  907.             break;
  908.  
  909.         }
  910.  
  911.         break;
  912.         }
  913.         }            /* end if (event & MU_MESAG) */
  914.  
  915.     }                /* end for(;;) */
  916.  
  917.     exit(0);
  918.  
  919. }
  920.  
  921. /* Init takes care of GEM and other initializations. */
  922.  
  923. int init()
  924. {
  925.     DIR *dfp;    /* Pointer to directory structure. */
  926.     int ii;
  927.  
  928.     /* Standard GEM initialization. */
  929.  
  930.     if (appl_init() == -1) return 0;
  931.     for (ii=0; ii<10; ii++) work_in[ii] = 1;
  932.     work_in[10] = 2;
  933.     gem_handle = graf_handle(&wchar, &hchar, &wbox, &hbox);
  934.     vdi_handle = gem_handle;
  935.     v_opnvwk(work_in, &vdi_handle, work_out);
  936.     if (vdi_handle == 0) return 0;
  937.  
  938.     /* Save the screen resolution and number of color planes. */
  939.  
  940.     x_res = work_out[0];
  941.     y_res = work_out[1];
  942.  
  943.     vq_extnd(vdi_handle, 1, work_out);
  944.     color_bits = work_out[4];
  945.  
  946.     wind_get(0, WF_WORKXYWH, &full.g_x, &full.g_y, &full.g_w, &full.g_h);
  947.  
  948.     /* Adjust the sizes of all objects for the current
  949.      * screen resolution.
  950.      */
  951.  
  952.     objc_fix(menubar);
  953.     objc_fix(about);
  954.     objc_fix(commline);
  955.     objc_fix(output);
  956.     objc_fix(other);
  957.     objc_fix(pagedial);
  958.  
  959.     restore_bg();            /* restore the desktop background */
  960.     menu_bar(menubar, 1);        
  961.  
  962.     /* Find the current directory. */
  963.  
  964.     getcwd(home_dir, MAXLEN);
  965.  
  966.     while ((sptr = strchr(home_dir, '/')) != NULL) {
  967.         *sptr = '\\';    /* change forward to backward slashes */
  968.     }
  969.  
  970.     strcat(home_dir, "\\");
  971.     strcpy(current_dir, home_dir);
  972.  
  973.     read_config();            /* read the configuration file */
  974.  
  975. }
  976.  
  977. /* Process a generic dialog. */
  978.  
  979. int dialog(OBJECT *object)
  980. {
  981.     int exit_but;
  982.  
  983.     form_center(object, &cx, &cy, &cw, &ch);
  984.     form_dial(FMD_START, 0, 0, wchar, hchar, cx, cy, cw, ch);
  985.     objc_draw(object, 0, 5, cx, cy, cw, ch);
  986.  
  987.     exit_but = form_do(object, 0);
  988.  
  989.     form_dial(FMD_FINISH, 0, 0, wchar, hchar, cx, cy, cw, ch);
  990.     objc_change(&object[exit_but], 0, 0, cx, cy, cw, ch, NORMAL, 0);
  991.  
  992.     return exit_but;
  993. }
  994.  
  995. /* Read the configuration file. */
  996.  
  997. int read_config()
  998. {
  999.     FILE *config;
  1000.     OBJECT *object;
  1001.     char *pathfind();
  1002.  
  1003.     int newdev=0, newres=0, newtool=0, newenv=0;
  1004.  
  1005.     unsigned long len;
  1006.  
  1007.     /* Look for the configuration file in the current and HOME directories. */
  1008.  
  1009.     if ((sptr = pathfind("HOME", CONFIGFILE, ",")) != NULL) {
  1010.     strcpy(configfile, sptr);
  1011.     }
  1012.     else {    
  1013.     sprintf(line, "[1][Could not find %s!][OK]", CONFIGFILE);
  1014.     form_alert(1, line);
  1015.     goto menu;
  1016.     }
  1017.  
  1018.     if ((config = fopen(configfile, "r")) == NULL) {
  1019.     sprintf(line, "[1][Could not open %s!][OK]", CONFIGFILE);
  1020.     form_alert(1, line);
  1021.     goto menu;
  1022.     }
  1023.  
  1024.     /* Process the information in the config file. */
  1025.  
  1026.     while (fgets(line, 2*MAXLEN-1, config) != NULL) {
  1027.  
  1028. #if 0
  1029.     if (strlen(line) > 3) {
  1030.     printf("%x\n", line[strlen(line)+1]);
  1031.     printf("%x\n", line[strlen(line)]);
  1032.     printf("%x\n", line[strlen(line)-1]);
  1033.     printf("%x\n", line[strlen(line)-2]);
  1034.     getchar();
  1035.     }
  1036. #endif
  1037.     line[strlen(line)-1] = '\0';
  1038.  
  1039.     if (!strncmp(line, "device ", 7)) {
  1040.         strcpy(device, line+7);
  1041.     }
  1042.     if (!strncmp(line, "resolution ", 11)) {
  1043.         strcpy(res, line+11);
  1044.     }
  1045.     if (!strncmp(line, "geometry ", 9)) {
  1046.         strcpy(geometry, line+9);
  1047.         strcpy(tempgeom, line+9);
  1048.     }
  1049.     if (!strncmp(line, "clist ", 6)) {
  1050.         strcpy(clist, line+6);
  1051.         strcpy(tempclist, line+6);
  1052.     }
  1053.     if (!strncmp(line, "confirm ", 8)) {
  1054.         confirm = atoi(line+8);
  1055.     }
  1056.     if (!strncmp(line, "quiet ", 6)) {
  1057.         quiet = atoi(line+6);
  1058.     }
  1059.     if (!strncmp(line, "nopause ", 8)) {
  1060.         nopause = atoi(line+8);
  1061.     }
  1062.     if (!strncmp(line, "autoquit ", 9)) {
  1063.         autoquit = atoi(line+9);
  1064.     }
  1065.     if (!strncmp(line, "autorun ", 8)) {
  1066.         if (strlen(infile)) {
  1067.         autorun = atoi(line+8);
  1068.         }
  1069.     }
  1070.     if (!strncmp(line, "papersize ", 10)) {
  1071.         strcpy(papersize, line+10);
  1072.     }
  1073.     if (!strncmp(line, "windows ", 8)) {
  1074.         windows = atoi(line+8);
  1075.         if (windows) {
  1076.         ret = putenv("GS_WIN=batch");
  1077.         }
  1078.     }
  1079.     if (!strncmp(line, "setenv ", 7)) {
  1080.         strcpy(envvar[newenv], line+7);
  1081.         ret = putenv(envvar[newenv++]);
  1082.     }
  1083.     if (!strncmp(line, "devmenu ", 8)) {
  1084.         strcpy(devmenu[newdev], "  ");
  1085.         strcat(devmenu[newdev], line+8);
  1086.  
  1087.         object = &menubar[FIRSTDEV];
  1088.         object->ob_height += hchar;
  1089.  
  1090.         object = &menubar[FIRSTDEV + newdev + 1];
  1091.         object->ob_next = FIRSTDEV + newdev + 2;
  1092.  
  1093.         ++object;
  1094.         object->ob_next = LASTDEV;
  1095.         object->ob_state = 0;
  1096.         object->ob_spec = UL devmenu[newdev];
  1097.  
  1098.         object = &menubar[LASTDEV];
  1099.         object->ob_y += hchar;
  1100.  
  1101.         ++newdev;
  1102.     }
  1103.  
  1104.     if (!strncmp(line, "resmenu ", 8)) {
  1105.         strcpy(resmenu[newres], "  ");
  1106.         strcat(resmenu[newres], line+8);
  1107.  
  1108.         object = &menubar[FIRSTRES];
  1109.         object->ob_height += hchar;
  1110.  
  1111.         object = &menubar[FIRSTRES + newres + 1];
  1112.         object->ob_next = FIRSTRES + newres + 2;
  1113.  
  1114.         ++object;
  1115.         object->ob_next = LASTRES;
  1116.         object->ob_state = 0;
  1117.         object->ob_spec = UL resmenu[newres];
  1118.  
  1119.         object = &menubar[LASTRES];
  1120.         object->ob_y += hchar;
  1121.  
  1122.         ++newres;
  1123.     }
  1124.  
  1125.     if (!strncmp(line, "toolmenu ", 9)) {
  1126.         sptr = strchr(line+9, ' ');
  1127.         if (sptr == NULL) continue;
  1128.  
  1129.         len = sptr - (line+9);
  1130.  
  1131.         strcpy(toolmenu[newtool], "  ");
  1132.         strncat(toolmenu[newtool], line+9, len);
  1133.         strcpy(toolcom[newtool], sptr+1);
  1134.  
  1135.         object = &menubar[FIRSTOOL];
  1136.  
  1137.         if (newtool == 0) {
  1138.         ++object;
  1139.         object->ob_state = 0;
  1140.         object->ob_spec = UL toolmenu[newtool];
  1141.         }
  1142.         else {
  1143.         object->ob_tail = FIRSTOOL + newtool + 1; 
  1144.         object->ob_height += hchar;
  1145.  
  1146.         object = &menubar[FIRSTOOL + newtool];
  1147.         object->ob_next = FIRSTOOL + newtool + 1;
  1148.  
  1149.         object = &menubar[FIRSTOOL + newtool + 1];
  1150.         object->ob_next = FIRSTOOL;
  1151.         object->ob_state = 0;
  1152.         object->ob_spec = UL toolmenu[newtool];
  1153.         }
  1154.  
  1155.         ++newtool;
  1156.     }
  1157.  
  1158.     }
  1159.  
  1160.     menu:    /* Check and enable all the appropriate menu entries. */
  1161.  
  1162.     if (!windows && (sptr = getenv("GS_WIN")) != NULL) {
  1163.     if (!strcmp(sptr, "batch")) {
  1164.         windows = 1;
  1165.     }
  1166.     }
  1167.  
  1168.     menu_icheck(menubar, CONFIRM, confirm);
  1169.     menu_icheck(menubar, QUIET, quiet);
  1170.     menu_icheck(menubar, NOPAUSE, nopause);
  1171.     menu_icheck(menubar, AUTOQUIT, autoquit);
  1172.     menu_icheck(menubar, WINDOWS, windows);
  1173.     menu_icheck(menubar, GEOMETRY, strlen(geometry) ? 1 : 0);
  1174.     menu_icheck(menubar, CLIST, strlen(clist) ? 1 : 0);
  1175.  
  1176.     /* If the device was not set in the config file, check the GS_DEVICE
  1177.      * environment variable.
  1178.      */
  1179.  
  1180.     if (!strlen(device) && ((sptr = getenv("GS_DEVICE")) != NULL)) {
  1181.     strcpy(device, sptr);
  1182.     }
  1183.  
  1184.     if (strlen(device) && strcmp(device, "stvdi")) {
  1185.     menu_icheck(menubar, FIRSTDEV+1, 0);
  1186.     menu_ienable(menubar, WINDOWS, 0);
  1187.     for (i=0; strcmp(device, devmenu[i]+2) && i<8; i++);
  1188.     dev_checked = FIRSTDEV+2+i;
  1189.     menu_icheck(menubar, dev_checked, 1);
  1190.     if (i == 8) strcpy(devmenu[8], device);
  1191.     }
  1192.     else {
  1193.     win_dev = 1;
  1194.     menu_ienable(menubar, CLIST, 0);
  1195.     }
  1196.  
  1197.     if (strlen(res)) {
  1198.     menu_icheck(menubar, FIRSTRES+1, 0);
  1199.     for (i=0; strcmp(res, resmenu[i]+2) && i<8; i++);
  1200.     res_checked = FIRSTRES+2+i;
  1201.     menu_icheck(menubar, res_checked, 1);
  1202.     if (i == 8) strcpy(resmenu[8], res);
  1203.     }
  1204.  
  1205.     if (strlen(papersize)) {
  1206.     menu_icheck(menubar, FIRSTSIZE+1, 0);
  1207.     for (i=FIRSTSIZE+1;
  1208.         strcmp(papersize, (char *)(menubar[i].ob_spec+2))
  1209.         && i<=LASTSIZE; i++);
  1210.     size_checked = i;
  1211.     menu_icheck(menubar, size_checked, 1);
  1212.     }
  1213.  
  1214.     fclose(config);
  1215.  
  1216. }
  1217.  
  1218. /* Restore the usual desktop background. */
  1219.  
  1220. int restore_bg()
  1221. {
  1222.  
  1223.     puts("\033f");
  1224.     v_hide_c(vdi_handle);
  1225.     form_dial(FMD_FINISH, 0, 0, 8, 16, 0, 0, x_res, y_res);
  1226.     graf_mouse(ARROW, 0L);
  1227.     v_show_c(vdi_handle, 0);
  1228. }
  1229.  
  1230. /* Adjust the size of an object for the current screen resolution. */
  1231.  
  1232. int objc_fix(OBJECT *object)
  1233. {
  1234.     int i=-1;
  1235.  
  1236.     do {
  1237.     i++;
  1238.  
  1239.     if      (object[i].ob_x == 769) object[i].ob_x = full.g_y;
  1240.     else if (object[i].ob_x == 513) object[i].ob_x = full.g_y;
  1241.     else                object[i].ob_x *= wchar;
  1242.  
  1243.     if      (object[i].ob_y == 769) object[i].ob_y = full.g_y;
  1244.     else if (object[i].ob_y == 513) object[i].ob_y = full.g_y;
  1245.     else                object[i].ob_y *= hchar;
  1246.  
  1247.     if      (object[i].ob_width == 769) object[i].ob_width = full.g_y;
  1248.     else if (object[i].ob_width == 513) object[i].ob_width = full.g_y;
  1249.     else if (object[i].ob_width == 80)  object[i].ob_width = full.g_w;
  1250.     else                    object[i].ob_width *= wchar;
  1251.  
  1252.     if      (object[i].ob_height == 769) object[i].ob_height = full.g_y;
  1253.     else if (object[i].ob_height == 513) object[i].ob_height = full.g_y;
  1254.     else                     object[i].ob_height *= hchar;
  1255.  
  1256.     }
  1257.     while (!(object[i].ob_flags & LASTOB));
  1258.  
  1259. }
  1260.  
  1261. /* Update the objects found in the page selection dialog. */
  1262.  
  1263. int update_objects()
  1264. {
  1265.  
  1266.     if (up_count == up_max) {
  1267.     lastbut = FIRSTBUT + (int)(fmod(numpages, 10) - .9);
  1268.     }
  1269.     else {
  1270.     lastbut = LASTBUT;
  1271.     }
  1272.  
  1273.     for (i=FIRSTBUT, j=0; i<=LASTBUT; i++, j++) {
  1274.     if (i<=lastbut) {
  1275.         pagedial[i].ob_flags = 1;        /* selectable */
  1276.         pagedial[i].ob_state = 0;        /* enabled */
  1277.  
  1278.         if (page_flag[up_count] & (int)ldexp(1,j)) {
  1279.         pagedial[i].ob_state = SELECTED;
  1280.         }
  1281.     }
  1282.     else {
  1283.         pagedial[i].ob_flags = 0;    /* not selectable */
  1284.         pagedial[i].ob_state = 0x08;    /* disabled */
  1285.     }
  1286.     }
  1287.  
  1288.     if (up_count == 0) {
  1289.     pagedial[LASTBUT+1].ob_flags = 0;    /* not selectable */
  1290.     pagedial[LASTBUT+1].ob_state = 0x08;    /* disabled */
  1291.     }
  1292.     else {
  1293.     pagedial[LASTBUT+1].ob_flags = 0x41;    /* selectable */
  1294.     pagedial[LASTBUT+1].ob_state = 0;    /* enabled */
  1295.     }
  1296.  
  1297.     if (up_count == up_max) {
  1298.     pagedial[LASTBUT+2].ob_flags = 0;    /* not selectable */
  1299.     pagedial[LASTBUT+2].ob_state = 0x08;    /* disabled */
  1300.     }
  1301.     else {
  1302.     pagedial[LASTBUT+2].ob_flags = 0x41;    /* selectable */
  1303.     pagedial[LASTBUT+2].ob_state = 0;    /* enabled */
  1304.     }
  1305.  
  1306. }
  1307.  
  1308. /* Unselect all the objects in the page selection dialog. */
  1309.  
  1310. int clear_objects()
  1311. {
  1312.     char *itoa();
  1313.  
  1314.     for (i=FIRSTBUT; i<=lastbut; i++) {
  1315.     pagedial[i].ob_state = 0;
  1316.     }
  1317.     for (i=0; i<=up_max; i++) {
  1318.     page_flag[i] = 0;
  1319.     }
  1320.     strcpy(pages, "");
  1321.  
  1322.     for (i=FIRSTBUT; i<=LASTBUT; i++) {
  1323.     itoa((char *)pagedial[i].ob_spec,
  1324.         atoi((char *)pagedial[i].ob_spec)-10*up_count);
  1325.     }
  1326.  
  1327.     up_count = 0;
  1328.  
  1329.     objc_change(&pagedial[exit_obj], 0, 0, cx, cy, cw, ch, NORMAL, 0);
  1330.  
  1331. }
  1332.  
  1333. /* Handle the user interaction with the page dialog. */
  1334.  
  1335. int page_dialog()
  1336. {
  1337.     char *itoa();
  1338.     int pagequit=0;
  1339.  
  1340.     if (inchanged) {
  1341.     clear_objects();
  1342.     inchanged = 0;
  1343.     }
  1344.  
  1345.     up_max = (numpages - 1)/10;
  1346.  
  1347.     sprintf((char *)pagedial[1].ob_spec, "There are %d pages.", numpages);
  1348.  
  1349.     /* Set the initial state of the objects. */
  1350.  
  1351.     update_objects();
  1352.  
  1353.     /* Handle dialog interaction. */
  1354.  
  1355.     while (!pagequit && (exit_obj = dialog(pagedial))) {
  1356.  
  1357.     page_flag[up_count] = 0;
  1358.  
  1359.     /* Save selections and clear objects. */
  1360.  
  1361.     for (i=FIRSTBUT, j=0; i<=lastbut; i++, j++) {
  1362.         if (pagedial[i].ob_state & SELECTED) {
  1363.         page_flag[up_count] |= (int)ldexp(1,j);
  1364.         pagedial[i].ob_state = 0;
  1365.         }
  1366.     }
  1367.  
  1368.         switch (exit_obj) {
  1369.  
  1370.     case PAGE_UP:
  1371.         up_count++;
  1372.         for (i=FIRSTBUT; i<=LASTBUT; i++) {
  1373.         itoa((char *)pagedial[i].ob_spec,
  1374.             atoi((char *)pagedial[i].ob_spec)+10);
  1375.         }
  1376.         break;
  1377.  
  1378.     case PAGE_DN:
  1379.         up_count--;
  1380.         for (i=FIRSTBUT; i<=LASTBUT; i++) {
  1381.         itoa((char *)pagedial[i].ob_spec,
  1382.             atoi((char *)pagedial[i].ob_spec)-10);
  1383.         }
  1384.         break;
  1385.  
  1386.     case PAGE_CLEAR:
  1387.         clear_objects();
  1388.         break;
  1389.  
  1390.     case PAGE_CANCEL:
  1391.         pagequit = 1;
  1392.         break;
  1393.  
  1394.     case PAGE_OK:
  1395.         if (!strlen(pages)) {
  1396.         for (i=0; i<=up_max; i++) {
  1397.             for (j=0; j<=(LASTBUT-FIRSTBUT); j++) {
  1398.  
  1399.             if (page_flag[i] & (int)ldexp(1,j)) {
  1400.                 int pagenum;
  1401.                 pagenum = (j+1) + 10*i;
  1402.  
  1403.                 if (!strlen(pages)) {
  1404.                 strcpy(pages, itoa(line, pagenum));
  1405.                 }
  1406.                 else {
  1407.                 strcat(pages, ",");
  1408.                 strcat(pages, itoa(line, pagenum));
  1409.                 }
  1410.             }
  1411.  
  1412.             }
  1413.         }
  1414.  
  1415.         }
  1416.         pagequit = 1;
  1417.         break;
  1418.  
  1419.     }
  1420.  
  1421.     /* Set object states for this value of up_count. */
  1422.  
  1423.     update_objects();
  1424.  
  1425.     }
  1426.  
  1427.     return exit_obj;
  1428. }
  1429.