home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / exedit / part01 next >
Text File  |  1990-10-23  |  66KB  |  2,506 lines

  1. Path: uunet!know!cs.utexas.edu!sun-barr!newstop!sun!arp.anu.oz.au
  2. From: gustav@arp.anu.oz.au (Zdzislaw Meglicki)
  3. Newsgroups: comp.sources.x
  4. Subject: v10i011: exedit, Part01/01
  5. Message-ID: <144113@sun.Eng.Sun.COM>
  6. Date: 24 Oct 90 08:31:26 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2495
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: gustav@arp.anu.oz.au (Zdzislaw Meglicki)
  12. Posting-number: Volume 10, Issue 11
  13. Archive-name: exedit/part01
  14.  
  15. [ moderator's note:
  16.     This was originally posted as Volume 9, Issue 65, but just about
  17.     every news site doesn't have it, so I'm reposting it.  I'm not
  18.     posting it as a "REPOST" because the autho sent me an updated
  19.     version.  So, archive sites should scrap issue 65 from vol 9
  20.     and leave a hole :-)  --dan
  21. ]
  22.  
  23.                Program  exedit is  based  on  the  MIT  X11R4  program
  24.           xedit.   Exedit  adds  some  new  functionality  to  xedit -
  25.           mainly in the area of communicating with other processes. If
  26.           you have ever worked with Apple's  MPW shell you will recog-
  27.           nize some similarity.  Exedit, like  MPW  shell,  allows  to
  28.           execute shell commands and selected programs from within the
  29.           editing environment of xedit. When you  start  exedit,  your
  30.           shell  of  choice,  as  defined by the evironmental variable
  31.           SHELL, is invoked in the background.  If  you  have  a  file
  32.           called   .exeditrc in your HOME directory, this file will be
  33.           sourced into your shell. Whenever you type Shift-Return, the
  34.           whole  line  on which the cursor resides will be sent to the
  35.           shell. If that line begins with a prompt string, you can ask
  36.           exedit  to  skip that string by making an appropriate selec-
  37.           tion from the  prompts menu. If you have made a text  selec-
  38.           tion  in  the editing window and you press  Shift-Return the
  39.           whole selection will be sent to the shell. But  prompt  will
  40.           not  be  skipped in this case. You can send a complex multi-
  41.           line commands to the shell this way. You can even paste such
  42.           multiline  commands  by selecting various parts from various
  43.           places in your input file.
  44.  
  45. ============================== cut here =================================
  46. # This is a shell archive.  Remove anything before this line
  47. # then unpack it by saving it in a file and typing "sh file"
  48. # (Files unpacked will be owned by you and have default permissions).
  49. # This archive contains the following files:
  50. #    ./exedit.0.91/exedit.c
  51. #    ./exedit.0.91/EXedit.ad
  52. #    ./exedit.0.91/Imakefile
  53. #    ./exedit.0.91/Makefile
  54. #    ./exedit.0.91/README
  55. #    ./exedit.0.91/exedit.man
  56. #    ./exedit.0.91/patchlevel.h
  57. #
  58. if `test ! -d ./exedit.0.91`
  59. then
  60.   mkdir ./exedit.0.91
  61.   echo "mkdir ./exedit.0.91"
  62. fi
  63. if `test ! -s ./exedit.0.91/exedit.c`
  64. then
  65. echo "writing ./exedit.0.91/exedit.c"
  66. cat > ./exedit.0.91/exedit.c << '\Rogue\Monster\'
  67.  
  68. #if(0)
  69. FTANGLE         v1 .13 a, tangled with SunOS / UNIX on "Tuesday, August 7, 1990 at 23:52."
  70.                 COMMAND LINE:"ftangle exedit"
  71.                 RUN TIME:"Tuesday, October 23, 1990 at 15:50."
  72.                 WEB FILE NAME:"exedit.web"
  73.                 CHANGE FILE NAME:"/dev/null"
  74. #endif
  75.  
  76. /* 1: */
  77. #line 148 "exedit.web"
  78.  
  79.  
  80. #ifndef lint
  81. static char     src_id[] =
  82. "$ANU: exedit.c, v 0.91, 3 Oct 90, 23:36:48 UTC, gustav@arp.anu.oz.au$";
  83.  
  84. #endif
  85.  
  86. /*
  87.  * \ COPYRIGHT 1987, \ DIGITAL EQUIPMENT CORPORATION, \ MAYNARD,
  88.  * MASSACHUSETTS, \ ALL RIGHTS RESERVED. \ \ THE INFORMATION IN THIS SOFTWARE
  89.  * IS SUBJECT TO CHANGE WITHOUT NOTICE AND \ SHOULD NOT BE CONSTRUED AS A
  90.  * COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. \ DIGITAL MAKES NO
  91.  * REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR \ ANY PURPOSE.
  92.  * IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. \ \ IF THE
  93.  * SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, \
  94.  * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO
  95.  * THAT \ SET FORTH ABOVE. \ \ \ Permission to use, copy, modify, and
  96.  * distribute this software and its \ documentation for any purpose and
  97.  * without fee is hereby granted, provided \ that the above copyright notice
  98.  * appear in all copies and that both that \ copyright notice and this
  99.  * permission notice appear in supporting \ documentation, and that the name
  100.  * of Digital Equipment Corporation not be \ used in advertising or publicity
  101.  * pertaining to distribution of the software \ without specific, written
  102.  * prior permission. \ \
  103.  */
  104.  
  105. /* :1 *//* 2: */
  106. #line 184 "exedit.web"
  107.  
  108.  
  109. /*
  110.  * \ COPYRIGHT 1990, \ THE AUSTRALIAN NATIONAL UNIVERSITY, \ CANBERRA,
  111.  * AUSTRALIAN CAPITAL TERRITORY, \ AUSTRALIA, \ ALL RIGHTS RESERVED. \ \ THE
  112.  * INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND \
  113.  * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY THE AUSTRALIAN NATIONAL
  114.  * UNIVERSITY. \ THE AUSTRALIAN NATIONAL UNIVERSITY MAKES NO REPRESENTATIONS
  115.  * ABOUT THE \ SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE.  IT IS SUPPLIED
  116.  * "AS IS" WITHOUT \ EXPRESS OR IMPLIED WARRANTY. \ \ IF THE SOFTWARE IS
  117.  * MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, \ APPROPRIATE
  118.  * LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT \ SET
  119.  * FORTH ABOVE. \ \ \ Permission to use, copy, modify, and distribute this
  120.  * software and its \ documentation for any purpose and without fee is hereby
  121.  * granted, provided \ that the above copyright notice appear in all copies
  122.  * and that both that \ copyright notice and this permission notice appear in
  123.  * supporting \ documentation, and that the name of the Australian National
  124.  * University not be \ used in advertising or publicity pertaining to
  125.  * distribution of the software \ without specific, written prior permission.
  126.  * \ \
  127.  */
  128.  
  129.  
  130. /* :2 *//* 3: */
  131. #line 228 "exedit.web"
  132.  
  133.  
  134. /* 6: */
  135. #line 335 "exedit.web"
  136.  
  137.  
  138. #include <stdio.h>
  139. #include <X11/Intrinsic.h>
  140. #include <X11/StringDefs.h>
  141. #include <X11/cursorfont.h>
  142. #include <X11/Xatom.h>
  143. #include <X11/Xaw/Box.h>
  144. #include <X11/Xaw/Command.h>
  145. #include <X11/Xaw/Label.h>
  146. #include <X11/Xaw/AsciiText.h>
  147. #include <X11/Xaw/Paned.h>
  148. #include <X11/Xaw/Viewport.h>
  149. #include <X11/Xaw/Cardinals.h>
  150.  
  151. /* :6 */
  152. #line 230 "exedit.web"
  153.  
  154.  
  155. /* 5: */
  156. #line 327 "exedit.web"
  157.  
  158.  
  159. Widget          top;
  160.  
  161. /* :5 *//* 7: */
  162. #line 393 "exedit.web"
  163.  
  164.  
  165. #define EXedit
  166.  
  167. Display        *CurDpy;
  168.  
  169. struct _app_resources
  170. {
  171.    Boolean         enableBackups;
  172.    char           *backupNamePrefix;
  173.    char           *backupNameSuffix;
  174.  
  175. #ifdef EXedit
  176.    char           *prompt1;
  177.    char           *prompt2;
  178.    char           *prompt3;
  179.    char           *prompt4;
  180.    char           *prompt5;
  181.    char           *prompt6;
  182.    char           *prompt7;
  183.    char           *prompt8;
  184.    char           *prompt9;
  185. #endif
  186. }               app_resources;
  187.  
  188. #define offset(field) XtOffset(struct _app_resources*, field)
  189. XtResource      resources[] = {
  190.    {"enableBackups", "EnableBackups", XtRBoolean, sizeof(Boolean),
  191.    offset(enableBackups), XtRImmediate, FALSE},
  192.    {"backupNamePrefix", "BackupNamePrefix", XtRString, sizeof(char *),
  193.    offset(backupNamePrefix), XtRString, ""},
  194.    {"backupNameSuffix", "BackupNameSuffix", XtRString, sizeof(char *),
  195.    offset(backupNameSuffix), XtRString, ".BAK"},
  196.  
  197. #ifdef EXedit
  198.    {"prompt1", "Prompt1", XtRString, sizeof(char *),
  199.    offset(prompt1), XtRString, "none"},
  200.    {"prompt2", "Prompt2", XtRString, sizeof(char *),
  201.    offset(prompt2), XtRString, "$"},
  202.    {"prompt3", "Prompt3", XtRString, sizeof(char *),
  203.    offset(prompt3), XtRString, "%"},
  204.    {"prompt4", "Prompt4", XtRString, sizeof(char *),
  205.    offset(prompt4), XtRString, "#"},
  206.    {"prompt5", "Prompt5", XtRString, sizeof(char *),
  207.    offset(prompt5), XtRString, ">"},
  208.    {"prompt6", "Prompt6", XtRString, sizeof(char *),
  209.    offset(prompt6), XtRString, ":"},
  210.    {"prompt7", "Prompt7", XtRString, sizeof(char *),
  211.    offset(prompt7), XtRString, "-"},
  212.    {"prompt8", "Prompt8", XtRString, sizeof(char *),
  213.    offset(prompt8), XtRString, "?"},
  214.    {"prompt9", "Prompt9", XtRString, sizeof(char *),
  215.    offset(prompt9), XtRString, "]"},
  216. #endif
  217. };
  218.  
  219. #undef offset
  220.  
  221. /* :7 *//* 10: */
  222. #line 528 "exedit.web"
  223.  
  224.  
  225. typedef enum
  226. {
  227.    NO_READ, READ_OK, WRITE_OK
  228. }               FileAccess;
  229.  
  230. /* :10 *//* 17: */
  231. #line 817 "exedit.web"
  232.  
  233.  
  234. void            DoQuit();
  235. void            DoSave();
  236. void            DoLoad();
  237. Widget          filenamewindow;
  238.  
  239. /* :17 *//* 19: */
  240. #line 866 "exedit.web"
  241.  
  242.  
  243. Widget          messwidget;
  244. Widget          labelwindow;
  245.  
  246. /* :19 *//* 21: */
  247. #line 895 "exedit.web"
  248.  
  249.  
  250. Widget          textwindow;
  251. void            ResetSourceChanged();
  252.  
  253. /* :21 *//* 25: */
  254. #line 1024 "exedit.web"
  255.  
  256.  
  257. Boolean         source_changed = FALSE;
  258.  
  259. /* :25 *//* 27: */
  260. #line 1086 "exedit.web"
  261.  
  262.  
  263. Boolean         double_click = FALSE;
  264.  
  265. /* :27 *//* 40: */
  266. #line 1571 "exedit.web"
  267.  
  268.  
  269. typedef enum
  270. {
  271.    IN_PLACE, APPEND
  272. }               PrintMode;
  273.  
  274. /* :40 *//* 49: */
  275. #line 2010 "exedit.web"
  276.  
  277.  
  278. #include <signal.h>
  279.  
  280. int             master, child;
  281. extern int      errno;
  282.  
  283. /* :49 *//* 64: */
  284. #line 2621 "exedit.web"
  285.  
  286.  
  287. #include <X11/Xaw/MenuButton.h>
  288. #include <X11/Xaw/SimpleMenu.h>
  289. #include <X11/Xaw/SmeBSB.h>
  290. #include <X11/Xaw/SmeLine.h>
  291.  
  292. #define NUM_MENU_ITEMS 3
  293.  
  294. String          menu_entry_names[NUM_MENU_ITEMS] = {
  295.    "append",
  296.    "verbose",
  297.    "debug",
  298. };
  299.  
  300. #define P_NUM_MENU_ITEMS 9
  301.  
  302. String          p_menu_entry_names[P_NUM_MENU_ITEMS] = {
  303.    "long_prompt",
  304.    "long_prompt",
  305.    "long_prompt",
  306.    "long_prompt",
  307.    "long_prompt",
  308.    "long_prompt",
  309.    "long_prompt",
  310.    "long_prompt",
  311.    "long_prompt",
  312. };
  313.  
  314. Widget          p_entry[P_NUM_MENU_ITEMS];
  315. char            prompt[BUFSIZ] = "long_prompt";
  316.  
  317. Boolean         status[NUM_MENU_ITEMS] = {FALSE, FALSE, FALSE,};
  318. Boolean         p_status[P_NUM_MENU_ITEMS] = {TRUE, FALSE, FALSE, FALSE,
  319.    FALSE, FALSE, FALSE, FALSE,
  320. FALSE};
  321.  
  322. #define checkmark_width 10
  323. #define checkmark_height 10
  324. static char     checkmark_bits[] = {
  325.    0x00, 0x02, 0x00, 0x03, 0x80, 0x01, 0x80, 0x01, 0xc6, 0x00, 0xcc, 0x00,
  326. 0x78, 0x00, 0x78, 0x00, 0x30, 0x00, 0x30, 0x00};
  327. static Pixmap   mark;
  328.  
  329. /* :64 */
  330. #line 232 "exedit.web"
  331.  
  332.  
  333. void 
  334. main(argc, argv)
  335.    int             argc;
  336.    char          **argv;
  337.  
  338. {
  339.  
  340.    /* 8: */
  341. #line 469 "exedit.web"
  342.  
  343.  
  344.    String          filename = NULL;
  345.    extern void     makeButtonsAndBoxes();
  346.    extern FileAccess CheckFilePermissions();
  347.  
  348.    /* :8 *//* 43: */
  349. #line 1637 "exedit.web"
  350.  
  351.  
  352.    extern void     WriteToShell();
  353.  
  354.    static XtActionsRec the_actions[] = {
  355.    {"shell", WriteToShell},};
  356.  
  357.    /* :43 *//* 50: */
  358. #line 2019 "exedit.web"
  359.  
  360.  
  361.    extern int      GetMaster();
  362.  
  363.    /* :50 *//* 58: */
  364. #line 2387 "exedit.web"
  365.  
  366.  
  367.    extern void     SendDirect();
  368.  
  369.    static XtActionsRec more_actions[] = {{"direct", SendDirect},};
  370.  
  371.    /* :58 */
  372. #line 240 "exedit.web"
  373.  
  374.  
  375.    /* 48: */
  376. #line 1986 "exedit.web"
  377.  
  378.  
  379.    if ((master = GetMaster()) <= 0)
  380.    {
  381.       perror("exedit: cannot open a pseudo-terminal");
  382.       exit(errno);
  383.    }
  384.    if ((child = fork()) < 0)
  385.    {
  386.       perror("exedit: cannot fork");
  387.       exit(errno);
  388.    }
  389.    if (child == 0)
  390.    {
  391.       /* This is the child process */
  392.  
  393.       /* 52: */
  394. #line 2115 "exedit.web"
  395.  
  396.  
  397.       int             grandchild;
  398.       extern void     DoShell(), WakeUp();
  399.  
  400.       signal(SIGALRM, WakeUp);
  401.  
  402. #if(0)
  403.       alarm(10);
  404. #endif
  405.  
  406.       pause();
  407.  
  408.       DoShell();
  409.  
  410.       /* :52 */
  411. #line 2001 "exedit.web"
  412.  
  413.  
  414.       exit;
  415.    }
  416.    /* The rest is the parent. The child must exit before it gets here. */
  417.  
  418.    /* :48 */
  419. #line 242 "exedit.web"
  420.  
  421.  
  422.    /* 4: */
  423. #line 309 "exedit.web"
  424.  
  425.  
  426.    top = XtInitialize("exedit", "EXedit", NULL, 0, &argc, argv);
  427.    XtGetApplicationResources(top, &app_resources, resources,
  428.                  XtNumber(resources), NULL, 0);
  429.    CurDpy = XtDisplay(top);
  430.  
  431.    /* :4 *//* 42: */
  432. #line 1607 "exedit.web"
  433.  
  434.  
  435.    XtAddActions(the_actions, XtNumber(the_actions));
  436.  
  437.    /* :42 *//* 59: */
  438. #line 2403 "exedit.web"
  439.  
  440.  
  441.    XtAddActions(more_actions, XtNumber(more_actions));
  442.  
  443.    /* :59 */
  444. #line 244 "exedit.web"
  445.  
  446.  
  447.    /* 9: */
  448. #line 495 "exedit.web"
  449.  
  450.  
  451.    if (argc > 1)
  452.    {
  453.       Boolean         exists;
  454.  
  455.       filename = argv[1];
  456.  
  457.       switch (CheckFilePermissions(filename, &exists))
  458.       {
  459.       case NO_READ:
  460.      if (exists)
  461.         fprintf(stderr,
  462.             "File %s exists, and could not opened for reading.\n",
  463.             filename);
  464.      else
  465.         fprintf(stderr, "File %s %s %s", filename, "does not exist,",
  466.             "and the directory could not be opened for writing.\n");
  467.      exit(1);
  468.       case READ_OK:
  469.       case WRITE_OK:
  470.      makeButtonsAndBoxes(top, filename);
  471.      break;
  472.       default:
  473.      fprintf(stderr, "%s %s", "Internal function MaybeCreateFile()",
  474.          "returned unexpected value.\n");
  475.      exit(1);
  476.       }
  477.    } else
  478.       makeButtonsAndBoxes(top, NULL);
  479.  
  480.    /* :9 */
  481. #line 246 "exedit.web"
  482.  
  483.  
  484.    /* 11: */
  485. #line 571 "exedit.web"
  486.  
  487.  
  488.    XtRealizeWidget(top);
  489.    XDefineCursor(CurDpy, XtWindow(top),
  490.          XCreateFontCursor(CurDpy, XC_left_ptr));
  491.  
  492.    /* 54: */
  493. #line 2172 "exedit.web"
  494.  
  495.  
  496.    {
  497.  
  498.       extern XtInputCallbackProc ReadPipe();
  499.       char            message[BUFSIZ];
  500.       extern void     XeditPrintf();
  501.  
  502.       sprintf(message, "shell pid = %d\n", (int) child);
  503.       XeditPrintf(messwidget, message, APPEND);
  504.  
  505.       XtAddInput(master, XtInputReadMask, ReadPipe, NULL);
  506.  
  507.       kill(child, SIGALRM);
  508.  
  509.    }
  510.  
  511.  
  512.    /* :54 */
  513. #line 577 "exedit.web"
  514.  
  515.  
  516.    XtMainLoop();
  517.  
  518.    /* :11 */
  519. #line 248 "exedit.web"
  520.  
  521.  
  522. }
  523.  
  524. /* :3 *//* 12: */
  525. #line 608 "exedit.web"
  526.  
  527.  
  528. #include <X11/Xos.h>
  529.  
  530. FileAccess 
  531. CheckFilePermissions(file, exists)
  532.  
  533.    char           *file;
  534.    Boolean        *exists;
  535.  
  536. {
  537.  
  538.    char            temp[BUFSIZ], *ptr;
  539.  
  540.    /* 13: */
  541. #line 632 "exedit.web"
  542.  
  543.  
  544.    if (access(file, F_OK) == 0)
  545.    {
  546.       *exists = TRUE;
  547.  
  548.       if (access(file, R_OK) != 0)
  549.      return (NO_READ);
  550.  
  551.       if (access(file, R_OK | W_OK) == 0)
  552.      return (WRITE_OK);
  553.  
  554.       return (READ_OK);
  555.    }
  556.    /* :13 */
  557. #line 621 "exedit.web"
  558.  
  559.  
  560.    /* 14: */
  561. #line 660 "exedit.web"
  562.  
  563.  
  564.    *exists = FALSE;
  565.  
  566.    strcpy(temp, file);
  567.    if ((ptr = rindex(temp, '/')) == NULL)
  568.       strcpy(temp, ".");
  569.    else
  570.       *ptr = '\0';
  571.  
  572.    if (access(temp, R_OK | W_OK | X_OK) == 0)
  573.       return (WRITE_OK);
  574.    return (NO_READ);
  575.  
  576.  
  577.    /* :14 */
  578. #line 623 "exedit.web"
  579.  
  580.  
  581. }
  582.  
  583. /* :12 *//* 15: */
  584. #line 715 "exedit.web"
  585.  
  586.  
  587. void 
  588. makeButtonsAndBoxes(parent, filename)
  589.    Widget          parent;
  590.    char           *filename;
  591.  
  592. {
  593.  
  594.    Widget          outer, b_row;
  595.    Arg             arglist[10];
  596.    Cardinal        num_args;
  597.    extern Widget   MakeCommandButton();
  598.    extern Widget   MakeStringBox();
  599.  
  600. #ifdef EXedit
  601.    Widget          m_row;
  602.  
  603. #endif
  604.  
  605.  
  606.    outer = XtCreateManagedWidget("paned", panedWidgetClass,
  607.                  parent, NULL, ZERO);
  608.  
  609.    /* 16: */
  610. #line 789 "exedit.web"
  611.  
  612.  
  613.    b_row = XtCreateManagedWidget("buttons", panedWidgetClass, outer, NULL, ZERO);
  614.    {
  615.       MakeCommandButton(b_row, "quit", DoQuit);
  616.       MakeCommandButton(b_row, "save", DoSave);
  617.       MakeCommandButton(b_row, "load", DoLoad);
  618.       filenamewindow = MakeStringBox(b_row, "filename", filename);
  619.    }
  620.  
  621. #ifndef EXedit
  622.    XtCreateManagedWidget("bc_label", labelWidgetClass, outer, NULL, ZERO);
  623.  
  624. #else
  625.  
  626.    m_row = XtCreateManagedWidget("menus", panedWidgetClass, outer, NULL, ZERO);
  627.    {
  628.       /* 61: */
  629. #line 2487 "exedit.web"
  630.  
  631.  
  632.       Widget          m_button, menu, entry, p_button, p_menu;
  633.       extern void     MenuSelect(), PMenuSelect();
  634.       extern Widget   p_entry[P_NUM_MENU_ITEMS];
  635.       Arg             arg_list[1];
  636.       Cardinal        i;
  637.  
  638.       mark = XCreateBitmapFromData(CurDpy, RootWindowOfScreen(XtScreen(top)),
  639.              checkmark_bits, checkmark_width, checkmark_height);
  640.  
  641.       /* 62: */
  642. #line 2530 "exedit.web"
  643.  
  644.  
  645.       i = 0;
  646.       XtSetArg(arg_list[i], XtNmenuName, "menu");
  647.       i++;
  648.  
  649. #if(0)
  650.       m_button = XtCreateManagedWidget("settings", menuButtonWidgetClass,
  651.                        m_row, arg_list, i);
  652. #endif
  653.  
  654.       m_button = XtCreateManagedWidget("settings", menuButtonWidgetClass,
  655.                        b_row, arg_list, i);
  656.       menu = XtCreatePopupShell("menu", simpleMenuWidgetClass, m_button,
  657.                 NULL, NULL);
  658.  
  659.       for (i = 0; i < NUM_MENU_ITEMS; i++)
  660.       {
  661.      String          item = menu_entry_names[i];
  662.  
  663.      entry = XtCreateManagedWidget(item, smeBSBObjectClass,
  664.                        menu, NULL, NULL);
  665.      XtAddCallback(entry, XtNcallback, MenuSelect, (caddr_t) i);
  666.       }
  667.  
  668.  
  669.       /* :62 */
  670. #line 2498 "exedit.web"
  671.  
  672.  
  673.       /* 63: */
  674. #line 2563 "exedit.web"
  675.  
  676.  
  677.       i = 0;
  678.       XtSetArg(arg_list[i], XtNmenuName, "p_menu");
  679.       i++;
  680.  
  681. #if(0)
  682.       p_button = XtCreateManagedWidget("prompts", menuButtonWidgetClass,
  683.                        m_row, arg_list, i);
  684. #endif
  685.  
  686.       p_button = XtCreateManagedWidget("prompts", menuButtonWidgetClass,
  687.                        b_row, arg_list, i);
  688.       p_menu = XtCreatePopupShell("p_menu", simpleMenuWidgetClass, p_button,
  689.                   NULL, NULL);
  690.  
  691.       strcpy(p_menu_entry_names[0], app_resources.prompt1);
  692.       strcpy(p_menu_entry_names[1], app_resources.prompt2);
  693.       strcpy(p_menu_entry_names[2], app_resources.prompt3);
  694.       strcpy(p_menu_entry_names[3], app_resources.prompt4);
  695.       strcpy(p_menu_entry_names[4], app_resources.prompt5);
  696.       strcpy(p_menu_entry_names[5], app_resources.prompt6);
  697.       strcpy(p_menu_entry_names[6], app_resources.prompt7);
  698.       strcpy(p_menu_entry_names[7], app_resources.prompt8);
  699.       strcpy(p_menu_entry_names[8], app_resources.prompt9);
  700.       strcpy(prompt, app_resources.prompt1);
  701.  
  702.       for (i = 0; i < P_NUM_MENU_ITEMS; i++)
  703.       {
  704.  
  705.      String          item = p_menu_entry_names[i];
  706.  
  707.      p_entry[i] = XtCreateManagedWidget(item, smeBSBObjectClass,
  708.                         p_menu, NULL, NULL);
  709.      XtAddCallback(p_entry[i], XtNcallback, PMenuSelect, (caddr_t) i);
  710.       }
  711.  
  712.       i = 0;
  713.       XtSetArg(arg_list[i], XtNleftBitmap, mark);
  714.       i++;
  715.       XtSetValues(p_entry[0], arg_list, i);
  716.  
  717.       /* :63 */
  718. #line 2500 "exedit.web"
  719.  
  720.  
  721.  
  722.       /* :61 */
  723. #line 807 "exedit.web"
  724.  
  725.  
  726.       XtCreateManagedWidget("bc_label", labelWidgetClass, m_row, NULL, ZERO);
  727.    }
  728. #endif
  729.  
  730.    /* :16 */
  731. #line 739 "exedit.web"
  732.  
  733.  
  734.    /* 18: */
  735. #line 849 "exedit.web"
  736.  
  737.  
  738.    num_args = 0;
  739.    XtSetArg(arglist[num_args], XtNeditType, XawtextEdit);
  740.    num_args++;
  741.    messwidget = XtCreateManagedWidget("messageWindow", asciiTextWidgetClass,
  742.                       outer, arglist, num_args);
  743.  
  744.    num_args = 0;
  745.    if (filename != NULL)
  746.       XtSetArg(arglist[num_args], XtNlabel, filename);
  747.    num_args++;
  748.  
  749.    labelwindow = XtCreateManagedWidget("labelWindow", labelWidgetClass,
  750.                        outer, arglist, num_args);
  751.  
  752.    /* :18 */
  753. #line 741 "exedit.web"
  754.  
  755.  
  756.    /* 20: */
  757. #line 879 "exedit.web"
  758.  
  759.  
  760.    num_args = 0;
  761.    XtSetArg(arglist[num_args], XtNtype, XawAsciiFile);
  762.    num_args++;
  763.    XtSetArg(arglist[num_args], XtNeditType, XawtextEdit);
  764.    num_args++;
  765.    textwindow = XtCreateManagedWidget("editWindow", asciiTextWidgetClass,
  766.                       outer, arglist, num_args);
  767.  
  768.    if (filename != NULL)
  769.       DoLoad();
  770.    else
  771.       ResetSourceChanged(textwindow);
  772.  
  773.    /* :20 */
  774. #line 743 "exedit.web"
  775.  
  776.  
  777. }
  778.  
  779. /* :15 *//* 22: */
  780. #line 930 "exedit.web"
  781.  
  782.  
  783. Widget 
  784. MakeCommandButton(box, name, function)
  785.  
  786.    Widget          box;
  787.    char           *name;
  788.    XtCallbackProc  function;
  789.  
  790. {
  791.  
  792.    Widget          w = XtCreateManagedWidget(name, commandWidgetClass, box, NULL, ZERO);
  793.  
  794.    if (function != NULL)
  795.       XtAddCallback(w, XtNcallback, function, (caddr_t) NULL);
  796.    return w;
  797.  
  798. }
  799.  
  800. /* :22 *//* 23: */
  801. #line 957 "exedit.web"
  802.  
  803.  
  804. Widget 
  805. MakeStringBox(parent, name, string)
  806.    Widget          parent;
  807.    String          name, string;
  808. {
  809.  
  810.    Arg             args[5];
  811.    Cardinal        numargs = 0;
  812.    Widget          StringW;
  813.  
  814.    XtSetArg(args[numargs], XtNeditType, XawtextEdit);
  815.    numargs++;
  816.    XtSetArg(args[numargs], XtNstring, string);
  817.    numargs++;
  818.  
  819.    StringW = XtCreateManagedWidget(name, asciiTextWidgetClass,
  820.                    parent, args, numargs);
  821.    return (StringW);
  822.  
  823. }
  824.  
  825. /* :23 *//* 24: */
  826. #line 998 "exedit.web"
  827.  
  828.  
  829. void 
  830. SourceChanged(w, junk, garbage)
  831.    Widget          w;
  832.    XtPointer       junk, garbage;
  833.  
  834. {
  835.  
  836.    XtRemoveCallback(w, XtNcallback, SourceChanged, NULL);
  837.    source_changed = TRUE;
  838.  
  839. }
  840.  
  841. void 
  842. ResetSourceChanged(widget)
  843.    Widget          widget;
  844.  
  845. {
  846.  
  847.    XtAddCallback(XawTextGetSource(widget), XtNcallback, SourceChanged, NULL);
  848.    source_changed = FALSE;
  849.  
  850. }
  851.  
  852. /* :24 *//* 26: */
  853. #line 1051 "exedit.web"
  854.  
  855.  
  856. void 
  857. Feep()
  858.  
  859. {
  860.  
  861.    XBell(CurDpy, 0);
  862.  
  863. }
  864.  
  865. void 
  866. DoQuit()
  867.  
  868. {
  869.  
  870.    extern void     AddDoubleClickCallback();
  871.    extern void     XeditPrintf();
  872.    extern int      child;
  873.  
  874.    if (double_click || !source_changed)
  875.    {
  876.  
  877. #ifdef EXedit
  878.       killpg(getpgrp(child), SIGKILL);
  879. #endif
  880.  
  881.       exit(0);
  882.    }
  883.    XeditPrintf(messwidget, "Unsaved changes. Save them, or press Quit again.\n",
  884.            APPEND);
  885.    Feep();
  886.    double_click = TRUE;
  887.    AddDoubleClickCallback(textwindow, TRUE);
  888.  
  889. }
  890.  
  891. /* :26 *//* 28: */
  892. #line 1114 "exedit.web"
  893.  
  894.  
  895. void 
  896. AddDoubleClickCallback(w, state)
  897.    Widget          w;
  898.    Boolean         state;
  899.  
  900. {
  901.  
  902.    extern void     ResetDC();
  903.    Arg             args[1];
  904.    static XtCallbackRec cb[] = {{NULL, NULL}, {NULL, NULL}};
  905.  
  906.    if (state)
  907.       cb[0].callback = ResetDC;
  908.    else
  909.       cb[0].callback = NULL;
  910.  
  911.    XtSetArg(args[0], XtNcallback, cb);
  912.    XtSetValues(w, args, ONE);
  913.  
  914. }
  915.  
  916. void 
  917. ResetDC(w, junk, garbage)
  918.    Widget          w;
  919.    caddr_t         junk, garbage;
  920.  
  921. {
  922.  
  923.    double_click = FALSE;
  924.    AddDoubleClickCallback(w, FALSE);
  925.  
  926. }
  927.  
  928. /* :28 *//* 29: */
  929. #line 1157 "exedit.web"
  930.  
  931.  
  932. void 
  933. DoSave()
  934.  
  935. {
  936.  
  937.    extern String   GetString();
  938.    extern FileAccess MaybeCreateFile();
  939.    String          filename = GetString(filenamewindow);
  940.    char            buf[BUFSIZ];
  941.  
  942.    if ((filename == NULL) || (strlen(filename) == 0))
  943.    {
  944.       XeditPrintf(messwidget,
  945.           "Save: no file name specified -- nothing saved\n",
  946.           APPEND);
  947.       Feep();
  948.       return;
  949.    }
  950.    /* 31: */
  951. #line 1222 "exedit.web"
  952.  
  953.  
  954.    if (app_resources.enableBackups)
  955.    {
  956.  
  957.       extern char    *makeBackupName();
  958.       char            backup_file[BUFSIZ];
  959.  
  960.       makeBackupName(backup_file, filename);
  961.  
  962.       if (rename(filename, backup_file) != 0)
  963.       {
  964.      sprintf(buf, "error backing up file:  %s\n", backup_file);
  965.      XeditPrintf(messwidget, buf, APPEND);
  966.       }
  967.    }
  968.    /* :31 */
  969. #line 1176 "exedit.web"
  970.  
  971.  
  972.    /* 33: */
  973. #line 1272 "exedit.web"
  974.  
  975.  
  976.    switch (MaybeCreateFile(filename))
  977.    {
  978.    case NO_READ:
  979.    case READ_OK:
  980.       sprintf(buf, "File %s could not be opened for writing.\n", filename);
  981.       break;
  982.    case WRITE_OK:
  983.       if (XawAsciiSaveAsFile(XawTextGetSource(textwindow), filename))
  984.       {
  985.      sprintf(buf, "Saved file:  %s\n", filename);
  986.      ResetSourceChanged(textwindow);
  987.       } else
  988.      sprintf(buf, "Error saving file:  %s\n", filename);
  989.       break;
  990.    default:
  991.       sprintf(buf, "%s %s", "Internal function MaybeCreateFile()",
  992.           "returned unexpected value.\n");
  993.    }
  994.  
  995.    XeditPrintf(messwidget, buf, APPEND);
  996.  
  997.    /* :33 */
  998. #line 1178 "exedit.web"
  999.  
  1000.  
  1001. }
  1002.  
  1003. /* :29 *//* 30: */
  1004. #line 1194 "exedit.web"
  1005.  
  1006.  
  1007. String 
  1008. GetString(w)
  1009.    Widget          w;
  1010.  
  1011. {
  1012.  
  1013.    String          str;
  1014.    Arg             arglist[1];
  1015.  
  1016.    XtSetArg(arglist[0], XtNstring, &str);
  1017.    XtGetValues(w, arglist, ONE);
  1018.    return (str);
  1019.  
  1020. }
  1021.  
  1022. /* :30 *//* 32: */
  1023. #line 1245 "exedit.web"
  1024.  
  1025.  
  1026. char           *
  1027. makeBackupName(buf, filename)
  1028.    String          buf, filename;
  1029.  
  1030. {
  1031.  
  1032.    sprintf(buf, "%s%s%s", app_resources.backupNamePrefix,
  1033.        filename, app_resources.backupNameSuffix);
  1034.    return (buf);
  1035.  
  1036. }
  1037.  
  1038. /* :32 *//* 34: */
  1039. #line 1306 "exedit.web"
  1040.  
  1041.  
  1042. FileAccess 
  1043. MaybeCreateFile(file)
  1044.    char           *file;
  1045.  
  1046. {
  1047.  
  1048.    Boolean         exists;
  1049.  
  1050.    if (access(file, F_OK) != 0)
  1051.       creat(file, 0777);
  1052.  
  1053.    return (CheckFilePermissions(file, &exists));
  1054.  
  1055. }
  1056.  
  1057. /* :34 *//* 35: */
  1058. #line 1341 "exedit.web"
  1059.  
  1060.  
  1061. void 
  1062. DoLoad()
  1063.  
  1064. {
  1065.  
  1066.    Arg             args[5];
  1067.    Cardinal        num_args = 0;
  1068.    String          filename = GetString(filenamewindow);
  1069.    char            buf[BUFSIZ], label_buf[BUFSIZ];
  1070.  
  1071.    /* 36: */
  1072. #line 1374 "exedit.web"
  1073.  
  1074.  
  1075.    if (source_changed && !double_click)
  1076.    {
  1077.       XeditPrintf(messwidget,
  1078.           "Unsaved changes. Save them, or press Load again.\n",
  1079.           APPEND);
  1080.       Feep();
  1081.       double_click = TRUE;
  1082.       AddDoubleClickCallback(textwindow, TRUE);
  1083.       return;
  1084.    }
  1085.    /* :36 */
  1086. #line 1352 "exedit.web"
  1087.  
  1088.  
  1089.    /* 37: */
  1090. #line 1402 "exedit.web"
  1091.  
  1092.  
  1093.    double_click = FALSE;
  1094.  
  1095.    if ((filename != NULL) && (strlen(filename) > 0))
  1096.    {
  1097.       Boolean         exists;
  1098.  
  1099.       switch (CheckFilePermissions(filename, &exists))
  1100.       {
  1101.       case NO_READ:
  1102.      if (exists)
  1103.         sprintf(buf, "File %s, %s", filename,
  1104.             "exists, and could not be opened for reading.\n");
  1105.      else
  1106.         sprintf(buf, "File %s %s %s", filename, "does not exist, and",
  1107.             "the directory could not be opened for writing.\n");
  1108.  
  1109.      XeditPrintf(messwidget, buf, APPEND);
  1110.      Feep();
  1111.      return;
  1112.       case READ_OK:
  1113.      XtSetArg(args[num_args], XtNeditType, XawtextRead);
  1114.      num_args++;
  1115.      sprintf(label_buf, "%s       READ ONLY", filename);
  1116.      sprintf(buf, "File %s opened READ ONLY.\n", filename);
  1117.      break;
  1118.       case WRITE_OK:
  1119.      XtSetArg(args[num_args], XtNeditType, XawtextEdit);
  1120.      num_args++;
  1121.      sprintf(label_buf, "%s       Read - Write", filename);
  1122.      sprintf(buf, "File %s opened read - write.\n", filename);
  1123.      break;
  1124.       default:
  1125.      sprintf(buf, "%s %s", "Internal function MaybeCreateFile()",
  1126.          "returned unexpected value.\n");
  1127.      XeditPrintf(messwidget, buf, APPEND);
  1128.      return;
  1129.       }
  1130.  
  1131.       XeditPrintf(messwidget, buf, APPEND);
  1132.  
  1133.       if (exists)
  1134.       {
  1135.      XtSetArg(args[num_args], XtNstring, filename);
  1136.      num_args++;
  1137.       } else
  1138.       {
  1139.      XtSetArg(args[num_args], XtNstring, NULL);
  1140.      num_args++;
  1141.       }
  1142.  
  1143.       XtSetValues(textwindow, args, num_args);
  1144.  
  1145.       num_args = 0;
  1146.       XtSetArg(args[num_args], XtNlabel, label_buf);
  1147.       num_args++;
  1148.       XtSetValues(labelwindow, args, num_args);
  1149.       ResetSourceChanged(textwindow);
  1150.       return;
  1151.    }
  1152.    /* :37 */
  1153. #line 1354 "exedit.web"
  1154.  
  1155.  
  1156.    /* 38: */
  1157. #line 1459 "exedit.web"
  1158.  
  1159.  
  1160.    XeditPrintf(messwidget, "Load: No file specified.\n", APPEND);
  1161.    Feep();
  1162.  
  1163.    /* :38 */
  1164. #line 1356 "exedit.web"
  1165.  
  1166.  
  1167. }
  1168.  
  1169.  
  1170. /* :35 *//* 39: */
  1171. #line 1532 "exedit.web"
  1172.  
  1173.  
  1174. void 
  1175. XeditPrintf(w, str, mode)
  1176.    Widget          w;
  1177.    char           *str;
  1178.    PrintMode       mode;
  1179.  
  1180. {
  1181.  
  1182.    XawTextBlock    text;
  1183.    XawTextPosition pos;
  1184.  
  1185.    text.length = strlen(str);
  1186.    text.ptr = str;
  1187.    text.firstPos = 0;
  1188.    text.format = FMT8BIT;
  1189.  
  1190.    switch (mode)
  1191.    {
  1192.    case IN_PLACE:
  1193.       pos = XawTextSourceScan(XawTextGetSource(w),
  1194.                   XawTextGetInsertionPoint(w), XawstEOL,
  1195.                   XawsdRight, 1, FALSE);
  1196.       break;
  1197.    case APPEND:
  1198.       pos = XawTextSourceScan(XawTextGetSource(w),
  1199.                   XawTextGetInsertionPoint(w), XawstAll,
  1200.                   XawsdRight, 1, TRUE);
  1201.       break;
  1202.    }
  1203.  
  1204.    XawTextReplace(w, pos, pos, &text);
  1205.  
  1206.    pos += text.length;
  1207.    XawTextSetInsertionPoint(w, pos);
  1208.  
  1209. }
  1210.  
  1211. /* :39 *//* 44: */
  1212. #line 1681 "exedit.web"
  1213.  
  1214. void 
  1215. WriteToShell(w, event, params, num_params)
  1216.    Widget          w;
  1217.    XKeyPressedEvent *event;
  1218.    String         *params;
  1219.    Cardinal       *num_params;
  1220.  
  1221. {
  1222.    extern void     Feep(), XeditPrintf(), free();
  1223.    extern String   ReadSelection();
  1224.    extern Boolean  status[NUM_MENU_ITEMS];
  1225.    extern Widget   messwidget, textwindow;
  1226.    extern int      master;
  1227.    String          mystring;
  1228.    int             length;
  1229.  
  1230.    if ((mystring = ReadSelection(w)) != NULL)
  1231.    {
  1232.       length = strlen(mystring);
  1233.  
  1234.       if (status[2])
  1235.      fprintf(stderr, mystring);
  1236.       if (status[1])
  1237.      XeditPrintf(messwidget, mystring, APPEND);
  1238.       write(master, mystring, sizeof(char) * length);
  1239.  
  1240.       if (mystring[length - 1] != '\n')
  1241.       {
  1242.  
  1243.      if (status[2])
  1244.         fprintf(stderr, "\n");
  1245.      if (status[1])
  1246.         XeditPrintf(messwidget, "\n", APPEND);
  1247.      write(master, "\n", sizeof(char));
  1248.       }
  1249.       if (!status[0])
  1250.      XeditPrintf(textwindow, "\n", IN_PLACE);
  1251.       else
  1252.      XeditPrintf(textwindow, "\n", APPEND);
  1253.    }
  1254. }
  1255.  
  1256. /* :44 *//* 45: */
  1257. #line 1773 "exedit.web"
  1258.  
  1259.  
  1260. String 
  1261. ReadSelection(w)
  1262.    Widget          w;
  1263.  
  1264. {
  1265.  
  1266.    extern char    *malloc();
  1267.    extern char     prompt[BUFSIZ];
  1268.    extern char    *strchr();
  1269.    XawTextPosition begin_return, newbegin, end_return, length, newlength, returned, newreturned;
  1270.    static String   mystring, newstring;
  1271.    String          thestring;
  1272.    static int      lastsize = 0;
  1273.    XawTextBlock    text_block;
  1274.    Boolean         finished, single_line = FALSE;
  1275.    char           *ch;
  1276.  
  1277.    XawTextGetSelectionPos(w, &begin_return, &end_return);
  1278.  
  1279.    if (begin_return == end_return)
  1280.    {
  1281.  
  1282.       single_line = TRUE;
  1283.  
  1284.       /* 46: */
  1285. #line 1863 "exedit.web"
  1286.  
  1287.  
  1288.       begin_return = XawTextSourceScan(XawTextGetSource(w),
  1289.                        XawTextGetInsertionPoint(w),
  1290.                        XawstEOL, XawsdLeft, 1, FALSE);
  1291.       end_return = XawTextSourceScan(XawTextGetSource(w),
  1292.                      XawTextGetInsertionPoint(w),
  1293.                      XawstEOL, XawsdRight, 1, TRUE);
  1294.  
  1295.       /* :46 */
  1296. #line 1798 "exedit.web"
  1297.  
  1298.  
  1299.    }
  1300.    if (begin_return < end_return)
  1301.    {
  1302.  
  1303.       length = end_return - begin_return;
  1304.       if (length + 1 > lastsize)
  1305.       {
  1306.      lastsize = length + 1;
  1307.      mystring = malloc(lastsize * sizeof(char));
  1308.       }
  1309.       /* 47: */
  1310. #line 1925 "exedit.web"
  1311.  
  1312.  
  1313.       newbegin = begin_return;
  1314.       newlength = length;
  1315.       newstring = mystring;
  1316.       do
  1317.       {
  1318.      returned = XawTextSourceRead(XawTextGetSource(w), newbegin,
  1319.                       &text_block, newlength);
  1320.      if (returned < newlength)
  1321.      {
  1322.         strncpy(newstring, text_block.ptr, returned);
  1323.         if ((newreturned = strlen(newstring)) < returned)
  1324.            returned = newreturned;
  1325.         newstring += returned;
  1326.         newbegin += returned;
  1327.         newlength -= returned;
  1328.         finished = FALSE;
  1329.      } else
  1330.      {
  1331.         strncpy(newstring, text_block.ptr, newlength);
  1332.         if ((newreturned = strlen(newstring)) < newlength)
  1333.         {
  1334.            returned = newreturned;
  1335.            newstring += returned;
  1336.            newbegin += returned;
  1337.            newlength -=
  1338.           returned;
  1339.            finished = FALSE;
  1340.         } else
  1341.            finished = TRUE;
  1342.      }
  1343.       } while (!finished);
  1344.       *(mystring + length) = '\0';
  1345.  
  1346.       /* :47 */
  1347. #line 1810 "exedit.web"
  1348.  
  1349.  
  1350.       if (single_line)
  1351.       {
  1352.      if (strcmp(prompt, "none") != 0)
  1353.      {
  1354.         if ((ch = strchr(mystring, *prompt)) != NULL)
  1355.            thestring = ++ch;
  1356.         else
  1357.            thestring = mystring;
  1358.      } else
  1359.         thestring = mystring;
  1360.  
  1361.      if (*thestring == '\0')
  1362.      {
  1363.         *thestring = '\n';
  1364.         *(thestring + 1) = '\0';
  1365.      }
  1366.       } else
  1367.      thestring = mystring;
  1368.  
  1369.       return (thestring);
  1370.  
  1371.    } else
  1372.       return (NULL);
  1373.  
  1374. }
  1375.  
  1376. /* :45 *//* 51: */
  1377. #line 2059 "exedit.web"
  1378.  
  1379.  
  1380. #include <sys/types.h>
  1381. #include <sys/stat.h>
  1382. #include <sys/termios.h>
  1383.  
  1384. char           *line = "/dev/ptyXX";
  1385.  
  1386. struct termios  b;
  1387.  
  1388. int 
  1389. GetMaster()
  1390.  
  1391. {
  1392.  
  1393.    char            c;
  1394.    struct stat     stb;
  1395.    int             i, j;
  1396.  
  1397.    for (c = 'p'; c <= 's'; c++)
  1398.    {
  1399.       line[strlen("/dev/pty")] = c;
  1400.       line[strlen("/dev/ptyp")] = '0';
  1401.       if (stat(line, &stb) < 0)
  1402.      break;
  1403.       for (i = 0; i < 16; i++)
  1404.       {
  1405.      line[strlen("/dev/ptyp")] = "0123456789abcdef"[i];
  1406.      j = open(line, O_RDWR);
  1407.      if (j >= 0)
  1408.      {
  1409.         ioctl(0, TCGETS, &b);
  1410.         return (j);
  1411.      }
  1412.       }
  1413.    }
  1414.    return (-1);
  1415. }
  1416.  
  1417. /* :51 *//* 53: */
  1418. #line 2132 "exedit.web"
  1419.  
  1420.  
  1421. void 
  1422. WakeUp()
  1423. {
  1424.    alarm(0);
  1425. }
  1426.  
  1427. /* :53 *//* 55: */
  1428. #line 2224 "exedit.web"
  1429.  
  1430.  
  1431. void 
  1432. DoShell()
  1433. {
  1434.    int             t, slave;
  1435.    char           *shell;
  1436.    extern int      GetSlave();
  1437.    extern char    *getenv();
  1438.  
  1439.    if ((t = open("/dev/tty", O_RDWR)) >= 0)
  1440.    {
  1441.       ioctl(t, TIOCNOTTY, NULL);
  1442.       close(t);
  1443.    }
  1444.    if ((slave = GetSlave()) < 0)
  1445.    {
  1446.       perror("exedit: child: cannot open slave");
  1447.       exit(errno);
  1448.    }
  1449.    close(master);
  1450.    dup2(slave, 0);
  1451.    dup2(slave, 1);
  1452.    dup2(slave, 2);
  1453.    close(slave);
  1454.  
  1455.    if ((shell = getenv("SHELL")) == 0)
  1456.       shell = "/bin/sh";
  1457.  
  1458.    execl(shell, "sh", "-i", NULL);
  1459.  
  1460.    perror("exedit: grandchild: cannot exec shell");
  1461.    exit(errno);
  1462. }
  1463.  
  1464. /* :55 *//* 56: */
  1465. #line 2277 "exedit.web"
  1466.  
  1467.  
  1468. int 
  1469. GetSlave()
  1470. {
  1471.    int             slv;
  1472.  
  1473.    line[strlen("/dev/")] = 't';
  1474.  
  1475.    if ((slv = open(line, O_RDWR)) >= 0)
  1476.    {
  1477.       b.c_lflag &= ~ECHO;
  1478.       b.c_oflag &= ~ONLCR;
  1479.       b.c_oflag |= NLDLY | CRDLY | TAB2 | BSDLY | VTDLY | FFDLY;
  1480.       ioctl(slv, TCSETS, &b);
  1481.    }
  1482.    return (slv);
  1483. }
  1484.  
  1485. /* :56 *//* 57: */
  1486. #line 2327 "exedit.web"
  1487.  
  1488.  
  1489. #define MYBUF 4096
  1490.  
  1491. XtInputCallbackProc 
  1492. ReadPipe(client_data, fid, id)
  1493.    caddr_t         client_data;
  1494.    int            *fid;
  1495.    XtInputId      *id;
  1496.  
  1497. {
  1498.    char            pbuf[MYBUF];
  1499.    int             c;
  1500.    char           *shell_path, *shell, *exeditrc, *home, command[BUFSIZ];
  1501.    static Boolean  first = TRUE;
  1502.    extern char    *getenv();
  1503.    extern char    *strrchr();
  1504.  
  1505.    c = read(*fid, pbuf, sizeof(pbuf) - 1);
  1506.    pbuf[c] = '\0';
  1507.  
  1508.    if (first)
  1509.    {
  1510.       shell_path = getenv("SHELL");
  1511.       if ((shell = strrchr(shell_path, '/')) != NULL)
  1512.      shell++;
  1513.       else
  1514.      shell = shell_path;
  1515.       home = getenv("HOME");
  1516.       exeditrc = strcat(home, "/.exeditrc");
  1517.       if (access(exeditrc, R_OK) == 0)
  1518.       {
  1519.      if (strcmp(shell, "csh") == 0)
  1520.         sprintf(command, "source %s\n", exeditrc);
  1521.      else
  1522.         sprintf(command, ". %s\n", exeditrc);
  1523.      write(master, command, strlen(command));
  1524.       }
  1525.       first = FALSE;
  1526.  
  1527.    } else
  1528.    {
  1529.       if (status[2])
  1530.      fprintf(stderr, pbuf);
  1531.       if (status[1])
  1532.      XeditPrintf(messwidget, pbuf, APPEND);
  1533.       if (status[0])
  1534.      XeditPrintf(textwindow, pbuf, APPEND);
  1535.       else
  1536.      XeditPrintf(textwindow, pbuf, IN_PLACE);
  1537.    }
  1538.  
  1539.    XFlush(CurDpy);
  1540. }
  1541.  
  1542. /* :57 *//* 60: */
  1543. #line 2430 "exedit.web"
  1544.  
  1545.  
  1546. void 
  1547. SendDirect(w, event, params, num_params)
  1548.    Widget          w;
  1549.    XKeyEvent      *event;
  1550.    String         *params;
  1551.    Cardinal       *num_params;
  1552.  
  1553. {
  1554.    extern int      master;
  1555.    char            buffer[BUFSIZ];
  1556.    KeySym          keysym_return;
  1557.    XComposeStatus  status_in_out;
  1558.    int             length;
  1559.  
  1560.    if (event->type == KeyPress)
  1561.    {
  1562.       length = XLookupString(event, buffer, BUFSIZ, &keysym_return,
  1563.                  &status_in_out);
  1564.       buffer[length] = '\0';
  1565.       if (status[2])
  1566.       {
  1567.      fprintf(stderr, buffer);
  1568.      fflush(stderr);
  1569.       }
  1570.       if (status[1])
  1571.      XeditPrintf(messwidget, buffer, APPEND);
  1572.       write(master, buffer, length);
  1573.    }
  1574. }
  1575.  
  1576. /* :60 *//* 65: */
  1577. #line 2673 "exedit.web"
  1578.  
  1579.  
  1580. void 
  1581. MenuSelect(w, entry_number, garbage)
  1582.    Widget          w;
  1583.    int             entry_number;
  1584.    caddr_t         garbage;
  1585. {
  1586.    Arg             arglist[5];
  1587.    Cardinal        num_args = 0;
  1588.  
  1589.    if (status[entry_number])
  1590.    {
  1591.       XtSetArg(arglist[num_args], XtNleftBitmap, None);
  1592.       num_args++;
  1593.    } else
  1594.    {
  1595.       XtSetArg(arglist[num_args], XtNleftBitmap, mark);
  1596.       num_args++;
  1597.    }
  1598.  
  1599.    XtSetValues(w, arglist, num_args);
  1600.    status[entry_number] = !status[entry_number];
  1601. }
  1602.  
  1603. /* :65 *//* 66: */
  1604. #line 2710 "exedit.web"
  1605.  
  1606.  
  1607. void 
  1608. PMenuSelect(w, entry_number, garbage)
  1609.    Widget          w;
  1610.    int             entry_number;
  1611.    caddr_t         garbage;
  1612. {
  1613.    extern Widget   p_entry[P_NUM_MENU_ITEMS];
  1614.    extern char     prompt[BUFSIZ];
  1615.    extern Boolean  p_status[P_NUM_MENU_ITEMS];
  1616.    Arg             arglist[1];
  1617.    Cardinal        j = 0;
  1618.    int             i;
  1619.  
  1620.  
  1621.    for (i = 0; i < P_NUM_MENU_ITEMS; i++)
  1622.    {
  1623.       j = 0;
  1624.       XtSetArg(arglist[j], XtNleftBitmap, None);
  1625.       j++;
  1626.       XtSetValues(p_entry[i], arglist, j);
  1627.       p_status[i] = FALSE;
  1628.    }
  1629.  
  1630.  
  1631.    j = 0;
  1632.    XtSetArg(arglist[j], XtNleftBitmap, mark);
  1633.    j++;
  1634.    XtSetValues(w, arglist, j);
  1635.  
  1636.  
  1637.    p_status[entry_number] = TRUE;
  1638.  
  1639.  
  1640.    strcpy(prompt, XtName(w));
  1641. }
  1642.  
  1643.  
  1644. /* :66 */
  1645. \Rogue\Monster\
  1646. else
  1647.   echo "will not over write ./exedit.0.91/exedit.c"
  1648. fi
  1649. if `test ! -s ./exedit.0.91/EXedit.ad`
  1650. then
  1651. echo "writing ./exedit.0.91/EXedit.ad"
  1652. cat > ./exedit.0.91/EXedit.ad << '\Rogue\Monster\'
  1653. EXedit*input:                TRUE
  1654.  
  1655. EXedit*filename*preferredPaneSize:    360
  1656. EXedit*editWindow*preferredPaneSize:    650
  1657.  
  1658. EXedit*labelWindow*justify:        center
  1659. EXedit*labelWindow*label:        no file yet
  1660.  
  1661. EXedit*quit.label:            Quit
  1662. EXedit*save.label:            Save
  1663. EXedit*load.label:            Load
  1664.  
  1665. EXedit*buttons*orientation:        horizontal
  1666. EXedit*buttons*showGrip:        False
  1667.  
  1668. EXedit*menus*orientation:        horizontal
  1669. EXedit*menus*showGrip:            False
  1670. EXedit*SimpleMenu*leftMargin:           30
  1671. EXedit*SimpleMenu*rightMargin:          15
  1672.  
  1673. EXedit*messageWindow*preferredPaneSize:    50
  1674. EXedit*Paned*Text*allowResize:        True
  1675.  
  1676. EXedit*messageWindow.autoFill:        True
  1677. EXedit*messageWindow.scrollVertical:    Always
  1678. EXedit*messageWindow.scrollHorizontal:  WhenNeeded
  1679.  
  1680. EXedit*editWindow.autoFill:        True
  1681. EXedit*editWindow.scrollVertical:    Always
  1682. EXedit*editWindow.scrollHorizontal:     WhenNeeded
  1683.  
  1684. EXedit*bc_label*label:            Use Control-S and Control-R to Search.
  1685.  
  1686. #ifdef COLOR
  1687. EXedit*background: lightgrey
  1688. EXedit*editWindow.background: lightgrey
  1689. EXedit*messageWindow.background: lightgrey
  1690. EXedit*labelWindow.background: slategrey
  1691. EXedit*labelWindow.foreground: white
  1692. EXedit*buttons*background: slategray
  1693. EXedit*buttons*foreground: white
  1694. EXedit*buttons*Command.background: slategray
  1695. EXedit*buttons*Command.foreground: white
  1696. EXedit*buttons*MenuButton.background: slategray
  1697. EXedit*menus*background: slategray
  1698. EXedit*menus*foreground: white
  1699. #endif
  1700.  
  1701. !
  1702. ! Keep CR in filename window from confusing the user.
  1703. !
  1704.  
  1705. EXedit*filename.translations:    #override \
  1706.                 <Key>Return: end-of-line()
  1707.  
  1708. EXedit*editWindow.translations: #override \
  1709.                 Shift<Key>Return: shell() \n\
  1710.                 Button1<Key>: direct()
  1711. \Rogue\Monster\
  1712. else
  1713.   echo "will not over write ./exedit.0.91/EXedit.ad"
  1714. fi
  1715. if `test ! -s ./exedit.0.91/Imakefile`
  1716. then
  1717. echo "writing ./exedit.0.91/Imakefile"
  1718. cat > ./exedit.0.91/Imakefile << '\Rogue\Monster\'
  1719. #ifdef BandAidCompiler
  1720. #include BandAidCompiler
  1721. #endif
  1722.  
  1723.         DEPLIBS = XawClientDepLibs
  1724. LOCAL_LIBRARIES = XawClientLibs
  1725.   SYS_LIBRARIES = -lm
  1726.            SRCS = exedit.c 
  1727.            OBJS = exedit.o
  1728.  
  1729. ComplexProgramTarget(exedit)
  1730. InstallAppDefaults(EXedit)
  1731. \Rogue\Monster\
  1732. else
  1733.   echo "will not over write ./exedit.0.91/Imakefile"
  1734. fi
  1735. if `test ! -s ./exedit.0.91/Makefile`
  1736. then
  1737. echo "writing ./exedit.0.91/Makefile"
  1738. cat > ./exedit.0.91/Makefile << '\Rogue\Monster\'
  1739. # Makefile generated by imake - do not edit!
  1740. # $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
  1741. #
  1742. # The cpp used on this machine replaces all newlines and multiple tabs and
  1743. # spaces in a macro expansion with a single space.  Imake tries to compensate
  1744. # for this, but is not always successful.
  1745. #
  1746.  
  1747. ###########################################################################
  1748. # Makefile generated from "Imake.tmpl" and <Imakefile>
  1749. # $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
  1750. #
  1751. # Platform-specific parameters may be set in the appropriate .cf
  1752. # configuration files.  Site-wide parameters may be set in the file
  1753. # site.def.  Full rebuilds are recommended if any parameters are changed.
  1754. #
  1755. # If your C preprocessor doesn't define any unique symbols, you'll need
  1756. # to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
  1757. # "make Makefile", "make Makefiles", or "make World").
  1758. #
  1759. # If you absolutely can't get imake to work, you'll need to set the
  1760. # variables at the top of each Makefile as well as the dependencies at the
  1761. # bottom (makedepend will do this automatically).
  1762. #
  1763.  
  1764. ###########################################################################
  1765. # platform-specific configuration parameters - edit sun.cf to change
  1766.  
  1767. # platform:  $XConsortium: sun.cf,v 1.38 89/12/23 16:10:10 jim Exp $
  1768. # operating system:  SunOS 4.0.3
  1769.  
  1770. ###########################################################################
  1771. # site-specific configuration parameters - edit site.def to change
  1772.  
  1773. # site:  $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
  1774.  
  1775.             SHELL = /bin/sh
  1776.  
  1777.               TOP = .
  1778.       CURRENT_DIR = .
  1779.  
  1780.                AR = ar cq
  1781.   BOOTSTRAPCFLAGS =
  1782.                CC = cc
  1783.  
  1784.          COMPRESS = compress
  1785.               CPP = /lib/cpp $(STD_CPP_DEFINES)
  1786.     PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
  1787.           INSTALL = install
  1788.                LD = ld
  1789.              LINT = lint
  1790.       LINTLIBFLAG = -C
  1791.          LINTOPTS = -axz
  1792.                LN = ln -s
  1793.              MAKE = make
  1794.                MV = mv
  1795.                CP = cp
  1796.            RANLIB = ranlib
  1797.   RANLIBINSTFLAGS =
  1798.                RM = rm -f
  1799.      STD_INCLUDES =
  1800.   STD_CPP_DEFINES =
  1801.       STD_DEFINES =
  1802.  EXTRA_LOAD_FLAGS =
  1803.   EXTRA_LIBRARIES =
  1804.              TAGS = ctags
  1805.  
  1806.     SHAREDCODEDEF = -DSHAREDCODE
  1807.          SHLIBDEF = -DSUNSHLIB
  1808.  
  1809.     PROTO_DEFINES =
  1810.  
  1811.      INSTPGMFLAGS =
  1812.  
  1813.      INSTBINFLAGS = -m 0755
  1814.      INSTUIDFLAGS = -m 4755
  1815.      INSTLIBFLAGS = -m 0664
  1816.      INSTINCFLAGS = -m 0444
  1817.      INSTMANFLAGS = -m 0444
  1818.      INSTDATFLAGS = -m 0444
  1819.     INSTKMEMFLAGS = -m 4755
  1820.  
  1821.           DESTDIR =
  1822.  
  1823.      TOP_INCLUDES = -I$(INCROOT)
  1824.  
  1825.       CDEBUGFLAGS = -O
  1826.         CCOPTIONS =
  1827.       COMPATFLAGS = -DXAW_BC
  1828.  
  1829.       ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
  1830.        ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS)
  1831.            CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
  1832.         LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
  1833.            LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  1834.         LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
  1835.    LDCOMBINEFLAGS = -X -r
  1836.  
  1837.         MACROFILE = sun.cf
  1838.            RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
  1839.  
  1840.     IMAKE_DEFINES =
  1841.  
  1842.          IRULESRC = $(CONFIGDIR)
  1843.         IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
  1844.  
  1845.      ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
  1846.             $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
  1847.             $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
  1848.  
  1849. ###########################################################################
  1850. # X Window System Build Parameters
  1851. # $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
  1852.  
  1853. ###########################################################################
  1854. # X Window System make variables; this need to be coordinated with rules
  1855. # $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
  1856.  
  1857.           PATHSEP = /
  1858.         USRLIBDIR = $(DESTDIR)/usr/lib
  1859.            BINDIR = $(DESTDIR)/usr/bin/X11
  1860.           INCROOT = $(DESTDIR)/usr/include
  1861.      BUILDINCROOT = $(TOP)
  1862.       BUILDINCDIR = $(BUILDINCROOT)/X11
  1863.       BUILDINCTOP = ..
  1864.            INCDIR = $(INCROOT)/X11
  1865.            ADMDIR = $(DESTDIR)/usr/adm
  1866.            LIBDIR = $(USRLIBDIR)/X11
  1867.         CONFIGDIR = $(LIBDIR)/config
  1868.        LINTLIBDIR = $(USRLIBDIR)/lint
  1869.  
  1870.           FONTDIR = $(LIBDIR)/fonts
  1871.          XINITDIR = $(LIBDIR)/xinit
  1872.            XDMDIR = $(LIBDIR)/xdm
  1873.            AWMDIR = $(LIBDIR)/awm
  1874.            TWMDIR = $(LIBDIR)/twm
  1875.            GWMDIR = $(LIBDIR)/gwm
  1876.           MANPATH = $(DESTDIR)/usr/man
  1877.     MANSOURCEPATH = $(MANPATH)/man
  1878.            MANDIR = $(MANSOURCEPATH)n
  1879.         LIBMANDIR = $(MANSOURCEPATH)3
  1880.       XAPPLOADDIR = $(LIBDIR)/app-defaults
  1881.  
  1882.         SOXLIBREV = 4.2
  1883.           SOXTREV = 4.0
  1884.          SOXAWREV = 4.0
  1885.         SOOLDXREV = 4.0
  1886.          SOXMUREV = 4.0
  1887.         SOXEXTREV = 4.0
  1888.  
  1889.        FONTCFLAGS = -t
  1890.  
  1891.      INSTAPPFLAGS = $(INSTDATFLAGS)
  1892.  
  1893.             IMAKE = imake
  1894.            DEPEND = makedepend
  1895.               RGB = rgb
  1896.             FONTC = bdftosnf
  1897.         MKFONTDIR = mkfontdir
  1898.         MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier.sh
  1899.  
  1900.         CONFIGSRC = $(TOP)/config
  1901.         CLIENTSRC = $(TOP)/clients
  1902.           DEMOSRC = $(TOP)/demos
  1903.            LIBSRC = $(TOP)/lib
  1904.           FONTSRC = $(TOP)/fonts
  1905.        INCLUDESRC = $(TOP)/X11
  1906.         SERVERSRC = $(TOP)/server
  1907.           UTILSRC = $(TOP)/util
  1908.         SCRIPTSRC = $(UTILSRC)/scripts
  1909.        EXAMPLESRC = $(TOP)/examples
  1910.        CONTRIBSRC = $(TOP)/../contrib
  1911.            DOCSRC = $(TOP)/doc
  1912.            RGBSRC = $(TOP)/rgb
  1913.         DEPENDSRC = $(UTILSRC)/makedepend
  1914.          IMAKESRC = $(CONFIGSRC)
  1915.          XAUTHSRC = $(LIBSRC)/Xau
  1916.           XLIBSRC = $(LIBSRC)/X
  1917.            XMUSRC = $(LIBSRC)/Xmu
  1918.        TOOLKITSRC = $(LIBSRC)/Xt
  1919.        AWIDGETSRC = $(LIBSRC)/Xaw
  1920.        OLDXLIBSRC = $(LIBSRC)/oldX
  1921.       XDMCPLIBSRC = $(LIBSRC)/Xdmcp
  1922.       BDFTOSNFSRC = $(FONTSRC)/bdftosnf
  1923.      MKFONTDIRSRC = $(FONTSRC)/mkfontdir
  1924.      EXTENSIONSRC = $(TOP)/extensions
  1925.  
  1926.   DEPEXTENSIONLIB = $(USRLIBDIR)/libXext.a
  1927.      EXTENSIONLIB =  -lXext
  1928.  
  1929.           DEPXLIB = $(DEPEXTENSIONLIB)
  1930.              XLIB = $(EXTENSIONLIB) -lX11
  1931.  
  1932.       DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
  1933.          XAUTHLIB =  -lXau
  1934.  
  1935.         DEPXMULIB =
  1936.            XMULIB = -lXmu
  1937.  
  1938.        DEPOLDXLIB =
  1939.           OLDXLIB = -loldX
  1940.  
  1941.       DEPXTOOLLIB =
  1942.          XTOOLLIB = -lXt
  1943.  
  1944.         DEPXAWLIB =
  1945.            XAWLIB = -lXaw
  1946.  
  1947.  LINTEXTENSIONLIB = $(USRLIBDIR)/llib-lXext.ln
  1948.          LINTXLIB = $(USRLIBDIR)/llib-lX11.ln
  1949.           LINTXMU = $(USRLIBDIR)/llib-lXmu.ln
  1950.         LINTXTOOL = $(USRLIBDIR)/llib-lXt.ln
  1951.           LINTXAW = $(USRLIBDIR)/llib-lXaw.ln
  1952.  
  1953.         XWLIBSRC = $(CONTRIBSRC)/toolkits/Xw
  1954.         DEPXWLIB = $(USRLIBDIR)/libXw.a
  1955.         XWLIB =  -lXw
  1956.  
  1957.           DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
  1958.  
  1959.          DEPLIBS1 = $(DEPLIBS)
  1960.          DEPLIBS2 = $(DEPLIBS)
  1961.          DEPLIBS3 = $(DEPLIBS)
  1962.  
  1963. ###########################################################################
  1964. # Imake rules for building libraries, programs, scripts, and data files
  1965. # rules:  $XConsortium: Imake.rules,v 1.67 89/12/18 17:14:15 jim Exp $
  1966.  
  1967. ###########################################################################
  1968. # start of Imakefile
  1969.  
  1970.         DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
  1971. LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
  1972.   SYS_LIBRARIES = -lm
  1973.            SRCS = exedit.c
  1974.            OBJS = exedit.o
  1975.  
  1976.  PROGRAM = exedit
  1977.  
  1978. all:: exedit
  1979.  
  1980. exedit: $(OBJS) $(DEPLIBS)
  1981.     $(RM) $@
  1982.     $(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
  1983.  
  1984. saber_exedit:
  1985.     #load $(ALLDEFINES) $(SRCS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  1986.  
  1987. osaber_exedit:
  1988.     #load $(ALLDEFINES) $(OBJS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  1989.  
  1990. install:: exedit
  1991.     $(INSTALL) -c $(INSTPGMFLAGS)   exedit $(BINDIR)
  1992.  
  1993. install.man:: exedit.man
  1994.     $(INSTALL) -c $(INSTMANFLAGS) exedit.man $(MANDIR)/exedit.n
  1995.  
  1996. depend::
  1997.     $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
  1998.  
  1999. lint:
  2000.     $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
  2001. lint1:
  2002.     $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  2003.  
  2004. clean::
  2005.     $(RM) $(PROGRAM)
  2006.  
  2007. install:: EXedit.ad
  2008.     $(INSTALL) -c $(INSTAPPFLAGS) EXedit.ad $(XAPPLOADDIR)/EXedit
  2009.  
  2010. ###########################################################################
  2011. # common rules for all Makefiles - do not edit
  2012.  
  2013. emptyrule::
  2014.  
  2015. clean::
  2016.     $(RM_CMD) \#*
  2017.  
  2018. Makefile::
  2019.     -@if [ -f Makefile ]; then \
  2020.     echo "    $(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
  2021.     $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
  2022.     else exit 0; fi
  2023.     $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
  2024.  
  2025. tags::
  2026.     $(TAGS) -w *.[ch]
  2027.     $(TAGS) -xw *.[ch] > TAGS
  2028.  
  2029. saber:
  2030.     #load $(ALLDEFINES) $(SRCS)
  2031.  
  2032. osaber:
  2033.     #load $(ALLDEFINES) $(OBJS)
  2034.  
  2035. ###########################################################################
  2036. # empty rules for directories that do not have SUBDIRS - do not edit
  2037.  
  2038. install::
  2039.     @echo "install in $(CURRENT_DIR) done"
  2040.  
  2041. install.man::
  2042.     @echo "install.man in $(CURRENT_DIR) done"
  2043.  
  2044. Makefiles::
  2045.  
  2046. includes::
  2047.  
  2048. ###########################################################################
  2049. # dependencies generated by makedepend
  2050.  
  2051. # DO NOT DELETE
  2052.  
  2053. exedit.o: /usr/include/stdio.h /usr/include/X11/Intrinsic.h
  2054. exedit.o: /usr/include/X11/Xlib.h /usr/include/sys/types.h
  2055. exedit.o: /usr/include/sys/sysmacros.h /usr/include/X11/X.h
  2056. exedit.o: /usr/include/X11/Xutil.h /usr/include/X11/Xresource.h
  2057. exedit.o: /usr/include/X11/Xos.h /usr/include/strings.h
  2058. exedit.o: /usr/include/sys/file.h /usr/include/sys/fcntlcom.h
  2059. exedit.o: /usr/include/sys/time.h /usr/include/sys/time.h
  2060. exedit.o: /usr/include/X11/Core.h /usr/include/X11/Composite.h
  2061. exedit.o: /usr/include/X11/Constraint.h /usr/include/X11/Object.h
  2062. exedit.o: /usr/include/X11/RectObj.h /usr/include/X11/StringDefs.h
  2063. exedit.o: /usr/include/X11/cursorfont.h /usr/include/X11/Xatom.h
  2064. exedit.o: /usr/include/X11/Xaw/Box.h /usr/include/X11/Xaw/Command.h
  2065. exedit.o: /usr/include/X11/Xaw/Label.h /usr/include/X11/Xaw/Simple.h
  2066. exedit.o: /usr/include/X11/Xmu/Converters.h /usr/include/X11/Xaw/AsciiText.h
  2067. exedit.o: /usr/include/X11/Xaw/Text.h /usr/include/X11/Xaw/TextSink.h
  2068. exedit.o: /usr/include/X11/Xaw/TextSrc.h /usr/include/X11/Xaw/AsciiSrc.h
  2069. exedit.o: /usr/include/X11/Xaw/AsciiSink.h /usr/include/X11/Xaw/Paned.h
  2070. exedit.o: /usr/include/X11/Xaw/Viewport.h /usr/include/X11/Xaw/Form.h
  2071. exedit.o: /usr/include/X11/Xaw/Cardinals.h /usr/include/signal.h
  2072. exedit.o: /usr/include/vm/faultcode.h /usr/include/X11/Xaw/MenuButton.h
  2073. exedit.o: /usr/include/X11/Xaw/SimpleMenu.h /usr/include/X11/Shell.h
  2074. exedit.o: /usr/include/X11/Xaw/SmeBSB.h /usr/include/X11/Xaw/Sme.h
  2075. exedit.o: /usr/include/X11/Xaw/SmeLine.h /usr/include/sys/stat.h
  2076. exedit.o: /usr/include/sys/termios.h /usr/include/sys/ioccom.h
  2077. exedit.o: /usr/include/sys/ttydev.h /usr/include/sys/ttycom.h
  2078. \Rogue\Monster\
  2079. else
  2080.   echo "will not over write ./exedit.0.91/Makefile"
  2081. fi
  2082. if `test ! -s ./exedit.0.91/README`
  2083. then
  2084. echo "writing ./exedit.0.91/README"
  2085. cat > ./exedit.0.91/README << '\Rogue\Monster\'
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.           _A_b_o_u_t _e_x_e_d_i_t
  2093.  
  2094.                Program  _e_x_e_d_i_t is  based  on  the  MIT  X11R4  program
  2095.           _x_e_d_i_t.   _E_x_e_d_i_t  adds  some  new  functionality  to  _x_e_d_i_t -
  2096.           mainly in the area of communicating with other processes. If
  2097.           you have ever worked with Apple's  MPW shell you will recog-
  2098.           nize some similarity.  _E_x_e_d_i_t, like  MPW  shell,  allows  to
  2099.           execute shell commands and selected programs from within the
  2100.           editing environment of _x_e_d_i_t. When you  start  _e_x_e_d_i_t,  your
  2101.           shell  of  choice,  as  defined by the evironmental variable
  2102.           SHELL, is invoked in the background.  If  you  have  a  file
  2103.           called   ._e_x_e_d_i_t_r_c in your HOME directory, this file will be
  2104.           sourced into your shell. Whenever you type Shift-Return, the
  2105.           whole  line  on which the cursor resides will be sent to the
  2106.           shell. If that line begins with a prompt string, you can ask
  2107.           _e_x_e_d_i_t  to  skip that string by making an appropriate selec-
  2108.           tion from the  prompts menu. If you have made a text  selec-
  2109.           tion  in  the editing window and you press  Shift-Return the
  2110.           whole selection will be sent to the shell. But  prompt  will
  2111.           not  be  skipped in this case. You can send a complex multi-
  2112.           line commands to the shell this way. You can even paste such
  2113.           multiline  commands  by selecting various parts from various
  2114.           places in your input file.
  2115.  
  2116.                Apart from the delayed input mode,  i.e.,  select  text
  2117.           and  press Shift-Return, there is also a direct mode. If you
  2118.           press  Button 1 key on the mouse  together  with  any  other
  2119.           combination  of keys, including the control key, that combi-
  2120.           nation is sent to the shell directly. It will not be  echoed
  2121.           in your main editing window, but you can make it echo in the
  2122.           message window or on standard error. In  this  way  you  can
  2123.           type   Control-C, Control-D, your password, etc. If you have
  2124.           Alt, Hyper or Super keys available on your keyboard, you may
  2125.           find  it  preferable to use these as the modifier instead of
  2126.           Button 1. Note that the Meta key is used by the text  widget
  2127.           for  various  editing functions, and thus should not be used
  2128.           as the modifier while invoking the direct() action.
  2129.  
  2130.                There are two basic modes used for  printing  the  text
  2131.           returned  by  the  shell.  You can have it printed  in situ,
  2132.           i.e., on the line following the line you have just  sent  to
  2133.           the  shell,  or you can have the text appended at the end of
  2134.           the file, regardless of where the input line came from.  You
  2135.           can switch between these modes using the menu.
  2136.  
  2137.                Using the same menu you can also  select   verbose  and
  2138.           debug  options.  In  verbose  mode  whatever you send to the
  2139.           shell and whatever comes back is also printed in the message
  2140.           window  above the main editing window. This may be useful if
  2141.           you send long multiline commands combined from parts of text
  2142.           scattered  all  over  your main editing window or if you use
  2143.           the  Meta key to send some characters to the shell directly.
  2144.  
  2145.                In the debug mode whatever is sent  to  the  shell  and
  2146.  
  2147.  
  2148.  
  2149.                                 October 20, 1990
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155.                                      - 2 -
  2156.  
  2157.  
  2158.           whatever  comes back is printed on standard error  before it
  2159.           is printed on the editing window.
  2160.  
  2161.                Whatever applies to   _x_e_d_i_t  applies  also  to   _e_x_e_d_i_t
  2162.           including  the  resource definitions. The only difference is
  2163.           that the class name for  _e_x_e_d_i_t is  EXedit instead of Xedit.
  2164.           The additional resources are:
  2165.  
  2166.                      EXedit*Prompt1: ... , through
  2167.                      EXedit*Prompt9: ...
  2168.  
  2169.           which define the prompts that appear in  the  prompts  menu.
  2170.           These  should be set to one character long strings, the only
  2171.           exception being the  word  |"none"|.   The  string  defining
  2172.           Prompt1  becomes the default prompt when  _e_x_e_d_i_t is invoked.
  2173.           Selecting any particular prompt  character  from  that  menu
  2174.           will  result in  _e_x_e_d_i_t skipping over all characters preced-
  2175.           ing the selected prompt character including the prompt char-
  2176.           acter  itself  while sending the contents of the line to the
  2177.           shell.
  2178.  
  2179.                Although in principle  _e_x_e_d_i_t can  be  used  as   _x_t_e_r_m
  2180.           replacement  it  has  not  been  designed  exactly for that.
  2181.           Rather, it should be treated  as  a  kind  of  a  "sheet  of
  2182.           thought"  that  allows  to  edit and process various complex
  2183.           expressions and formulas. You would probably use it in  con-
  2184.           junction  with  interactive  programs  which have unfriendly
  2185.           user interfaces, for instance with theorem provers, calcula-
  2186.           tors  (such as bc), lisps, with metalanguage or with prolog.
  2187.           I use it myself frequently with _M_a_t_h_e_m_a_t_i_c_a and with theorem
  2188.           provers such as _H_O_L and _I_s_a_b_e_l_l_e.
  2189.  
  2190.                Because the background shell runs on the slave  end  of
  2191.           the  pseudo  terminal  pair, which is set accordingly to the
  2192.           settings  of  the  terminal  from  which   _e_x_e_d_i_t  has  been
  2193.           invoked,  if  _e_x_e_d_i_t is to be detached the invocation should
  2194.           be as follows:
  2195.  
  2196.                       exedit < /dev/tty > /dev/tty 2>&1 &
  2197.  
  2198.           under Bourne shell and
  2199.  
  2200.                       exedit < /dev/tty >& dev/tty &
  2201.  
  2202.           under C shell.
  2203.  
  2204.                _E_x_e_d_i_t is the result of  wrapping  up  additional  code
  2205.           around  standard _x_e_d_i_t written by Chris D. Peterson from the
  2206.           MIT X Consortium.  The wrap was written by Zdzislaw Meglicki
  2207.           from the Australian National University.
  2208.  
  2209.                The annotated FWEB source of _e_x_e_d_i_t and the correspond-
  2210.           ing  TeX file are available from arp.anu.oz.au (130.56.4.90)
  2211.           via  anonymous  ftp.  They  live   in   /ARP/exedit.0.91/doc
  2212.  
  2213.  
  2214.  
  2215.                                 October 20, 1990
  2216.  
  2217.  
  2218.  
  2219.  
  2220.  
  2221.                                      - 3 -
  2222.  
  2223.  
  2224.           directory.  The TeX file should be formatted with plain TeX.
  2225.           You will need the fwebmac.tex file which is also provided. I
  2226.           believe that the annotated source has some educational value
  2227.           and you may find it useful if you learn to program under  X,
  2228.           or if you would like to modify _e_x_e_d_i_t.
  2229.  
  2230.           _I_n_s_t_a_l_l_a_t_i_o_n
  2231.  
  2232.                To install _e_x_e_d_i_t go through the usual  X  compile  and
  2233.           install cycle:
  2234.  
  2235.                      % xmkmf
  2236.                      % make depend
  2237.                      % make
  2238.                      % make install
  2239.                      % make install.man
  2240.  
  2241.           I have compiled and tested _e_x_e_d_i_t only on the Suns (3 and 4)
  2242.           under  SunOS  4.0.1.  _E_x_e_d_i_t  relies  on the availability of
  2243.           pseudo terminals and uses system V termio  interface,  which
  2244.           under     SunOS     4.0.1     has    been    described    in
  2245.           /_u_s_r/_i_n_c_l_u_d_e/_s_y_s/_t_e_r_m_i_o_s._h. You will have problems if you do
  2246.           not have that file on your system.
  2247.  
  2248.                The version number 0.91 signifies a  "beta/pre-release"
  2249.           character  of _e_x_e_d_i_t.  Nevertheless, already at this stage I
  2250.           find it quite useful, hence the posting.
  2251.  
  2252.                In case of problems and/or new ideas contact
  2253.  
  2254.                   Gustav Meglicki, gustav@arp.anu.oz.au
  2255.                   Automated Reasoning Project, RSSS,
  2256.                      and Plasma Theory Group, RSPhysS,
  2257.                   The Australian National University,
  2258.                   G.P.O. Box 4, Canberra, A.C.T., 2601, Australia,
  2259.  
  2260.                   fax: (Australia)-6-249-0747
  2261.                   tel: (Australia)-6-249-0158
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.                                 October 20, 1990
  2282.  
  2283.  
  2284. \Rogue\Monster\
  2285. else
  2286.   echo "will not over write ./exedit.0.91/README"
  2287. fi
  2288. if `test ! -s ./exedit.0.91/exedit.man`
  2289. then
  2290. echo "writing ./exedit.0.91/exedit.man"
  2291. cat > ./exedit.0.91/exedit.man << '\Rogue\Monster\'
  2292. .TH EXEDIT 1 "Release 4" "X Version 11"
  2293. .SH NAME
  2294. exedit - simple X script facility
  2295. .SH SYNTAX
  2296. \fBexedit\fP [ \fI-toolkitoption\fP ...] [ filename ]
  2297. .SH OPTIONS
  2298. .I Exedit
  2299. accepts all of the standard X Toolkit command line
  2300. options (see \fIX(1)\fP).  The order of the command line options is
  2301. not important.
  2302. .TP 8
  2303. .I filename
  2304. Specifies the file that is to be loaded during start-up. This is the
  2305. file which will be edited. If a file is not specified,
  2306. .I exedit
  2307. lets you load a file or create a new file after it has started up.
  2308. .SH DESCRIPTION
  2309. .I Exedit
  2310. provides a window consisting of the following four areas:
  2311. .IP "Commands Section" 25
  2312. A set of commands that allow you to exit \fIexedit\fP, save the file, or
  2313. load a new file into the edit window, inform \fIexedit\fP about the
  2314. prompt, and set various I/O modes.
  2315. .IP "Message Window" 25
  2316. Displays \fIexedit\fP messages. In addition, this window can be used as
  2317. a scratch pad. 
  2318. .IP "Filename Display"
  2319. Displays the name of the file currently being edited, and whether this file
  2320. is \fIRead - Write\fP or \fIRead Only\fP.
  2321. .IP "Edit Window" 25
  2322. Displays the text of the file that you are editing or creating. Communicates
  2323. with the shell.
  2324. .SH EDITING
  2325. The Athena Text widget is used for the three sections of this
  2326. application that allow text input.  The characters typed will go to
  2327. the Text widget that the pointer cursor is currently over.  If the
  2328. pointer cursor is not over a text widget then the keypresses will have
  2329. no effect on the application.  This is also true for the special key
  2330. sequences that popup dialog widgets, so typing Control-S in the filename
  2331. widget will enable searching in that widget, not the edit widget.
  2332. .PP
  2333. Both the message window and the edit window will create a scrollbar if
  2334. the text to display is too large to fit in that window.  Horizontal scrolling
  2335. is not allowed by default, but can be turned on through the Text
  2336. widget's resources, see \fIAthena Widget Set\fP for the exact
  2337. resource definition.
  2338. .SH COMMUNICATING WITH THE SHELL
  2339. When \fIexedit\fP starts up, the interactive shell is simultaneously forked 
  2340. in the background. If there is a file \fI.exeditrc\fP in user's home directory
  2341. this file is sourced into the shell. Whenever the user presses simultaneously
  2342. Shift and Return keys the line on which the cursor resides in the
  2343. editing window is sent to the
  2344. shell. If a prompt has been selected different from the word "none" in the
  2345. "Prompts" menu, everything on the current line up to and including the first 
  2346. character
  2347. of the prompt string will be skipped before passing the line to the shell
  2348. (for this reason the entries in the "Prompts" menu should be one character
  2349. long - they should correspond to the \fIlast\fP character of the user's 
  2350. prompt).
  2351. If a selection has been made, the whole selection is sent to the
  2352. shell (but prompt is not processed in this case). If the user presses 
  2353. Button 1 key on the mouse
  2354. in combination with any other key
  2355. including the control key, that combination is sent to the shell directly
  2356. without echoing in the editing window. 
  2357. The text which is sent back by the shell is written on the editing window either
  2358. in situ, or appended to the end of the file, depending on the choices the
  2359. user has made in the "Settings" menu.
  2360. .SH COMMANDS
  2361. .IP "Quit" 8
  2362. Quits the current editing session. If any changes have not been saved,
  2363. .I exedit 
  2364. displays a warning message, allowing the user to save the file.
  2365. .IP "Save" 
  2366. If file backups are enabled (see RESOURCES) exedit stores a copy of the
  2367. original, unedited file in <prefix>\fIfile\fP<suffix>,
  2368. then overwrites the \fIfile\fP with the contents of the edit window.  The
  2369. filename is retrieved from the Text widget directly to the right of
  2370. the \fILoad\fP button.
  2371. .IP "Load"
  2372. Loads the file named in the text widget immediately to the right
  2373. of the this button and displays it in the Edit window.  If the
  2374. currently displayed file has been modified a warning message will ask
  2375. the user to save the changes, or press \fIload\fP again.
  2376. .IP "Settings"
  2377. The menu: choose between in-situ insertion into the edited file and 
  2378. appending to the end of that file of the text sent by the shell. Enable
  2379. or disable verbose and debug modes. In verbose mode the communication
  2380. with the shell is echoed in the message window. In debug mode the
  2381. communication is echoed first on standard error before being sent to any of the
  2382. windows of \fIexedit\fP.
  2383. .IP "Prompts"
  2384. The menu: select the character terminating the prompt in use at the moment.
  2385. .SH RESOURCES
  2386. For \fIexedit\fP the available resources are:
  2387. .TP 8
  2388. .B enableBackups (\fPClass\fB EnableBackups)
  2389. Specifies that, when edits made to an existing file are saved,
  2390. .I exedit
  2391. is to copy the original version of that file to <prefix>\fIfile\fP<suffix>
  2392. before it saves the changes.  The default value for this resource is
  2393. "off", stating that no backups should be created.
  2394. .TP 8
  2395. .B backupNamePrefix (\fPClass\fB BackupNamePrefix)
  2396. Specifies a string that is to be prepended to the backup filename.  The
  2397. default is that no string shall be prepended.
  2398. .TP 8
  2399. .B backupNameSuffix (\fPClass\fB BackupNameSuffix)
  2400. Specifies a string that is to be appended to the backup filename.  The
  2401. default is to append the string ".BAK".
  2402. .TP 8
  2403. .B prompt1 (\fPClass\fB Prompt1)
  2404. Specifies the character that terminates the 
  2405. prompt. The first selection is the default. Up to 9 prompt terminators 
  2406. ("prompt2", "prompt3", etc.) can be
  2407. specified in this way. The no prompt entry is characterized by the
  2408. word "none".
  2409. .TP 8
  2410. .B actions shell() and direct()
  2411. These actions are bound to Shift<Key>Return and to Button1<Key> by default.
  2412. If the server recognizes other modifiers apart from "Control" and "Meta", it
  2413. may be preferable to bind \fBdirect()\fP to those. The "Meta" modifier is
  2414. already used by many editing actions and thus should not be used in the
  2415. context of \fBdirect()\fP.
  2416. .SH WIDGETS
  2417. In order to specify resources, it is useful to know the hierarchy of
  2418. the widgets which compose \fIexedit\fR.  In the notation below,
  2419. indentation indicates hierarchical structure.  The widget class name
  2420. is given first, followed by the widget instance name.
  2421. .sp
  2422. .nf
  2423. .TA .5i 1.0i 1.5i 2.0i
  2424. .ta .5i 1.0i 1.5i 2.0i
  2425. EXedit  exedit
  2426.     Paned  paned
  2427.         Paned  buttons
  2428.             Command  quit
  2429.             Command  save
  2430.             Command  load
  2431.             Text  filename
  2432.         Label  bc_label
  2433.         Text  messageWindow
  2434.         Label  labelWindow
  2435.         Text  editWindow
  2436. .fi
  2437. .sp
  2438. .SH ENVIRONMENT
  2439. .PP
  2440. .TP 8
  2441. .B DISPLAY
  2442. to get the default host and display number.
  2443. .TP 8
  2444. .B XENVIRONMENT
  2445. to get the name of a resource file that overrides the global resources
  2446. stored in the RESOURCE_MANAGER property.
  2447. .TP 8
  2448. .B SHELL
  2449. to get the name of the shell forked in the background.
  2450. .SH FILES
  2451. /usr/lib/X11/app-defaults/EXedit - specifies required resources
  2452. .br
  2453. $HOME/.exeditrc - the file which is sourced into the background shell
  2454. on startup
  2455. .SH SEE ALSO
  2456. X(1), xrdb(1), xedit(1), Athena Widget Set
  2457. .SH RESTRICTIONS
  2458. There is no \fIundo\fP function.
  2459. .SH BUGS
  2460. Terminating the background shell from within \fIexedit\fR will cause
  2461. a most undesirable effect, due to the way the communication between
  2462. the pseudo terminal and the text widget has been arranged. Don't do that.
  2463. To exit without
  2464. adventures just press the QUIT button. There ought to be more menus and
  2465. these should be configurable by the user without having to edit the .Xresources
  2466. data base. The treatment of the prompt should be more elaborate.
  2467. .SH COPYRIGHT
  2468. Copyright 1988, Digital Equipment Corporation.
  2469. .br
  2470. Copyright 1989, Massachusetts Institute of Technology.
  2471. .br
  2472. Copyright 1990, Australian National University.
  2473. .br
  2474. See \fIX(1)\fP for a full statement of rights and permissions.
  2475. .SH AUTHORS
  2476. Chris D. Peterson, MIT X Consortium, the xedit part of the code
  2477. .br
  2478. Zdzislaw Meglicki, Australian National University, all the rest of exedit
  2479. including bugs and problems
  2480.  
  2481. \Rogue\Monster\
  2482. else
  2483.   echo "will not over write ./exedit.0.91/exedit.man"
  2484. fi
  2485. if `test ! -s ./exedit.0.91/patchlevel.h`
  2486. then
  2487. echo "writing ./exedit.0.91/patchlevel.h"
  2488. cat > ./exedit.0.91/patchlevel.h << '\Rogue\Monster\'
  2489. /*
  2490.  * Track patch level of exedit
  2491.  */
  2492.  
  2493. #define    PATCHLEVEL    0
  2494. \Rogue\Monster\
  2495. else
  2496.   echo "will not over write ./exedit.0.91/patchlevel.h"
  2497. fi
  2498. echo "Finished archive 1 of 1"
  2499. # if you want to concatenate archives, remove anything after this line
  2500. exit
  2501.  
  2502. dan
  2503. ----------------------------------------------------
  2504. O'Reilly && Associates   argv@sun.com / argv@ora.com
  2505. Opinions expressed reflect those of the author only.
  2506.