home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume15 / xgen / part10 < prev    next >
Text File  |  1991-10-25  |  48KB  |  1,361 lines

  1. Path: uunet!sun-barr!cronkite.Central.Sun.COM!exodus!zorro.cecer.army.mil
  2. From: kurt@zorro.cecer.army.mil (Kurt Buehler)
  3. Newsgroups: comp.sources.x
  4. Subject: v15i010: Xgen - GUI generator for shell-like programs, Part10/17
  5. Message-ID: <22152@exodus.Eng.Sun.COM>
  6. Date: 25 Oct 91 16:38:13 GMT
  7. References: <csx-15i001-xgen@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1349
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: kurt@zorro.cecer.army.mil (Kurt Buehler)
  13. Posting-number: Volume 15, Issue 10
  14. Archive-name: xgen/part10
  15.  
  16.  
  17. # This is a shell archive.  Remove anything before this line,
  18. # then unpack it by saving it in a file and typing "sh file".
  19. #
  20. # Wrapped by emily!kurt on Thu Aug 29 15:39:40 CDT 1991
  21. # Contents:  ./xgen/src/procmess.c ./xgen/src/resource.h ./xgen/src/sensitive.c
  22. #    ./xgen/src/control.c ./xgen/src/docapture.c ./xgen/src/popup.c
  23. #    ./xgen/src/addnode.c
  24.  
  25. echo x - ./xgen/src/procmess.c
  26. sed 's/^@//' > "./xgen/src/procmess.c" <<'@//E*O*F ./xgen/src/procmess.c//'
  27. /**********************************************************************
  28.    procmess.c   - process message object messages
  29.  *********************************************************************/
  30. /*******************************************************************************
  31. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  32. Support for Water and Environmental Systems (CADSWES), University of Colorado
  33. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  34. Purdue University for the U.S. Army Construction Engineering Research
  35. Laboratory in support of the Geographical Resources Analysis Support
  36. System (GRASS) software. The example scripts were developed by Ms. Christine
  37. Poulsen of USA-CERL, much thanks goes to her for her work.
  38.  
  39. Permission to use, copy, modify and distribute without charge this software,
  40. documentation, etc. is granted, provided that this comment is retained,
  41. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  42. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  43. used in advertising or publicity pertaining to distribution of the software
  44. without specific, written prior permission.
  45.  
  46. The author disclaims all warranties with regard to this software, including
  47. all implied warranties of merchantability and fitness, in no event shall
  48. the author be liable for any special, indirect or consequential damages or
  49. any damages whatsoever resulting from loss of use, data or profits,
  50. whether in an action of contract, negligence or other tortious action,
  51. arising out of or in connection with the use or performance of this
  52. software.
  53. *******************************************************************************/
  54. #include "xgen.h"
  55. /* surpress message "The result of operation '*' was not used" */
  56. /*SURPRESS 528*/
  57.  
  58. MessageInfo *
  59. ProcessMessage(string,columns)
  60.     char *string;
  61.     int columns;
  62. {
  63.     /* allocate a string to keep a copy in */
  64.     char *save = XtMalloc(strlen(string) +1);
  65.     char *savePtr;
  66.     int stringlen;
  67.     Boolean subdivide = False;
  68.  
  69.     MessageInfo *head;
  70.     MessageInfo *cur;
  71.  
  72.     int lastpos = 1;
  73.     int count = 1;
  74.  
  75.     savePtr = strcpy(save,string);
  76.  
  77. /***************************************************************
  78.  * allocate space for head of message info list and set cur pointer
  79.  **************************************************************/
  80.     cur = head = (MessageInfo *)XtMalloc(sizeof(MessageInfo));
  81.     bzero((char *)head,sizeof(MessageInfo));
  82.  
  83. /***************************************************************
  84.  * check for NULL input string
  85.  **************************************************************/
  86.     if ( !string ) return(NULL);
  87.  
  88.     stringlen = strlen(string);
  89.     if ( columns < stringlen ) 
  90.         subdivide = True;
  91.     else {
  92.         cur->startpos = lastpos;
  93.         cur->endpos = strlen(string);
  94.         return(head);
  95.     }
  96.  
  97. /***************************************************************
  98.  * while we still need to subdivide......
  99.  **************************************************************/
  100.     while ( subdivide ) {
  101.         Boolean got_a_line = False;
  102.         int charcount = 0;
  103.     /***************************************************************
  104.      * cram as many WORDS as we can into each line
  105.      **************************************************************/
  106.  
  107.         while ( !got_a_line ) {
  108.  
  109.             /* we reached a space check to see if the next space 
  110.              * would put us beyond columns... */
  111.             if ( isspace(*savePtr) ) {
  112.                 char *t = savePtr;
  113.                 int more = 0;
  114.  
  115.                 *t = ' ';
  116.  
  117.                 *t++; /* increment past space */
  118.                 while ( *t && !isspace(*t) ) {
  119.                     *t++; more++;
  120.                 }
  121.                 /* if so, save that part and break loop */
  122.                 if ( more + charcount > columns ) {
  123.  
  124.                     /***********************************************************
  125.                      * store appropraite info
  126.                      **********************************************************/
  127.                      cur->startpos = lastpos;
  128.                      cur->endpos = lastpos + charcount;
  129.                     /***********************************************************
  130.                      * allocate space for another message info list element
  131.                      **********************************************************/
  132.                     cur->next = (MessageInfo *)XtMalloc(sizeof(MessageInfo));
  133.                     bzero((char *)cur->next,sizeof(MessageInfo));
  134.                     cur = cur->next;
  135.                     lastpos += charcount + 1;
  136.                     got_a_line = True;
  137.                     count++;
  138.                 }
  139.             }
  140.             *savePtr++; 
  141.             /* if we reached the end of the string, 
  142.                save it and break both loops */
  143.             if ( *savePtr == NULL ) {
  144.                 if ( !got_a_line ) {
  145.  
  146.                     /***********************************************************
  147.                      * store appropraite info
  148.                      **********************************************************/
  149.                      cur->startpos = lastpos;
  150.                      cur->endpos = lastpos + charcount;
  151.                     /***********************************************************
  152.                      * allocate space for another message info list element
  153.                      **********************************************************/
  154.                     cur->next = (MessageInfo *)XtMalloc(sizeof(MessageInfo));
  155.                     bzero((char *)cur->next,sizeof(MessageInfo));
  156.                     cur = cur->next;
  157.                     lastpos += charcount;
  158.                 }
  159.                 got_a_line = True;
  160.                 count++;
  161.                 subdivide = False;
  162.             }
  163.             charcount++;
  164.         }
  165.         /* we just got another segment, if we aren't at strings end
  166.            just see if we need to subdivide further... */
  167.         if ( subdivide && !(columns < stringlen - lastpos) ) {
  168.             subdivide = False;
  169.             cur->startpos = lastpos;
  170.             cur->endpos = stringlen;
  171.             count++;
  172.         }
  173.     }
  174.  
  175.     return(head);
  176.  
  177. }
  178.  
  179. FreeMIList(mi)
  180.     MessageInfo *mi;
  181. {
  182.     if ( mi->next != NULL ) {
  183.         FreeMIList(mi->next);
  184.     }
  185.     XtFree(mi);
  186. }
  187. @//E*O*F ./xgen/src/procmess.c//
  188. chmod u=rw,g=r,o=r ./xgen/src/procmess.c
  189.  
  190. echo x - ./xgen/src/resource.h
  191. sed 's/^@//' > "./xgen/src/resource.h" <<'@//E*O*F ./xgen/src/resource.h//'
  192. /**********************************************************************
  193.    resource.h   - resource header file
  194.  *********************************************************************/
  195. /*******************************************************************************
  196. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  197. Support for Water and Environmental Systems (CADSWES), University of Colorado
  198. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  199. Purdue University for the U.S. Army Construction Engineering Research
  200. Laboratory in support of the Geographical Resources Analysis Support
  201. System (GRASS) software. The example scripts were developed by Ms. Christine
  202. Poulsen of USA-CERL, much thanks goes to her for her work.
  203.  
  204. Permission to use, copy, modify and distribute without charge this software,
  205. documentation, etc. is granted, provided that this comment is retained,
  206. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  207. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  208. used in advertising or publicity pertaining to distribution of the software
  209. without specific, written prior permission.
  210.  
  211. The author disclaims all warranties with regard to this software, including
  212. all implied warranties of merchantability and fitness, in no event shall
  213. the author be liable for any special, indirect or consequential damages or
  214. any damages whatsoever resulting from loss of use, data or profits,
  215. whether in an action of contract, negligence or other tortious action,
  216. arising out of or in connection with the use or performance of this
  217. software.
  218. *******************************************************************************/
  219. static struct _resourceTable {
  220.     int index;
  221.     char *name;
  222.     int type;
  223.     unsigned int valid;
  224. } resourceTable[] = {
  225.     InitialShells,    "initialshells",     STRING,  ENV,
  226.     X,                "x",                 INTEGER, SHL|MU|CO|OBJ|ALLOBJ,
  227.     DX,               "dx",                REAL,    SHL|MU|CO|OBJ|ALLOBJ,
  228.     Y,                "y",                 INTEGER, SHL|MU|CO|OBJ|ALLOBJ,
  229.     DY,               "dy",                REAL,    SHL|MU|CO|OBJ|ALLOBJ,
  230.     Width,            "width",             INTEGER, SHL|MU|CO|OBJ|ALLOBJ,
  231.     Height,           "height",            INTEGER, SHL|MU|CO|OBJ|ALLOBJ,
  232.     MaxWidth,         "maxwidth",          INTEGER, SHL|MU,
  233.     MaxHeight,        "maxheight",         INTEGER, SHL|MU,
  234.     Help,             "help",              STRING,  SHL|MU|CO|OBJ|ALLOBJ,
  235.     Columns,          "columns",           INTEGER, OBJ|TA|ME,
  236.     Font,             "font",              STRING,  OBJ|ALLOBJ,
  237.     EntryFont,        "entryfont",         STRING,  OBJ|TA,
  238.     Background,       "background",        STRING,  SHL|MU|CO|OBJ|ALLOBJ,
  239.     Foreground,       "foreground",        STRING,  SHL|MU|CO|OBJ|ALLOBJ,
  240.     TitleString,      "titlestring",       STRING,  SHL|MU|CO|OBJ|ALLOBJ,
  241.     Override,         "override",          BOOLEAN, SHL|MU|CO,
  242.     Popup,            "popup",             STRING,  OBJ|PB,
  243.     Popdown,          "popdown",           STRING,  OBJ|PB,
  244.     Destroy,          "destroy",           STRING,  OBJ|PB,
  245.     Exit,             "exit",              INTEGER, OBJ|PB,
  246.     RunForeground,    "runforeground",     STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  247.     RunBackground,    "runbackground",     STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  248.     InputFrom,        "inputfrom",         STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  249.     CaptureOutput,    "captureoutput",     STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  250.     UpdateFrom,       "updatefrom",        STRING,  SHL|MU|OBJ|LI,
  251.     Pane,             "pane",              BOOLEAN, SHL|CO,
  252.     Store,            "store",             STRING,  OBJ|PB,
  253.     GetEnv,           "getenv",            STRING,  OBJ|PB,
  254.     Clear,            "clear",             STRING,  OBJ|PB,
  255.     CommandArg,       "commandarg",        STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  256.     Set,              "set",               STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  257.     Alignment,        "alignment",         STRING,  OBJ|ME|LA|PB,
  258.     ListElement,      "listelement",       STRING,  OBJ|LI|TO,
  259.     ListSeparator,    "listseparator",     STRING,  OBJ|LI|TO,
  260.     ListType,         "listtype",          STRING,  OBJ|LI,
  261.     VisibleItems,     "visibleitems",      INTEGER, SHL|MU|OBJ|LI,
  262.     ValueString,      "valuestring",       STRING,  OBJ|TE|TO|LI,
  263.     LabelPixmap,      "labelpixmap",       STRING,  OBJ|LA|PB|TO,
  264.     Minimum,          "minimum",           INTEGER, OBJ|SL,
  265.     Maximum,          "maximum",           INTEGER, OBJ|SL,
  266.     StartValue,       "startvalue",        INTEGER, OBJ|SL,
  267.     SliderWidth,      "sliderwidth",       INTEGER, OBJ|SL,
  268.     SliderHeight,     "sliderheight",      INTEGER, OBJ|SL,
  269.     Orientation,      "orientation",       STRING,  OBJ|SL|SE,
  270.     DecimalPoints,    "decimalpoints",     INTEGER, OBJ|SL,
  271.     Rows,             "rows",              INTEGER, OBJ|TA,
  272.     RowsDisplayed,    "rowsdisplayed",     INTEGER, OBJ|TA,
  273.     ColumnsDisplayed, "columnsdisplayed",  INTEGER, OBJ|TA,
  274.     ColumnHeadings,   "columnheadings",    STRING,  OBJ|TA,
  275.     RowHeadings,      "rowheadings",       STRING,  OBJ|TA,
  276.     RowValue,         "rowvalue",          STRING,  OBJ|TA,
  277.     TableValue,       "tablevalue",        STRING,  OBJ|TA,
  278.     RowHeight,        "rowheight",         INTEGER, OBJ|TA,
  279.     ColumnWidth,      "columnwidth",       INTEGER, OBJ|TA,
  280.     Separator,        "separator",         STRING,  OBJ|TA,
  281.     Newline,          "newline",          BOOLEAN,  OBJ|TA,
  282.     ToggleType,       "toggletype",        STRING,  OBJ|TO,
  283.     SeparatorType,    "separatortype",     STRING,  OBJ|SE,
  284.     Sensitive,     "sensitive",      STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  285.     Insensitive,   "insensitive",    STRING,  ENV|SHL|MU|CO|OBJ|PB|PU,
  286. };
  287.  
  288. static struct _shellTable {
  289.     char *name;
  290.     int index;
  291.     unsigned int valid;
  292. } shellTable[] = {
  293.     "menu",   MU, LA|PB|SE,
  294.     "commandboard", CO, PU|LA|LI|ME|PB|TE|TA|SE|SL|TO,
  295. };
  296.  
  297. static struct _objectTable {
  298.     char *name;
  299.     int index;
  300. } objectTable[] = {
  301.     "label",      LA,
  302.     "message",    ME,
  303.     "list",       LI,
  304.     "pushbutton", PB,
  305.     "textentry",  TE,
  306.     "table",      TA,
  307.     "separator",  SE,
  308.     "slider",     SL,
  309.     "toggle",     TO,
  310.     "pulldown",   PU,
  311. };
  312. @//E*O*F ./xgen/src/resource.h//
  313. chmod u=rw,g=r,o=r ./xgen/src/resource.h
  314.  
  315. echo x - ./xgen/src/sensitive.c
  316. sed 's/^@//' > "./xgen/src/sensitive.c" <<'@//E*O*F ./xgen/src/sensitive.c//'
  317. /**********************************************************************
  318.    sensitive.c  - set a shell or object (in)sensitive
  319.  *********************************************************************/
  320. /*******************************************************************************
  321. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  322. Support for Water and Environmental Systems (CADSWES), University of Colorado
  323. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  324. Purdue University for the U.S. Army Construction Engineering Research
  325. Laboratory in support of the Geographical Resources Analysis Support
  326. System (GRASS) software. The example scripts were developed by Ms. Christine
  327. Poulsen of USA-CERL, much thanks goes to her for her work.
  328.  
  329. Permission to use, copy, modify and distribute without charge this software,
  330. documentation, etc. is granted, provided that this comment is retained,
  331. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  332. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  333. used in advertising or publicity pertaining to distribution of the software
  334. without specific, written prior permission.
  335.  
  336. The author disclaims all warranties with regard to this software, including
  337. all implied warranties of merchantability and fitness, in no event shall
  338. the author be liable for any special, indirect or consequential damages or
  339. any damages whatsoever resulting from loss of use, data or profits,
  340. whether in an action of contract, negligence or other tortious action,
  341. arising out of or in connection with the use or performance of this
  342. software.
  343. *******************************************************************************/
  344. #include "xgen.h"
  345.  
  346. EffectSensitivity(list,onoroff)
  347.     char *list;
  348.     Boolean onoroff;
  349. {
  350.     char **token, **Tokenize();
  351.     Boolean save = verbose;
  352.     int n;
  353.     WidgetListElement *widgetList;
  354.  
  355.     verbose = True;
  356.   
  357.     /* parse the list (if more than one name occurs) and set the affected
  358.            object (in)sensitive */
  359.     token = Tokenize(list," ");
  360.     for ( n = 0; token[n]; n++) {
  361.         Shell *s;
  362.  
  363.         if ((s = IndexShell(token[n])) == NULL ) {
  364.             InterfaceObject *o;
  365.             Boolean longDesc = False;
  366.  
  367.             if ( rindex(token[n],':') != NULL ) { 
  368.                 /* IN THE FORM "shell:obj" */
  369.                 char *sPart, *oPart;
  370.                 longDesc = True;
  371.  
  372.                 sPart = (char *)strtok(token[n],":");
  373.                 oPart = (char *)strtok(NULL,":");
  374.                 if ((s = IndexShell(sPart)) == NULL) {
  375.                     sprintf(errorbuf,
  376.                         "no such shell \"%s\"",sPart);
  377.                     XgenWarning("set sensitivity",errorbuf);
  378.                 } else if ( s->widget ) {
  379.                     Boolean found = False;
  380.  
  381.                     o = s->objects;
  382.                     while ( o && !found ) {
  383.                         if ( !strcmp(oPart,o->name) ) {
  384.                             if ( !strcmp(o->name,"dynamic")) {
  385.                                 widgetList = s->dynObjects;
  386.                                 while ( widgetList ) {
  387.                                     DoSetSensitive(widgetList->widget,onoroff);
  388.                                     widgetList = widgetList->next;
  389.                                 }
  390.                             } else {
  391.                                 DoSetSensitive(o->widget,onoroff);
  392.                             }
  393.                             found = True;
  394.                         }
  395.                         o = o->next;
  396.                     }
  397.                     if ( !found ) {
  398.                         sprintf(errorbuf,
  399.                             "no such object \"%s\" in shell \"%s\"",
  400.                             oPart,sPart);
  401.                         XgenWarning("set sensitivity",errorbuf);
  402.                     }
  403.                 }
  404.             } 
  405.             if ( !longDesc ) {
  406.                 if ( (o = IndexObjectByName(token[n])) == NULL ) {
  407.                     sprintf(errorbuf,
  408.                         "no such shell or object \"%s\"",token[n]);
  409.                     XgenWarning("set sensitivity",errorbuf);
  410.                 } else if ( o->widget ) {
  411.                     if ( !strcmp(o->name,"dynamic")) {
  412.                         s = IndexShellByObject(o);
  413.                         widgetList = s->dynObjects;
  414.                         while ( widgetList ) {
  415.                             DoSetSensitive(widgetList->widget,onoroff);
  416.                             widgetList = widgetList->next;
  417.                         }
  418.                     } else {
  419.                         DoSetSensitive(o->widget,onoroff);
  420.                     }
  421.                 }
  422.             }
  423.         } else if ( s->widget ) {
  424.             InterfaceObject *o = s->objects; 
  425.  
  426.             while ( o ) {
  427.                 if ( !strcmp(o->name,"dynamic")) {
  428.                     s = IndexShellByObject(o);
  429.                     widgetList = s->dynObjects;
  430.                     while ( widgetList ) {
  431.                         DoSetSensitive(widgetList->widget,onoroff);
  432.                         widgetList = widgetList->next;
  433.                     }
  434.                 } else {
  435.                     DoSetSensitive(o->widget,onoroff);
  436.                 }
  437.                 o = o->next;
  438.             }
  439.         }
  440.     } 
  441.     verbose = save;
  442. }
  443.  
  444. DoSetSensitive(w,onoroff) 
  445.     Widget w;
  446.     Boolean onoroff;
  447. {
  448.     if ( XtIsManaged(w) ) {
  449.         XtSetSensitive(w,onoroff);
  450.     }
  451. }
  452. @//E*O*F ./xgen/src/sensitive.c//
  453. chmod u=rw,g=r,o=r ./xgen/src/sensitive.c
  454.  
  455. echo x - ./xgen/src/control.c
  456. sed 's/^@//' > "./xgen/src/control.c" <<'@//E*O*F ./xgen/src/control.c//'
  457. /**********************************************************************
  458.    control.c    - perform control box functions
  459.  *********************************************************************/
  460. /*******************************************************************************
  461. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  462. Support for Water and Environmental Systems (CADSWES), University of Colorado
  463. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  464. Purdue University for the U.S. Army Construction Engineering Research
  465. Laboratory in support of the Geographical Resources Analysis Support
  466. System (GRASS) software. The example scripts were developed by Ms. Christine
  467. Poulsen of USA-CERL, much thanks goes to her for her work.
  468.  
  469. Permission to use, copy, modify and distribute without charge this software,
  470. documentation, etc. is granted, provided that this comment is retained,
  471. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  472. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  473. used in advertising or publicity pertaining to distribution of the software
  474. without specific, written prior permission.
  475.  
  476. The author disclaims all warranties with regard to this software, including
  477. all implied warranties of merchantability and fitness, in no event shall
  478. the author be liable for any special, indirect or consequential damages or
  479. any damages whatsoever resulting from loss of use, data or profits,
  480. whether in an action of contract, negligence or other tortious action,
  481. arising out of or in connection with the use or performance of this
  482. software.
  483. *******************************************************************************/
  484. #include "xgen.h"
  485.  
  486. void KillCB();
  487. void ForegroundCB();
  488.  
  489. MakeControlBox()
  490. {
  491.     Widget separator1, separator2, cbLabel1, cbLabel2, quitButton;
  492.     int n;
  493.     char buf[80];
  494.     XmString xmLabel;
  495.     void ControlBoxQuit();
  496.  
  497.     n = 0;
  498.     SetGlobalArgs(&n,FONTS);
  499.     SetObjectColorArgs(NULL,&n);
  500.     XtSetArg(args[n],XmNmarginWidth,0); n++;
  501.     XtSetArg(args[n],XmNmarginHeight,0); n++;
  502.     XtSetArg(args[n],XmNpacking,XmPACK_COLUMN); n++;
  503.     XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
  504.     xgenGD.CBRowCol = XmCreateRowColumn(xgenGD.applShell,"controlbox pane",args,n);
  505.     XtManageChild(xgenGD.CBRowCol);
  506.  
  507.     n = 0;
  508.     SetGlobalArgs(&n,FONTS);
  509.     SetObjectColorArgs(NULL,&n);
  510.     sprintf(buf,"%s Control Box",xgenGD.progName);
  511.     xmLabel = XmStringLtoRCreate(buf,SDC);
  512.     XtSetArg(args[n],XmNlabelType,XmSTRING); n++;
  513.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  514.     cbLabel1 = XmCreateLabelGadget(xgenGD.CBRowCol,"label",args,n);
  515.     XtManageChild(cbLabel1);
  516.     XmStringFree(xmLabel);
  517.  
  518.     n = 0;
  519.     SetGlobalArgs(&n,FONTS);
  520.     SetObjectColorArgs(NULL,&n);
  521.     xmLabel = XmStringLtoRCreate("Quit",SDC);
  522.     XtSetArg(args[n],XmNlabelType,XmSTRING); n++;
  523.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  524.     XtSetArg(args[n],XmNborderWidth,10); n++;
  525.     quitButton = XmCreatePushButtonGadget(xgenGD.CBRowCol,"exit",args,n);
  526.     XtManageChild(quitButton);
  527.     XmStringFree(xmLabel);
  528.  
  529.     XtAddCallback(quitButton, XmNactivateCallback, ControlBoxQuit, NULL);
  530.  
  531.     n = 0;
  532.     SetGlobalArgs(&n,FONTS);
  533.     SetObjectColorArgs(NULL,&n);
  534.     XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
  535.     XtSetArg(args[n],XmNseparatorType,XmSHADOW_ETCHED_IN); n++;
  536.     separator1 = XmCreateSeparator(xgenGD.CBRowCol,"s1",args,n);
  537.     XtManageChild(separator1);
  538.  
  539.     n = 0;
  540.     SetGlobalArgs(&n,FONTS);
  541.     SetObjectColorArgs(NULL,&n);
  542.     sprintf(buf,"Background Jobs:",xgenGD.progName);
  543.     xmLabel = XmStringLtoRCreate(buf,SDC);
  544.     XtSetArg(args[n],XmNlabelType,XmSTRING); n++;
  545.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  546.     cbLabel2 = XmCreateLabelGadget(xgenGD.CBRowCol,"label",args,n);
  547.     XtManageChild(cbLabel2);
  548.     XmStringFree(xmLabel);
  549.  
  550.     n = 0;
  551.     SetGlobalArgs(&n,FONTS);
  552.     SetObjectColorArgs(NULL,&n);
  553.     XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
  554.     XtSetArg(args[n],XmNseparatorType,XmSHADOW_ETCHED_IN); n++;
  555.     separator2 = XmCreateSeparator(xgenGD.CBRowCol,"s2",args,n);
  556.     XtManageChild(separator2);
  557.  
  558. }
  559.  
  560. void 
  561. AddCommandToControlBox(com)
  562.     Command *com;
  563. {
  564.     Widget optMenu;
  565.     Widget optSubmenu;
  566.     Widget opts[2];
  567.     XmString xmLabel;
  568.     int n;
  569.  
  570.     n = 0;
  571.     SetGlobalArgs(&n,FONTS);
  572.     SetObjectColorArgs(NULL,&n);
  573.     optSubmenu = XmCreatePulldownMenu(xgenGD.CBRowCol,"optionsubmenu",args,n);
  574.  
  575.     n = 0;
  576.     SetGlobalArgs(&n,FONTS);
  577.     SetObjectColorArgs(NULL,&n);
  578.     xmLabel = XmStringLtoRCreate("foreground",SDC);
  579.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  580.     opts[0] = XmCreatePushButtonGadget(optSubmenu,"option1",args,n);
  581.     XtManageChild(opts[0]);
  582.     XmStringFree(xmLabel);
  583.  
  584.     n = 0;
  585.     SetGlobalArgs(&n,FONTS);
  586.     SetObjectColorArgs(NULL,&n);
  587.     xmLabel = XmStringLtoRCreate("kill",SDC);
  588.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  589.     opts[1] = XmCreatePushButtonGadget(optSubmenu,"option2",args,n);
  590.     XtManageChild(opts[1]);
  591.     XmStringFree(xmLabel);
  592.  
  593.     n = 0;
  594.     SetGlobalArgs(&n,FONTS);
  595.     SetObjectColorArgs(NULL,&n);
  596.     xmLabel = XmStringLtoRCreate(com->path,SDC);
  597.     XtSetArg(args[n],XmNlabelString,xmLabel); n++;
  598.     XtSetArg(args[n],XmNsubMenuId,optSubmenu); n++;
  599.     optMenu = XmCreateOptionMenu(xgenGD.CBRowCol,"command",args,n);
  600.     XtManageChild(optMenu);
  601.     XmStringFree(xmLabel);
  602.  
  603.     com->widget = optMenu;
  604.  
  605.     XtAddCallback(opts[0], XmNactivateCallback, ForegroundCB, com);
  606.     XtAddCallback(opts[1], XmNactivateCallback, KillCB, com);
  607.     
  608.  
  609. void 
  610. DeleteCommandFromControlBox(pid)
  611.     int pid;
  612. {
  613.     Command *goner = FindCommand(pid);
  614.  
  615.     if ( !nocontrol )
  616.         if ( goner != NULL ) {
  617.             XtUnrealizeWidget(goner->widget);
  618.             XtDestroyWidget(goner->widget);
  619.         }
  620. }
  621.  
  622. void 
  623. ControlBoxQuit()
  624. {
  625.     XgenExit(0);
  626. }
  627.  
  628. static void 
  629. ForegroundCB(w,cld,cad)
  630.     /*ARGSUSED*/
  631.     Widget w;
  632.     caddr_t cld;
  633.     caddr_t cad;
  634. {
  635.     Command *command = (Command *)cld;
  636.     union wait status;
  637.     int pid;
  638.  
  639.     while ( (pid = wait(&status)) != command->pid && pid != -1 ) {
  640.         DoReap(status,pid);
  641.     }
  642.     if ( pid != -1 )
  643.         DoReap(status,pid);
  644.     return;
  645. }
  646.  
  647. static void 
  648. KillCB(w,cld,cad)
  649.     /*ARGSUSED*/
  650.     Widget w;
  651.     caddr_t cld;
  652.     caddr_t cad;
  653. {
  654.     Command *command = (Command *)cld;
  655.     char s[80];
  656.     int pgrp;
  657.  
  658.     /* unlink temp files if they exist */
  659.     if ( command->capture && !access(command->tmpfile,0) )
  660.         unlink(command->tmpfile);
  661.     if ( !access(command->errfile,0) )
  662.         unlink(command->errfile);
  663.     /* check for existance */
  664.     if ( kill(command->pid,0) == 0 && errno != ESRCH ) {
  665.         /* get the process group and wipe it out */
  666.         pgrp = getpgrp(command->pid);
  667.         if ( killpg(pgrp,SIGINT) < 0 ) {
  668.             sprintf(s,"killpg: process group %d",pgrp);
  669.             perror(s);
  670.         }
  671.     }
  672.     DeleteCommandFromControlBox(command->pid);
  673.     DeleteCommand(command->pid);
  674.     return;
  675. }
  676. @//E*O*F ./xgen/src/control.c//
  677. chmod u=rw,g=r,o=r ./xgen/src/control.c
  678.  
  679. echo x - ./xgen/src/docapture.c
  680. sed 's/^@//' > "./xgen/src/docapture.c" <<'@//E*O*F ./xgen/src/docapture.c//'
  681. /**********************************************************************
  682.    docapture.c  - capture output from a command in a text editor widget
  683.  *********************************************************************/
  684. /*******************************************************************************
  685. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  686. Support for Water and Environmental Systems (CADSWES), University of Colorado
  687. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  688. Purdue University for the U.S. Army Construction Engineering Research
  689. Laboratory in support of the Geographical Resources Analysis Support
  690. System (GRASS) software. The example scripts were developed by Ms. Christine
  691. Poulsen of USA-CERL, much thanks goes to her for her work.
  692.  
  693. Permission to use, copy, modify and distribute without charge this software,
  694. documentation, etc. is granted, provided that this comment is retained,
  695. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  696. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  697. used in advertising or publicity pertaining to distribution of the software
  698. without specific, written prior permission.
  699.  
  700. The author disclaims all warranties with regard to this software, including
  701. all implied warranties of merchantability and fitness, in no event shall
  702. the author be liable for any special, indirect or consequential damages or
  703. any damages whatsoever resulting from loss of use, data or profits,
  704. whether in an action of contract, negligence or other tortious action,
  705. arising out of or in connection with the use or performance of this
  706. software.
  707. *******************************************************************************/
  708. #include "xgen.h"
  709.  
  710. static Widget saveDialog = NULL;
  711.  
  712. void
  713. DoCaptureText(com)
  714.     Command *com;
  715. {
  716.     Widget captureWidget;
  717.     Widget main_window;
  718.     Widget menu_bar;
  719.     Widget dismiss;
  720.     Widget save;
  721.     Widget frame;
  722.     Widget text;
  723.     FILE *fp;
  724.     char *string;
  725.     struct stat statbuf;
  726.     int length;
  727.     int n;
  728.  
  729.  
  730.     
  731.     if ((fp = fopen(com->tmpfile, "r+")) == NULL)
  732.         if ((fp = fopen(com->tmpfile, "r")) != NULL) {
  733.             fprintf(stderr, "Warning: file opened read only.\n");
  734.         } else {
  735.             fprintf(stderr, "Sorry: couldn't get tmpfile\n"); 
  736.             return;
  737.         }
  738.  
  739.     /* get the legth of the string */
  740.     if ( stat(com->tmpfile,&statbuf) == 0 )
  741.         length = statbuf.st_size;
  742.     else
  743.         length = 1000000; /* arbitrary file length */
  744.  
  745.     /* read it... */
  746.     if ( length > 0 ) {
  747.         string = (char *)XtMalloc(length);
  748.         fread(string, sizeof(char), length, fp);
  749.     }
  750.  
  751.     /* close up the file */
  752.        if (fclose(fp) != NULL) 
  753.         fprintf(stderr, "Warning: unable to close file.\n");    
  754.  
  755.     if ( length ) {
  756.  
  757.         n = 0;
  758.            SetGlobalArgs(&n,NOFONTS);
  759.            SetObjectColorArgs(NULL,&n);
  760.  
  761.         XtSetArg(args[n],XmNallowShellResize,True); n++;
  762.            captureWidget = XtCreatePopupShell(com->path,topLevelShellWidgetClass,
  763.                                       xgenGD.applShell,args,n);
  764.  
  765.     /***************************************************************
  766.        * create the MainWindow : this is used since it allows for a
  767.        * MenuBar, a Frame, and a ScrolledWindow (if necessary).
  768.        * The application designer might choose to place labels, lists,
  769.        * or pushbuttons in a menu.
  770.        **************************************************************/
  771.           n = 0;
  772.           SetGlobalArgs(&n,NOFONTS);
  773.           SetObjectColorArgs(NULL,&n);
  774.         main_window = XmCreateMainWindow(captureWidget,com->path,args,n);
  775.            XtManageChild(main_window);
  776.      /***************************************************************
  777.        * create the MenuBar 
  778.        **************************************************************/
  779.            menu_bar = NULL;
  780.            n = 0;
  781.            SetGlobalArgs(&n,NOFONTS);
  782.            SetObjectColorArgs(NULL,&n);
  783.            menu_bar = XmCreateMenuBar(main_window,"menu_bar",args,n);
  784.            XtManageChild(menu_bar);
  785.      /***************************************************************
  786.        * create menu buttons 
  787.        **************************************************************/
  788.         n = 0;
  789.            SetGlobalArgs(&n,FONTS);
  790.            SetObjectColorArgs(NULL,&n);
  791.            dismiss = XmCreateCascadeButton(menu_bar, "Dismiss", args,n);
  792.            XtManageChild(dismiss);
  793.            save = XmCreateCascadeButton(menu_bar, "Save to file", args,n);
  794.            XtManageChild(save);
  795.        /***************************************************************
  796.        * create a frame for the objects
  797.        **************************************************************/
  798.            n = 0;
  799.            SetGlobalArgs(&n,NOFONTS);
  800.            SetObjectColorArgs(NULL,&n);
  801.            frame = XmCreateFrame(main_window,"frame",args,n);
  802.            XtManageChild(frame);
  803.  
  804.         n = 0;
  805.            SetGlobalArgs(&n,NOFONTS);
  806.            SetObjectColorArgs(NULL,&n);
  807.         XtSetArg (args[n], XmNrows, 24);  n++;
  808.         XtSetArg (args[n], XmNcolumns, 80);  n++;
  809.         XtSetArg (args[n], XmNresizeWidth, False);  n++;
  810.         XtSetArg (args[n], XmNresizeHeight, False);  n++;
  811.         XtSetArg (args[n], XmNscrollVertical, True);  n++;
  812.         XtSetArg (args[n], XmNscrollHorizontal, True);  n++;
  813.         XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT);  n++;
  814.         text = XmCreateScrolledText(frame,"text",args,n);
  815.         XtManageChild(text);
  816.  
  817.            /***************************************************************
  818.             * add callbacks 
  819.             **************************************************************/
  820.            XtAddCallback(dismiss,XmNactivateCallback,dismissCB,
  821.               (caddr_t)captureWidget);
  822.            XtAddCallback(save,XmNactivateCallback,saveCB,
  823.               (caddr_t)text);
  824.  
  825.         XtPopup(captureWidget,XtGrabNone);
  826.         XmTextSetString(text, string);
  827.     }
  828. }
  829.  
  830. void 
  831. dismissCB(w,cld,cad)
  832.     /*ARGSUSED*/
  833.     Widget w;
  834.     caddr_t cld;
  835.     caddr_t cad;
  836. {
  837.     Widget popup = (Widget)cld;
  838.     XtDestroyWidget(popup);
  839. }
  840.  
  841. void 
  842. saveCB(w,cld,cad)
  843.     /*ARGSUSED*/
  844.     Widget w;
  845.     caddr_t cld;
  846.     caddr_t cad;
  847. {
  848.     int n;
  849.     XmString xmstring;
  850.     Widget text = (Widget) cld;
  851.  
  852.     n = 0;
  853.     xmstring = XmStringCreateLtoR("Save To File...",SDC);
  854.     XtSetArg(args[n], XmNselectionLabelString,xmstring); n++;
  855.     saveDialog = XmCreatePromptDialog(w,"save dialog",args,n);
  856.     XtManageChild(saveDialog);
  857.     XtAddCallback (saveDialog, XmNokCallback, SaveOKCB, (caddr_t)text);
  858.     XtManageChild(saveDialog);
  859. }
  860.  
  861. void
  862. SaveOKCB(w,cld,cad)
  863.     /*ARGSUSED*/
  864.     Widget w;
  865.     caddr_t cld;
  866.     caddr_t cad;
  867. {
  868.     char *fileString = NULL;
  869.     char *fileName = NULL;
  870.     FILE *fp = NULL;
  871.     XmSelectionBoxCallbackStruct *scb =
  872.          (XmSelectionBoxCallbackStruct *) cad;
  873.     Widget text = (Widget) cld;
  874.  
  875.     /* get the file name from the dialog */
  876.     XmStringGetLtoR(scb->value, SDC, &fileName);
  877.  
  878.     /* is NULL or empty just return so maybe the user will enter one */
  879.     if ( !fileName || !strcmp(fileName,"") ) return;
  880.  
  881.     /* open the file, if possible */
  882.     if ((fp = fopen(fileName, "a+")) == NULL) {
  883.         sprintf(errorbuf,"unable to open [%s], text not saved.",fileName);
  884.         XgenWarning("save captured text",errorbuf);
  885.     }
  886.  
  887.     /* get the text string */
  888.     fileString = XmTextGetString(text);
  889.  
  890.     /* write it to the file */
  891.     fwrite(fileString, sizeof(char), strlen(fileString) + 1, fp);
  892.  
  893.     fflush(fp);
  894.     fclose(fp);
  895.  
  896.     /* destroy the dialog */
  897.         XtDestroyWidget(saveDialog);
  898. }
  899. @//E*O*F ./xgen/src/docapture.c//
  900. chmod u=rw,g=r,o=r ./xgen/src/docapture.c
  901.  
  902. echo x - ./xgen/src/popup.c
  903. sed 's/^@//' > "./xgen/src/popup.c" <<'@//E*O*F ./xgen/src/popup.c//'
  904. /**********************************************************************
  905.    popup.c      - do popup's, popdown's, and getenv's
  906.  *********************************************************************/
  907. /*******************************************************************************
  908. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  909. Support for Water and Environmental Systems (CADSWES), University of Colorado
  910. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  911. Purdue University for the U.S. Army Construction Engineering Research
  912. Laboratory in support of the Geographical Resources Analysis Support
  913. System (GRASS) software. The example scripts were developed by Ms. Christine
  914. Poulsen of USA-CERL, much thanks goes to her for her work.
  915.  
  916. Permission to use, copy, modify and distribute without charge this software,
  917. documentation, etc. is granted, provided that this comment is retained,
  918. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  919. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  920. used in advertising or publicity pertaining to distribution of the software
  921. without specific, written prior permission.
  922.  
  923. The author disclaims all warranties with regard to this software, including
  924. all implied warranties of merchantability and fitness, in no event shall
  925. the author be liable for any special, indirect or consequential damages or
  926. any damages whatsoever resulting from loss of use, data or profits,
  927. whether in an action of contract, negligence or other tortious action,
  928. arising out of or in connection with the use or performance of this
  929. software.
  930. *******************************************************************************/
  931. #include "xgen.h"
  932.  
  933. PopupEnviron(e)
  934.     Environ *e;
  935. {
  936.     Shell *s = e->shells;
  937.     Resource *resource;
  938.  
  939.     xgenGD.currentEnv = e;
  940.  
  941.  
  942.     if ( (NULL != (resource = IndexResource((char *)e,ENVIRONMENT,"set"))) ||
  943.          (NULL != (resource = IndexResource((char *)e,ENVIRONMENT,"runforeground"))) ||
  944.          (NULL != (resource = IndexResource((char *)e,ENVIRONMENT,"runbackground")))) {
  945.         while ( resource ) {
  946.             if ( !strcmp(resource->name,"set") )
  947.                 DoSet((char *)e,resource,ENVIRONMENT,NULL);
  948.             if ( !strncmp(resource->name,"run",3) )
  949.                 DoJob((char *)e,resource,ENVIRONMENT);
  950.  
  951.             resource = resource->next;
  952.         }
  953.     }
  954.  
  955.     /* Popup all initial shells */
  956.     s = e->shells;
  957.     while ( s ) {
  958.         if ( s->initial ) 
  959.             Popup_Shell(s);
  960.         s = s->next;
  961.     }
  962. /***************************************************************
  963.  *  check for existance of a sensitivity command....
  964.  **************************************************************/
  965.     if ( (NULL !=
  966.           (resource = IndexResource((char *)e,ENVIRONMENT,"sensitive"))) ||
  967.          (NULL !=
  968.           (resource = IndexResource((char *)e,ENVIRONMENT,"insensitive")))) {
  969.         while ( resource ) {
  970.              if ( !strcmp(resource->name,"sensitive") ) {
  971.                  EffectSensitivity(resource->val.cval,True);
  972.              }
  973.              if ( !strcmp(resource->name,"insensitive") ) {
  974.                  EffectSensitivity(resource->val.cval,False);
  975.              }
  976.              resource = resource->next;
  977.         }
  978.     }
  979. }
  980.  
  981. PopdownAll(e)
  982.     Environ *e;
  983. {
  984.     Shell *s = e->shells;
  985.  
  986.     while ( s ) {
  987.         if ( s->popup ) 
  988.             Popdown_Shell(s);
  989.         s = s->next;
  990.     }
  991.     
  992. }
  993.  
  994. Popup_Shell(s)
  995.     Shell *s;
  996. {
  997.     Resource *resource;
  998.  
  999. /***************************************************************
  1000.  * If the shell is not in the current environment, then print
  1001.  * a warning and return.
  1002.  **************************************************************/
  1003.     if ( !ShellInCurrentEnviron(s) ) {
  1004.  
  1005.         sprintf(errorbuf,"shell [%s] not in current environment\n",s->name);
  1006.         XgenWarning("popup shell",errorbuf);
  1007.         return;
  1008.     }
  1009.  
  1010.     if ( (NULL != (resource = IndexResource((char *)s,SHELL,"set"))) ||
  1011.          (NULL != (resource = IndexResource((char *)s,SHELL,"runforeground"))) ||
  1012.          (NULL != (resource = IndexResource((char *)s,SHELL,"runbackground")))) {
  1013.         while ( resource ) {
  1014.             if ( !strcmp(resource->name,"set") )
  1015.                 DoSet((char *)s,resource,SHELL,NULL);
  1016.             if ( !strncmp(resource->name,"run",3) )
  1017.                 DoJob((char *)s,resource,SHELL);
  1018.  
  1019.             resource = resource->next;
  1020.         }
  1021.     }
  1022.  
  1023. /***************************************************************
  1024.  * If the widget doesn't exist create it.
  1025.  **************************************************************/
  1026.     if ( !s->widget ) {
  1027.         Create_Shell(s);
  1028. /***************************************************************
  1029.  * else destroy the old one and recreate it.
  1030.  **************************************************************/
  1031.     } else {
  1032.        Popdown_Shell(s);
  1033.        Create_Shell(s);
  1034.     }
  1035.  
  1036.  
  1037. /***************************************************************
  1038.  *  pop it up.
  1039.  **************************************************************/
  1040.     XtPopup(s->widget,XtGrabNone);
  1041.     s->popup = True;
  1042. /***************************************************************
  1043.  *  check for existance of a sensitivity command....
  1044.  **************************************************************/
  1045.     if ( (NULL !=
  1046.           (resource = IndexResource((char *)s,SHELL,"sensitive"))) ||
  1047.          (NULL !=
  1048.           (resource = IndexResource((char *)s,SHELL,"insensitive")))) {
  1049.         while ( resource ) {
  1050.              if ( !strcmp(resource->name,"sensitive") ) {
  1051.                  EffectSensitivity(resource->val.cval,True);
  1052.              }
  1053.              if ( !strcmp(resource->name,"insensitive") ) {
  1054.                  EffectSensitivity(resource->val.cval,False);
  1055.              }
  1056.              resource = resource->next;
  1057.         }
  1058.     }
  1059. }
  1060.  
  1061. Popdown_Shell(s)
  1062.     Shell *s;
  1063. {
  1064.     InterfaceObject *o = s->objects;
  1065.  
  1066.     if ( s->widget ) {
  1067.         XtPopdown(s->widget);
  1068.         XtDestroyWidget(s->widget);
  1069.         /***************************************************************
  1070.          * If any list or toggle objects are in this shell we must clean 
  1071.          * them up.
  1072.          **************************************************************/
  1073.         while ( o ) {
  1074.             switch ( o->type ) {
  1075.                 case LIST:
  1076.                     DeleteListInfo(o->name);
  1077.                     break;
  1078.                 case TOGGLE:
  1079.                     DeleteToggleInfo(o->name);
  1080.                     break;
  1081.             }
  1082.             o = o->next;
  1083.         }
  1084.     }
  1085.     s->popup = False;
  1086.     s->widget = (Widget)0;
  1087.     if ( s->dynObjects ) {
  1088.         FreeWidgetList(s->dynObjects);
  1089.     }
  1090.     s->dynObjects = (WidgetListElement *)0;
  1091. }
  1092.  
  1093. FreeWidgetList(wl)
  1094.     WidgetListElement * wl;
  1095. {
  1096.     if ( wl->next != NULL ) {
  1097.         FreeWidgetList(wl->next);
  1098.     }
  1099.     XtFree(wl);
  1100. }
  1101. @//E*O*F ./xgen/src/popup.c//
  1102. chmod u=rw,g=r,o=r ./xgen/src/popup.c
  1103.  
  1104. echo x - ./xgen/src/addnode.c
  1105. sed 's/^@//' > "./xgen/src/addnode.c" <<'@//E*O*F ./xgen/src/addnode.c//'
  1106. /**********************************************************************
  1107.    addnode.c    - add a node to Xgen's internal hierarchy
  1108.     
  1109.  *********************************************************************/
  1110. /*******************************************************************************
  1111. Xgen was developed by Kurt Buehler, while at the Center for Advanced Decision
  1112. Support for Water and Environmental Systems (CADSWES), University of Colorado
  1113. at Boulder and at the Indiana Water Resources Research Center (IWRRC),
  1114. Purdue University for the U.S. Army Construction Engineering Research
  1115. Laboratory in support of the Geographical Resources Analysis Support
  1116. System (GRASS) software. The example scripts were developed by Ms. Christine
  1117. Poulsen of USA-CERL, much thanks goes to her for her work.
  1118.  
  1119. Permission to use, copy, modify and distribute without charge this software,
  1120. documentation, etc. is granted, provided that this comment is retained,
  1121. and that the names of Kurt Buehler, Christine Poulsen, CADSWES, IWRRC,
  1122. the University of Colorado at Boulder, Purdue University, or USA-CERL are not
  1123. used in advertising or publicity pertaining to distribution of the software
  1124. without specific, written prior permission.
  1125.  
  1126. The author disclaims all warranties with regard to this software, including
  1127. all implied warranties of merchantability and fitness, in no event shall
  1128. the author be liable for any special, indirect or consequential damages or
  1129. any damages whatsoever resulting from loss of use, data or profits,
  1130. whether in an action of contract, negligence or other tortious action,
  1131. arising out of or in connection with the use or performance of this
  1132. software.
  1133. *******************************************************************************/
  1134. #include "xgen.h"
  1135.  
  1136. /***************************************************************
  1137.  * AddValue 
  1138.  * Add a value node to a resource node. Take into account
  1139.  * the type of value and assign to the proper union element.
  1140.  * If the resource is a variable, store it for later expansion.
  1141.  * Unless it is a run or set procedure.
  1142.  **************************************************************/
  1143. AddValue(rptr,value,rtype)
  1144.     Resource *rptr;
  1145.     char *value;
  1146.     int rtype;
  1147. {
  1148.     rptr->name = ResourceString(rtype);
  1149.     rptr->type = ResourceDataType(rtype);
  1150.     if ( rptr->type != STRING && IsVariable(value)) {
  1151.         rptr->variable = True;
  1152.         rptr->varValue = SaveString(value);
  1153.     } else {
  1154.         switch(rptr->type) {
  1155.             case STRING:
  1156.                /***************************************************************
  1157.                 * if the string has a variable and its not a set command
  1158.                 * or related in any way to running jobs, assign the value to
  1159.                 * the variable field, else assign the value straight to
  1160.                 * the resource.
  1161.                 **************************************************************/
  1162.                 if ( rptr->variable && (strncmp(rptr->name,"set",3) ||
  1163.                      strncmp(rptr->name,"run",3) || 
  1164.                      strcmp(rptr->name,"commandarg"))) 
  1165.                     rptr->varValue = value;
  1166.                 else
  1167.                     rptr->val.cval = value;
  1168.                 break;
  1169.             case REAL:
  1170.                 rptr->val.dval = strtod(value,(char **)NULL);
  1171.                 break;
  1172.             case INTEGER:
  1173.                 rptr->val.ival = atoi(value);
  1174.                 break;
  1175.             case BOOLEAN:
  1176.                 rptr->val.bval = 
  1177.                 (((!strcmp(value,"True")) ||
  1178.                   (!strcmp(value,"true")) ||
  1179.                   (!strcmp(value,"On"))   ||
  1180.                   (!strcmp(value,"on")))  ? True:False);
  1181.                 break;
  1182.         }
  1183.     }
  1184. }
  1185.  
  1186. /***************************************************************
  1187.  * AddResource 
  1188.  * Add a value resource to a node. This function will add a 
  1189.  * resource node to any node type.
  1190.  **************************************************************/
  1191. AddResource(rptr,cptr,type,value,rtype) 
  1192.     Resource *rptr;
  1193.     caddr_t cptr;
  1194.     int type;
  1195.     char *value;
  1196.     int rtype;
  1197. {
  1198.     Resource *p;
  1199.  
  1200.     switch(type) {
  1201.         case ENVIRONMENT:
  1202.             {
  1203.             Environ *ptr = (Environ *)cptr;
  1204.  
  1205.             if ( ptr->resources == (Resource *)0 ) {
  1206.                 ptr->resources = rptr;
  1207.                 AddValue(ptr->resources,value,rtype);
  1208.                 return;
  1209.             }
  1210.             p = ptr->resources;
  1211.             while( p->next != (Resource *)0 )
  1212.                 p = p->next;
  1213.             p->next = rptr;
  1214.             AddValue(p->next,value,rtype);
  1215.             }
  1216.             break;
  1217.         case SHELL:
  1218.             {
  1219.             Shell *ptr = (Shell *)cptr;
  1220.  
  1221.             if ( ptr->resources == (Resource *)0 ) {
  1222.                 ptr->resources = rptr;
  1223.                 AddValue(ptr->resources,value,rtype);
  1224.                 return;
  1225.             }
  1226.             p = ptr->resources;
  1227.             while( p->next != (Resource *)0 )
  1228.                 p = p->next;
  1229.             p->next = rptr;
  1230.             AddValue(p->next,value,rtype);
  1231.             }
  1232.             break;
  1233.         case OBJECT:
  1234.             {
  1235.             InterfaceObject *ptr = (InterfaceObject *)cptr;
  1236.  
  1237.             if ( ptr->resources == (Resource *)0 ) {
  1238.                 ptr->resources = rptr;
  1239.                 AddValue(ptr->resources,value,rtype);
  1240.                 return;
  1241.             }
  1242.             p = ptr->resources;
  1243.             while( p->next != (Resource *)0 )
  1244.                 p = p->next;
  1245.             p->next = rptr;
  1246.             AddValue(p->next,value,rtype);
  1247.             }
  1248.             break;
  1249.         default:
  1250.             XgenFatalError("AddResource","invalid resource type");
  1251.     }
  1252. }
  1253.  
  1254. /***************************************************************
  1255.  * AddObject 
  1256.  * Add an object node to a shell node.
  1257.  **************************************************************/
  1258. AddObject(optr,sptr) 
  1259.     InterfaceObject *optr;
  1260.     Shell *sptr;
  1261. {
  1262.     InterfaceObject *p;
  1263.  
  1264.     if ( sptr->objects == (InterfaceObject *)0 ) {
  1265.         sptr->objects = optr;
  1266.         return;
  1267.     }
  1268.     p = sptr->objects;
  1269.     while( p->next != (InterfaceObject *)0 )
  1270.         p = p->next;
  1271.     p->next = optr;
  1272. }
  1273.  
  1274. /***************************************************************
  1275.  * AddPulldownObject 
  1276.  * Add an object node to a pulldown object node.
  1277.  **************************************************************/
  1278. AddPulldownObject(optr,pptr) 
  1279.     InterfaceObject *optr;
  1280.     InterfaceObject *pptr;
  1281. {
  1282.     InterfaceObject *p;
  1283.  
  1284.     if ( pptr->objects == (InterfaceObject *)0 ) {
  1285.         pptr->objects = optr;
  1286.         return;
  1287.     }
  1288.     p = pptr->objects;
  1289.     while( p->next != (InterfaceObject *)0 )
  1290.         p = p->next;
  1291.     p->next = optr;
  1292. }
  1293.  
  1294. /***************************************************************
  1295.  * AddShell 
  1296.  * Add an shell node to a environment node.
  1297.  **************************************************************/
  1298. AddShell(sptr,eptr)
  1299.     Shell *sptr;
  1300.     Environ *eptr;
  1301. {
  1302.     Shell *p;
  1303.  
  1304.     if ( eptr->shells == (Shell *)0 ) {
  1305.         eptr->shells = sptr;
  1306.         return;
  1307.     }
  1308.     p = eptr->shells;
  1309.     while( p->next != (Shell *)0 )
  1310.         p = p->next;
  1311.     p->next = sptr;
  1312. }
  1313.  
  1314. /***************************************************************
  1315.  * AddEnviron 
  1316.  * Add an environment node to the global list.
  1317.  **************************************************************/
  1318. AddEnviron(eptr) 
  1319.     Environ *eptr;
  1320. {
  1321.     Environ *p; 
  1322.  
  1323.     if ( xgenGD.toplevelEnv == (Environ *)0 ) {
  1324.         xgenGD.toplevelEnv = eptr;
  1325.         return;
  1326.     }
  1327.     p = xgenGD.toplevelEnv;
  1328.     while( p->next != (Environ *)0 )
  1329.         p = p->next;
  1330.     p->next = eptr;
  1331. }
  1332. @//E*O*F ./xgen/src/addnode.c//
  1333. chmod u=rw,g=r,o=r ./xgen/src/addnode.c
  1334.  
  1335. echo Inspecting for damage in transit...
  1336. temp=/tmp/shar$$; dtemp=/tmp/.shar$$
  1337. trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
  1338. cat > $temp <<\!!!
  1339.      160     628    5503 procmess.c
  1340.      120     530    6052 resource.h
  1341.      135     521    5459 sensitive.c
  1342.      220     586    6987 control.c
  1343.      218     716    7040 docapture.c
  1344.      197     643    6853 popup.c
  1345.      226     756    7433 addnode.c
  1346.     1276    4380   45327 total
  1347. !!!
  1348. wc  ./xgen/src/procmess.c ./xgen/src/resource.h ./xgen/src/sensitive.c ./xgen/src/control.c ./xgen/src/docapture.c ./xgen/src/popup.c ./xgen/src/addnode.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
  1349. if [ -s $dtemp ]
  1350. then echo "Ouch [diff of wc output]:" ; cat $dtemp
  1351. else echo "No problems found."
  1352. fi
  1353. exit 0
  1354.  
  1355. --
  1356. Dan Heller
  1357. Z-Code Software    O'Reilly && Associates       Comp-sources-x:
  1358. President          Senior Writer                comp-sources-x@uunet.uu.net
  1359. argv@z-code.com    argv@ora.com                 [^^^  this address only!]
  1360.