home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3499 < prev    next >
Internet Message Format  |  1991-06-19  |  56KB

  1. From: pgf@cayman.COM (Paul Fox)
  2. Newsgroups: alt.sources
  3. Subject: Vile 13/17 - vi feel-alike (multi-window)
  4. Message-ID: <4532@cayman.COM>
  5. Date: 7 Jun 91 22:10:09 GMT
  6.  
  7. #!/bin/sh
  8. # this is vileshar.13 (part 13 of Vile)
  9. # do not concatenate these parts, unpack them in order with /bin/sh
  10. # file shorten/COPYING continued
  11. #
  12. if test ! -r _shar_seq_.tmp; then
  13.     echo 'Please unpack part 1 first!'
  14.     exit 1
  15. fi
  16. (read Scheck
  17.  if test "$Scheck" != 13; then
  18.     echo Please unpack part "$Scheck" next!
  19.     exit 1
  20.  else
  21.     exit 0
  22.  fi
  23. ) < _shar_seq_.tmp || exit 1
  24. echo 'x - continuing file shorten/COPYING'
  25. sed 's/^X//' << 'SHAR_EOF' >> 'shorten/COPYING' &&
  26. for the physical act of transferring a copy.
  27. X
  28. X  2. You may modify your copy or copies of GNU Emacs source code or
  29. any portion of it, and copy and distribute such modifications under
  30. the terms of Paragraph 1 above, provided that you also do the following:
  31. X
  32. X    a) cause the modified files to carry prominent notices stating
  33. X    that you changed the files and the date of any change; and
  34. X
  35. X    b) cause the whole of any work that you distribute or publish,
  36. X    that in whole or in part contains or is a derivative of GNU Emacs
  37. X    or any part thereof, to be licensed at no charge to all third
  38. X    parties on terms identical to those contained in this License
  39. X    Agreement (except that you may choose to grant more extensive
  40. X    warranty protection to some or all third parties, at your option).
  41. X
  42. X    c) if the modified program serves as a text editor, cause it when
  43. X    started running in the simplest and usual way, to print an
  44. X    announcement including a valid copyright notice "Copyright (C)
  45. X    1988 Free Software Foundation, Inc." (or with the year that is
  46. X    appropriate), saying that there is no warranty (or else, saying
  47. X    that you provide a warranty) and that users may redistribute the
  48. X    program under these conditions, and telling the user how to view a
  49. X    copy of this License Agreement.
  50. X
  51. X    d) You may charge a distribution fee for the physical act of
  52. X    transferring a copy, and you may at your option offer warranty
  53. X    protection in exchange for a fee.
  54. X
  55. Mere aggregation of another unrelated program with this program (or its
  56. derivative) on a volume of a storage or distribution medium does not bring
  57. the other program under the scope of these terms.
  58. X
  59. X  3. You may copy and distribute GNU Emacs (or a portion or derivative of it,
  60. under Paragraph 2) in object code or executable form under the terms of
  61. Paragraphs 1 and 2 above provided that you also do one of the following:
  62. X
  63. X    a) accompany it with the complete corresponding machine-readable
  64. X    source code, which must be distributed under the terms of
  65. X    Paragraphs 1 and 2 above; or,
  66. X
  67. X    b) accompany it with a written offer, valid for at least three
  68. X    years, to give any third party free (except for a nominal
  69. X    shipping charge) a complete machine-readable copy of the
  70. X    corresponding source code, to be distributed under the terms of
  71. X    Paragraphs 1 and 2 above; or,
  72. X
  73. X    c) accompany it with the information you received as to where the
  74. X    corresponding source code may be obtained.  (This alternative is
  75. X    allowed only for noncommercial distribution and only if you
  76. X    received the program in object code or executable form alone.)
  77. X
  78. For an executable file, complete source code means all the source code for
  79. all modules it contains; but, as a special exception, it need not include
  80. source code for modules which are standard libraries that accompany the
  81. operating system on which the executable file runs.
  82. X
  83. X  4. You may not copy, sublicense, distribute or transfer GNU Emacs
  84. except as expressly provided under this License Agreement.  Any attempt
  85. otherwise to copy, sublicense, distribute or transfer GNU Emacs is void and
  86. your rights to use GNU Emacs under this License agreement shall be
  87. automatically terminated.  However, parties who have received computer
  88. software programs from you with this License Agreement will not have
  89. their licenses terminated so long as such parties remain in full compliance.
  90. X
  91. X  5. If you wish to incorporate parts of GNU Emacs into other free programs
  92. whose distribution conditions are different, write to the Free Software
  93. Foundation.  We have not yet worked out a simple rule that can be stated
  94. here, but we will often permit this.  We will be guided by the two goals of
  95. preserving the free status of all derivatives of our free software and of
  96. promoting the sharing and reuse of software.
  97. X
  98. Your comments and suggestions about our licensing policies and our
  99. software are welcome!  Please contact the Free Software Foundation, Inc.,
  100. 675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296.
  101. X
  102. X               NO WARRANTY
  103. X
  104. X  BECAUSE GNU EMACS IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
  105. NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
  106. WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
  107. RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GNU EMACS "AS IS"
  108. WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  109. BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  110. FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
  111. AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE GNU EMACS
  112. PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
  113. SERVICING, REPAIR OR CORRECTION.
  114. X
  115. X IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL FREE SOFTWARE
  116. FOUNDATION, INC., RICHARD M. STALLMAN, AND/OR ANY OTHER PARTY WHO MAY
  117. MODIFY AND REDISTRIBUTE GNU EMACS AS PERMITTED ABOVE, BE LIABLE TO YOU
  118. FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER
  119. SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
  120. INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
  121. BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A
  122. FAILURE OF THE PROGRAM TO OPERATE WITH PROGRAMS NOT DISTRIBUTED BY
  123. FREE SOFTWARE FOUNDATION, INC.) THE PROGRAM, EVEN IF YOU HAVE BEEN
  124. ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY
  125. OTHER PARTY.
  126. SHAR_EOF
  127. echo 'File shorten/COPYING is complete' &&
  128. chmod 0444 shorten/COPYING ||
  129. echo 'restore of shorten/COPYING failed'
  130. Wc_c="`wc -c < 'shorten/COPYING'`"
  131. test 7910 -eq "$Wc_c" ||
  132.     echo 'shorten/COPYING: original size 7910, current size' "$Wc_c"
  133. # ============= shorten/defines.c ==============
  134. echo 'x - extracting shorten/defines.c (Text)'
  135. sed 's/^X//' << 'SHAR_EOF' > 'shorten/defines.c' &&
  136. #include <stdio.h>
  137. X
  138. int count;
  139. X
  140. main ()
  141. {
  142. X    char buffer[512];
  143. X
  144. X    while (gets (buffer))
  145. X      {
  146. X    printf ("#define %s zz%4.4dzz\n", buffer, count++);
  147. X      }
  148. X    return (0);
  149. }
  150. SHAR_EOF
  151. chmod 0444 shorten/defines.c ||
  152. echo 'restore of shorten/defines.c failed'
  153. Wc_c="`wc -c < 'shorten/defines.c'`"
  154. test 178 -eq "$Wc_c" ||
  155.     echo 'shorten/defines.c: original size 178, current size' "$Wc_c"
  156. # ============= shorten/dups.c ==============
  157. echo 'x - extracting shorten/dups.c (Text)'
  158. sed 's/^X//' << 'SHAR_EOF' > 'shorten/dups.c' &&
  159. /*
  160. X *    Quick and dirty program to select adjacent records that are common
  161. X *    in the first <arg> character positions.
  162. X *
  163. X */
  164. #include <stdio.h>
  165. X
  166. #define MAXSIZE 512
  167. X
  168. char ping[MAXSIZE];
  169. char pong[MAXSIZE];
  170. X
  171. int flipflop = 0;
  172. int size = MAXSIZE-1;
  173. X
  174. main (argc, argv)
  175. X     int argc;
  176. X     char *argv[];
  177. {
  178. X    register int index;
  179. X    char *newbuf();
  180. X    
  181. X    if (argc == 2)
  182. X      {
  183. X    size = atoi (argv[1]);
  184. X      }
  185. X    while (newbuf() != NULL)
  186. X      {
  187. X    for (index=0; index < size; index++)
  188. X      {
  189. X        if (ping[index] != pong[index])
  190. X          {
  191. X        break;
  192. X          }
  193. X      }
  194. X    if (index == size)
  195. X      {
  196. X        printf ("%s\n", ping);
  197. X        printf ("%s\n", pong);
  198. X      }
  199. X      }
  200. X    return (0);
  201. }
  202. X
  203. char *
  204. newbuf ()
  205. {
  206. X  char *bufp;
  207. X
  208. X  if (flipflop)
  209. X    {
  210. X      bufp = ping;
  211. X      flipflop = 0;
  212. X    }
  213. X  else
  214. X    {
  215. X      bufp = pong;
  216. X      flipflop = 1;
  217. X    }
  218. X  return (gets (bufp));
  219. }
  220. SHAR_EOF
  221. chmod 0444 shorten/dups.c ||
  222. echo 'restore of shorten/dups.c failed'
  223. Wc_c="`wc -c < 'shorten/dups.c'`"
  224. test 857 -eq "$Wc_c" ||
  225.     echo 'shorten/dups.c: original size 857, current size' "$Wc_c"
  226. # ============= shorten/header.h ==============
  227. echo 'x - extracting shorten/header.h (Text)'
  228. sed 's/^X//' << 'SHAR_EOF' > 'shorten/header.h' &&
  229. /* Header file to remap longnames to shortnames.  Note that not
  230. X   all cpp's support longnames.  In particular, most pre 5.2 UniSoft
  231. X   ports only support 16 unique characters.  To bootstrap GNU emacs
  232. X   to a 5.0 UniPlus+ system I had to port the 5.2 cpp (with FLEXNAMES)
  233. X   to the development system.  This was about a 1 hour job with sources.
  234. X   Alternatively, m4 can probably be used but this is not as clean and
  235. X   requires some changes to the default make rules (add rule to go from
  236. X   a ".cm4" file to a ".c" file and rule to go from a ".hm4" file to
  237. X   a ".h" file.  There are too many changes for sed to handle in a single
  238. X   pass.    Fred Fish, UniSoft Systems. */
  239. SHAR_EOF
  240. chmod 0444 shorten/header.h ||
  241. echo 'restore of shorten/header.h failed'
  242. Wc_c="`wc -c < 'shorten/header.h'`"
  243. test 674 -eq "$Wc_c" ||
  244.     echo 'shorten/header.h: original size 674, current size' "$Wc_c"
  245. # ============= shorten/names.c ==============
  246. echo 'x - extracting shorten/names.c (Text)'
  247. sed 's/^X//' << 'SHAR_EOF' > 'shorten/names.c' &&
  248. /*
  249. X *    A quick and dirty C program to spit out possible identifiers
  250. X *    from a stream of *.c and *.h files.  Takes a single parameter
  251. X *    which specifies the minimum length of an identifier to be
  252. X *    extracted.
  253. X *
  254. X */
  255. #include <stdio.h>
  256. #include <ctype.h>
  257. X
  258. #define FIRSTCHAR(a) (isalpha(a) || (a)=='_')
  259. #define OTHERCHAR(a) (FIRSTCHAR(a) || isdigit(a))
  260. #define TRUE 1
  261. #define FALSE 0
  262. X
  263. int size = 0;
  264. char buffer[512];
  265. char *bp = buffer;
  266. X
  267. main (argc, argv)
  268. X     int argc;
  269. X     char *argv[];
  270. {
  271. X  register int ch;
  272. X  register int spitout;
  273. X  register int eating_comment;
  274. X
  275. X  if (argc == 2)
  276. X    {
  277. X      size = atoi (argv[1]);
  278. X    }
  279. X  spitout = FALSE;
  280. X  eating_comment = FALSE;
  281. X  while ((ch = getchar()) != EOF)
  282. X    {
  283. X      if (ch == '/')
  284. X    {
  285. X      if ((ch = getchar()) == EOF)
  286. X        {
  287. X          fprintf (stderr, "unexpected EOF!\n");
  288. X          exit (1);
  289. X        }
  290. X      else
  291. X        {
  292. X          if (ch == '*')
  293. X        {
  294. X          eating_comment = TRUE;
  295. X        }
  296. X          else
  297. X        {
  298. X          ungetc (ch, stdin);
  299. X        }
  300. X        }
  301. X    }
  302. X      else if (eating_comment && ch == '*')
  303. X    {
  304. X      if ((ch = getchar()) == EOF)
  305. X        {
  306. X          fprintf (stderr, "unexpected EOF!\n");
  307. X          exit (1);
  308. X        }
  309. X      else
  310. X        {
  311. X          if (ch == '/')
  312. X        {
  313. X          eating_comment = FALSE;
  314. X        }
  315. X          else
  316. X        {
  317. X          ungetc (ch, stdin);
  318. X        }
  319. X        }
  320. X    }
  321. X      else if (!eating_comment)
  322. X    {
  323. X      if (!spitout && FIRSTCHAR(ch))
  324. X        {
  325. X          spitout = TRUE;
  326. X          *bp++ = ch;
  327. X        }
  328. X      else if (spitout && OTHERCHAR(ch))
  329. X        {
  330. X          *bp++ = ch;
  331. X        }
  332. X      else if (spitout)
  333. X        {
  334. X          *bp++ = '\000';
  335. X          bp = buffer;
  336. X          if (strlen (bp) >= size)
  337. X        {
  338. X          printf ("%s\n", bp);
  339. X        }
  340. X          spitout = FALSE;
  341. X        }
  342. X    }
  343. X    }
  344. X  return (0);
  345. }
  346. SHAR_EOF
  347. chmod 0444 shorten/names.c ||
  348. echo 'restore of shorten/names.c failed'
  349. Wc_c="`wc -c < 'shorten/names.c'`"
  350. test 1637 -eq "$Wc_c" ||
  351.     echo 'shorten/names.c: original size 1637, current size' "$Wc_c"
  352. # ============= shorten/reserved ==============
  353. echo 'x - extracting shorten/reserved (Text)'
  354. sed 's/^X//' << 'SHAR_EOF' > 'shorten/reserved' &&
  355. int
  356. char
  357. float
  358. double
  359. struct
  360. union
  361. long
  362. short
  363. unsigned
  364. auto
  365. extern
  366. register
  367. typedef
  368. static
  369. goto
  370. return
  371. sizeof
  372. break
  373. continue
  374. if
  375. else
  376. for
  377. do
  378. while
  379. switch
  380. case
  381. default
  382. entry
  383. include
  384. define
  385. defined
  386. undef
  387. undefined
  388. undefine
  389. SHAR_EOF
  390. chmod 0444 shorten/reserved ||
  391. echo 'restore of shorten/reserved failed'
  392. Wc_c="`wc -c < 'shorten/reserved'`"
  393. test 220 -eq "$Wc_c" ||
  394.     echo 'shorten/reserved: original size 220, current size' "$Wc_c"
  395. # ============= shorten/special ==============
  396. echo 'x - extracting shorten/special (Text)'
  397. sed 's/^X//' << 'SHAR_EOF' > 'shorten/special' &&
  398. SHAR_EOF
  399. chmod 0444 shorten/special ||
  400. echo 'restore of shorten/special failed'
  401. Wc_c="`wc -c < 'shorten/special'`"
  402. test 0 -eq "$Wc_c" ||
  403.     echo 'shorten/special: original size 0, current size' "$Wc_c"
  404. # ============= spawn.c ==============
  405. echo 'x - extracting spawn.c (Text)'
  406. sed 's/^X//' << 'SHAR_EOF' > 'spawn.c' &&
  407. /*    Spawn:    various DOS access commands
  408. X        for MicroEMACS
  409. */
  410. X
  411. #include        <stdio.h>
  412. #include    "estruct.h"
  413. #include        "edef.h"
  414. #if BSD | USG
  415. #include    <sys/types.h>
  416. #include    <sys/stat.h>
  417. #endif
  418. X
  419. #if     AMIGA
  420. #define  NEW   1006L
  421. #endif
  422. X
  423. #if        ST520 & MEGAMAX
  424. #include <osbind.h>
  425. #include <string.h>
  426. #define LOAD_EXEC 0     /* load and execute the program */
  427. char    *STcmd,        /* the command filename & path  */
  428. X    *STargs,    /* command args (if any)        */
  429. X    *STenv,        /* environment                  */
  430. X    *STwork;    /* work area            */
  431. #endif
  432. X
  433. #if     VMS
  434. #define EFN     0                               /* Event flag.          */
  435. X
  436. #include        <ssdef.h>                       /* Random headers.      */
  437. #include        <stsdef.h>
  438. #include        <descrip.h>
  439. #include        <iodef.h>
  440. X
  441. extern  int     oldmode[3];                     /* In "termio.c"        */
  442. extern  int     newmode[3];                     /* In "termio.c"        */
  443. extern  short   iochan;                         /* In "termio.c"        */
  444. #endif
  445. X
  446. #if     UNIX
  447. #include        <signal.h>
  448. #include        <string.h>
  449. #endif
  450. X
  451. #if    MSDOS & (MSC | TURBO)
  452. #include    <process.h>
  453. #endif
  454. X
  455. /*
  456. X * Create a subjob with a copy of the command intrepreter in it. When the
  457. X * command interpreter exits, mark the screen as garbage so that you do a full
  458. X * repaint. The message at the start in VMS puts out a newline.
  459. X * Under some (unknown) condition, you don't get one free when DCL starts up.
  460. X */
  461. spawncli(f, n)
  462. {
  463. #if     UNIX
  464. # if     NeWS
  465. X    mlwrite("Not availible under NeWS");
  466. X    return(FALSE);
  467. # else
  468. X        register char *cp;
  469. X        char    *getenv();
  470. X        
  471. X        movecursor(term.t_nrow, 0);             /* Seek to last line.   */
  472. X    ttclean(TRUE);
  473. X        TTputc('\n');
  474. X        if ((cp = getenv("SHELL")) != NULL && *cp != '\0')
  475. X                system(cp);
  476. X        else
  477. X                system("exec /bin/sh");
  478. X        TTflush();
  479. X    ttunclean();
  480. X        sgarbf = TRUE;
  481. X        return(TRUE);
  482. # endif /* News */
  483. #endif /* UNIX */
  484. X
  485. #if    AMIGA
  486. X        long newcli;
  487. X        mlwrite("[Starting new CLI]");
  488. X        sgarbf = TRUE;
  489. X        Execute("NEWCLI \"CON:0/0/640/200/MicroEMACS Subprocess\"", 0L, 0L);
  490. X        return(TRUE);
  491. #endif
  492. X
  493. #if     VMS
  494. X        movecursor(term.t_nrow, 0);             /* In last line.        */
  495. X        mlputs("[Starting DCL]\r\n");
  496. X        TTflush();                          /* Ignore "ttcol".      */
  497. X        sgarbf = TRUE;
  498. X        return (sys(NULL));                     /* NULL => DCL.         */
  499. #endif
  500. #if     CPM
  501. X        mlwrite("Not in CP/M-86");
  502. X    return FALSE;
  503. #endif
  504. #if    ST520
  505. X    mlwrite("Not in TOS");
  506. X    return FALSE;
  507. #endif
  508. #if     MSDOS & (AZTEC | MSC | TURBO)
  509. X        movecursor(term.t_nrow, 0);             /* Seek to last line.   */
  510. X        TTflush();
  511. X    TTkclose();
  512. X    system("command.com");
  513. X    TTkopen();
  514. X        sgarbf = TRUE;
  515. X        return(TRUE);
  516. #endif
  517. #if     MSDOS & LATTICE
  518. X        movecursor(term.t_nrow, 0);             /* Seek to last line.   */
  519. X        TTflush();
  520. X    TTkclose();
  521. X        sys("\\command.com", "");               /* Run CLI.             */
  522. X    TTkopen();
  523. X        sgarbf = TRUE;
  524. X        return(TRUE);
  525. #endif
  526. }
  527. X
  528. #if UNIX && defined(SIGTSTP)
  529. X
  530. bktoshell()        /* suspend MicroEMACS and wait to wake up */
  531. {
  532. #if     NeWS
  533. X    mlwrite("Not availible under NeWS");
  534. X    return(FALSE);
  535. #else
  536. X    int pid;
  537. X
  538. X    vttidy(TRUE);
  539. X    pid = getpid();
  540. X    kill(pid,SIGTSTP);
  541. #endif
  542. }
  543. X
  544. rtfrmshell()
  545. {
  546. #if     NeWS
  547. X    mlwrite("Not available under NeWS");
  548. X    return(FALSE);
  549. #else
  550. X    ttunclean();
  551. X    curwp->w_flag = WFHARD;  /* is this needed, with sgarbf == TRUE? */
  552. X    sgarbf = TRUE;
  553. #if USG
  554. X    signal(SIGCONT,rtfrmshell);    /* suspend & restart */
  555. X    update(TRUE);
  556. #endif
  557. #endif
  558. }
  559. #endif /* SIGTSTP */
  560. X
  561. #if UNIX
  562. pressreturn()
  563. {
  564. X    int s;
  565. X
  566. X        mlputs("[Press return to continue]");
  567. X        TTflush();
  568. X    /* loop for a CR, a space, or a : to do another named command */
  569. X        while ((s = kbd_key()) != '\r' && s != ' ' && s != kcod2key(abortc)) {
  570. X        extern CMDFUNC f_namedcmd;
  571. X                if (kcod2fnc(s) == &f_namedcmd) {
  572. X            tungetc(kcod2key(s));
  573. X            break;
  574. X        }
  575. X    }
  576. }
  577. #endif
  578. X
  579. respawn(f,n) {
  580. X    spawn(f,n,TRUE);
  581. }
  582. X
  583. /*
  584. X * Run a one-liner in a subjob. When the command returns, wait for a single
  585. X * character to be typed, then mark the screen as garbage so a full repaint is
  586. X * done.
  587. X */
  588. /* the #ifdefs have been totally separated, for readability */
  589. spawn(f, n, rerun)
  590. {
  591. X
  592. #if  UNIX
  593. X        register int    s;
  594. X        static char oline[NLINE];    /* command line send to shell */
  595. X        char    line[NLINE];    /* command line send to shell */
  596. X    register char    *cp;
  597. X    char        line2[NLINE];
  598. X    int cb;
  599. X    char prompt[50];
  600. X    char *getenv();
  601. X
  602. X    if (!rerun) {
  603. X        if (cb = anycb())
  604. X            sprintf(prompt,"Warning: %d modified buffer%s: !",
  605. X                cb, cb>1 ? "s":"");
  606. X        else
  607. X            sprintf(prompt,": !");
  608. X
  609. X            if ((s=mlreply(prompt, oline, NLINE)) != TRUE)
  610. X                    return (s);
  611. X    } else {
  612. X        if (!oline[0])
  613. X            return FALSE;
  614. X        mlwrite(": !%s",oline);
  615. X    }
  616. X    strcpy(line,oline);
  617. X        if ((cp = getenv("SHELL")) == NULL || *cp == '\0')
  618. X                cp = "/bin/sh";
  619. X    sprintf(line2, "%s -c \"%s\"", cp, line);
  620. #if    NeWS
  621. X    system(line2);
  622. #else
  623. X    ttclean(TRUE);
  624. X    system(line2);
  625. X        TTflush();
  626. X    ttunclean();
  627. X        sgarbf = TRUE;
  628. X    pressreturn();
  629. #endif /* NeWS */
  630. X        return (TRUE);
  631. #endif /* UNIX */
  632. X
  633. #if     AMIGA
  634. X        register int    s;
  635. X        static char oline[NLINE];    /* command line send to shell */
  636. X        char    line[NLINE];    /* command line send to shell */
  637. X    register char    *cp;
  638. X    char        line2[NLINE];
  639. X        long newcli;
  640. X
  641. X
  642. X        if ((s=mlreply("cmd: !", oline, NLINE)) != TRUE)
  643. X                return (s);
  644. X    strcpy(line,oline);
  645. X        newcli = Open("CON:0/0/640/200/MicroEMACS Subprocess", NEW);
  646. X        Execute(line, 0L, newcli);
  647. X        Close(newcli);
  648. X        tgetc();     /* Pause.               */
  649. X        sgarbf = TRUE;
  650. X        return(TRUE);
  651. #endif
  652. #if    ST520 & MEGAMAX
  653. X        register int    s;
  654. X        static char oline[NLINE];    /* command line send to shell */
  655. X        char    line[NLINE];    /* command line send to shell */
  656. X    register char    *cp;
  657. X    char        line2[NLINE];
  658. X
  659. X    int i,j,k;
  660. X    char *sptr,*tptr;
  661. X
  662. X        if ((s=mlreply("cmd: !", oline, NLINE)) != TRUE)
  663. X                return(s);
  664. X    strcpy(line,oline);
  665. X    movecursor(term.t_nrow - 1, 0);
  666. X    TTclose();
  667. X    /*
  668. X     * break the line into the command and its args
  669. X     * be cute about it, if there is no '.' in the filename, try
  670. X     * to find .prg, .tos or .ttp in that order
  671. X     * in any case check to see that the file exists before we run 
  672. X     * amok
  673. X     */
  674. X    STenv = NULL;
  675. X    if((tptr = index(&line[0],' ')) == NULL) { /* no args */
  676. X        STcmd = malloc(strlen(line) + 1);
  677. X        strcpy(STcmd,line);
  678. X        STargs = NULL;
  679. X    }
  680. X    else {  /* seperate out the args from the command */
  681. X        /* resist the temptation to do ptr arithmetic */
  682. X        STcmd = malloc(strlen(line) + 1);
  683. X        for(i = 0,sptr = &line[0]; sptr != tptr; sptr++,i++)
  684. X            STcmd[i] = *sptr;
  685. X        STcmd[i] = '\0';
  686. X        for(; *tptr == ' ' || *tptr == '\t'; tptr++);
  687. X        if(*tptr == '\0')
  688. X            STargs = NULL;
  689. X        else {
  690. X            STargs = malloc(strlen(tptr) + 2);
  691. /* first byte of STargs is the length of the string */
  692. X            STargs[0] = strlen(tptr);
  693. X            STargs[1] = NULL; /* fake it for strcat */
  694. X            strcat(STargs,tptr);
  695. X        }
  696. X    }
  697. X    /*
  698. X     * before we issue the command look for the '.', if it's not there
  699. X     * try adding .prg, .tos and .ttp to see if they exist, if not
  700. X     * issue the command as is
  701. X     */
  702. X    if((tptr = index(STcmd,'.')) == NULL) {
  703. X         STwork = malloc(strlen(STcmd) + 4);
  704. X         strcpy(STwork,STcmd);
  705. X         strcat(STwork,".prg");
  706. X         tptr = index(STwork,'.');
  707. X         if(Fsfirst(1,STwork) != 0) { /* try .tos */
  708. X             strcpy(tptr,".tos");
  709. X             if(Fsfirst(1,STwork) != 0) { /* try .ttp */
  710. X                 strcpy(tptr,".ttp");
  711. X                 if(Fsfirst(1,STwork) != 0) /* never mind */
  712. X                     *STwork = NULL;
  713. X                 }
  714. X             }
  715. X     }
  716. X     if(*STwork != NULL)
  717. X            Pexec(LOAD_EXEC,STwork,STargs,STenv);         
  718. X    else
  719. X            Pexec(LOAD_EXEC,STcmd,STargs,STenv);
  720. X    TTopen();
  721. X        mlputs("\r\n\n[End]");                  /* Pause.               */
  722. X        TTgetc();                 /* Pause.               */
  723. X        sgarbf = TRUE;
  724. X        return (TRUE);
  725. #endif
  726. #if     VMS
  727. X        register int    s;
  728. X        static char oline[NLINE];    /* command line send to shell */
  729. X        char    line[NLINE];    /* command line send to shell */
  730. X    register char    *cp;
  731. X    char        line2[NLINE];
  732. X
  733. X
  734. X        if ((s=mlreply("cmd: !", oline, NLINE)) != TRUE)
  735. X                return (s);
  736. X    strcpy(line,oline);
  737. X        TTputc('\n');                /* Already have '\r'    */
  738. X        TTflush();
  739. X        s = sys(line);                          /* Run the command.     */
  740. X        mlputs("\r\n\n[End]");                  /* Pause.               */
  741. X        TTflush();
  742. X        tgetc();
  743. X        sgarbf = TRUE;
  744. X        return (s);
  745. #endif
  746. #if     CPM
  747. X        mlwrite("Not in CP/M-86");
  748. X        return (FALSE);
  749. #endif
  750. #if     MSDOS | (ST520 & LATTICE)
  751. X        register int    s;
  752. X        static char oline[NLINE];    /* command line send to shell */
  753. X        char    line[NLINE];    /* command line send to shell */
  754. X    register char    *cp;
  755. X    char        line2[NLINE];
  756. X
  757. X
  758. X        if ((s=mlreply("cmd: !", oline, NLINE)) != TRUE)
  759. X                return(s);
  760. X    strcpy(line,oline);
  761. X    movecursor(term.t_nrow - 1, 0);
  762. X    TTkclose();
  763. X        system(line);
  764. X    TTkopen();
  765. X    /* if we are interactive, pause here */
  766. X    if (clexec == FALSE) {
  767. X            mlputs("\r\n\n[End]");
  768. X            tgetc();
  769. X        }
  770. X        sgarbf = TRUE;
  771. X        return (TRUE);
  772. #endif
  773. }
  774. X
  775. #if UNIX
  776. /*
  777. X * Pipe a one line command into a window
  778. X */
  779. pipecmd(f, n)
  780. {
  781. X    register WINDOW *wp;    /* pointer to new window */
  782. X    register BUFFER *bp;    /* pointer to buffer to zot */
  783. X        static char oline[NLINE];    /* command line send to shell */
  784. X        register int    s;
  785. X    static char bname[] = "[Output]";
  786. X    int cb;
  787. X    char prompt[50];
  788. X
  789. X
  790. X    /* if it doesn't start with '!', or if that's all it is */
  791. X    if (oline[0] != '!' || oline[1] == '\0') {
  792. X        oline[0] = '!';
  793. X        oline[1] = '\0';
  794. X    }
  795. X
  796. X    if (cb = anycb())
  797. X        sprintf(prompt,"Warning: %d modified buffer%s. !",
  798. X            cb, cb>1 ? "s":"");
  799. X    else
  800. X        sprintf(prompt,"!");
  801. X        
  802. X    /* get the command to pipe in */
  803. X        if ((s=mlreply(prompt, &oline[1], NLINE)) != TRUE)
  804. X                return(s);
  805. X
  806. X    /* first check if we are already here */
  807. X    bp = bfind(bname, OK_CREAT, 0);
  808. X    if (bp == NULL)
  809. X        return FALSE;
  810. X
  811. X    /* and read the stuff in */
  812. X    if (popupbuff(bp) != TRUE || 
  813. X        swbuffer(bp) != TRUE || 
  814. X        readin(oline, FALSE, bp, TRUE) != TRUE) {
  815. X        return(FALSE);
  816. X    }
  817. X    strcpy(bp->b_bname,bname);
  818. X    strncpy(bp->b_fname, oline, NFILEN-1);
  819. X    bp->b_mode |= MDVIEW;
  820. X    return TRUE;
  821. }
  822. X
  823. #else /* ! UNIX */
  824. X
  825. /*
  826. X * Pipe a one line command into a window
  827. X */
  828. pipecmd(f, n)
  829. {
  830. X        register int    s;    /* return status from CLI */
  831. X    register WINDOW *wp;    /* pointer to new window */
  832. X    register BUFFER *bp;    /* pointer to buffer to zot */
  833. X        static char oline[NLINE];    /* command line send to shell */
  834. X        char    line[NLINE];    /* command line send to shell */
  835. X    static char bname[] = "[output]";
  836. X    WINDOW *ocurwp;        /* save the current window during delete */
  837. X
  838. #if    AMIGA
  839. X    static char filnam[] = "ram:command";
  840. X        long newcli;
  841. #else
  842. X    static char filnam[NSTRING] = "command";
  843. #endif
  844. X
  845. #if    MSDOS
  846. X    char *tmp;
  847. X    char *getenv();
  848. X    FILE *fp;
  849. X    FILE *fopen();
  850. #endif
  851. X
  852. #if    MSDOS
  853. X    if ((tmp = getenv("TMP")) == NULL)
  854. X        strcpy(filnam, "command");
  855. X    else {
  856. X        strcpy(filnam, tmp);
  857. X                strcat(filnam,"\\command");
  858. X        }
  859. #endif
  860. #if     VMS
  861. X    mlwrite("Not availible under VMS");
  862. X    return(FALSE);
  863. #endif
  864. #if     CPM
  865. X        mlwrite("Not availible under CP/M-86");
  866. X        return(FALSE);
  867. #endif
  868. X    /* get the command to pipe in */
  869. X        if ((s=mlreply("cmd: <", oline, NLINE)) != TRUE)
  870. X                return(s);
  871. X
  872. X    strcpy(line,oline);
  873. X
  874. X    /* get rid of the command output buffer if it exists */
  875. X        if ((bp=bfind(bname, NO_CREAT, 0)) != FALSE) {
  876. X        /* try to make sure we are off screen */
  877. X        wp = wheadp;
  878. X        ocurwp = NULL;
  879. X        while (wp != NULL) {
  880. X            if (wp->w_bufp == bp) {
  881. X                if (curwp != wp) {
  882. X                    ocurwp = curwp;
  883. X                    curwp = wp;
  884. X                }
  885. X                delwind(FALSE, 1);
  886. X                if (ocurwp != NULL)
  887. X                    curwp = ocurwp;
  888. X                break;
  889. X            }
  890. X            wp = wp->w_wndp;
  891. X        }
  892. X        if (zotbuf(bp) != TRUE)
  893. X
  894. X            return(FALSE);
  895. X    }
  896. X
  897. #if     AMIGA
  898. X        newcli = Open("CON:0/0/640/200/MicroEMACS Subprocess", NEW);
  899. X    strcat(line, " >");
  900. X    strcat(line, filnam);
  901. X        Execute(line, 0L, newcli);
  902. X    s = TRUE;
  903. X        Close(newcli);
  904. X        sgarbf = TRUE;
  905. #endif
  906. #if     MSDOS
  907. X    strcat(line," >>");
  908. X    strcat(line,filnam);
  909. X    movecursor(term.t_nrow - 1, 0);
  910. X    TTkclose();
  911. X        system(line);
  912. X    TTkopen();
  913. X        sgarbf = TRUE;
  914. X    if ((fp = fopen(filnam, "r")) == NULL) {
  915. X        s = FALSE;
  916. X    } else {
  917. X        fclose(fp);
  918. X        s = TRUE;
  919. X    }
  920. #endif
  921. X
  922. X    if (s != TRUE)
  923. X        return(s);
  924. X
  925. X    /* split the current window to make room for the command output */
  926. X    if (splitwind(FALSE, 1) == FALSE)
  927. X            return(FALSE);
  928. X
  929. X    /* and read the stuff in */
  930. X    if (getfile(filnam, FALSE) == FALSE)
  931. X        return(FALSE);
  932. X
  933. X    /* make this window in VIEW mode, update all mode lines */
  934. X    curwp->w_bufp->b_mode |= MDVIEW;
  935. X    wp = wheadp;
  936. X    while (wp != NULL) {
  937. X        wp->w_flag |= WFMODE;
  938. X        wp = wp->w_wndp;
  939. X    }
  940. X
  941. #if FINDERR
  942. X    strcpy(febuff,bp->b_bname);
  943. X    newfebuff = TRUE;
  944. #endif
  945. X
  946. X    /* and get rid of the temporary file */
  947. X    unlink(filnam);
  948. X    return(TRUE);
  949. }
  950. #endif /* UNIX */
  951. X
  952. /* run a region through an external filter, replace it with its output */
  953. filterregion(f,n)
  954. {
  955. X        static char oline[NLINE];    /* command line send to shell */
  956. X        char    line[NLINE];    /* command line send to shell */
  957. X    FILE *fr, *fw;
  958. X    int s;
  959. X
  960. X    /* get the filter name and its args */
  961. X        if ((s=mlreply("!", oline, NLINE)) != TRUE)
  962. X                return(s);
  963. X    strcpy(line,oline);
  964. X    if ((s = inout_popen(&fr, &fw, line)) != TRUE) {
  965. X        mlwrite("Couldn't open pipe or command");
  966. X        return s;
  967. X    }
  968. X
  969. X    killregion(f,n);
  970. X    if (fork()) {
  971. X        fclose(fw);
  972. X        /* backline(FALSE,1); */
  973. X        curwp->w_dotp = lback(curwp->w_dotp);
  974. X        s = ifile(NULL,TRUE,fr);
  975. X        npclose(fr);
  976. X        firstnonwhite();
  977. X        setmark();
  978. X        return s;
  979. X    } else {
  980. X        KILL *kp;        /* pointer into kill register */
  981. X        kregcirculate(FALSE);
  982. X        /* make sure there is something to put */
  983. X        if (kbs[ukb].kbufh == NULL)
  984. X            return TRUE;        /* not an error, just nothing */
  985. X
  986. X        kp = kbs[ukb].kbufh;
  987. X        while (kp != NULL) {
  988. X            if (kp->d_next == NULL)
  989. X                fwrite(kp->d_chunk, 1, kbs[ukb].kused, fw);
  990. X            else
  991. X                fwrite(kp->d_chunk, 1, KBLOCK, fw);
  992. X            kp = kp->d_next;
  993. X        }
  994. X        fflush(fw);
  995. X        fclose(fw);
  996. X        exit (0);
  997. X    }
  998. }
  999. X
  1000. /*
  1001. X * filter a buffer through an external DOS program
  1002. X * this is obsolete, the filterregion code is better.
  1003. X */
  1004. filter(f, n)
  1005. {
  1006. X        register int    s;    /* return status from CLI */
  1007. X    register BUFFER *bp;    /* pointer to buffer to zot */
  1008. X        static char oline[NLINE];    /* command line send to shell */
  1009. X        char    line[NLINE];    /* command line send to shell */
  1010. X    char tmpnam[NFILEN];    /* place to store real file name */
  1011. X    static char bname1[] = "fltinp";
  1012. X
  1013. #if    AMIGA
  1014. X    static char filnam1[] = "ram:fltinp";
  1015. X    static char filnam2[] = "ram:fltout";
  1016. X        long newcli;
  1017. #else
  1018. X    static char filnam1[] = "fltinp";
  1019. X    static char filnam2[] = "fltout";
  1020. #endif
  1021. X
  1022. #if     VMS
  1023. X    mlwrite("Not availible under VMS");
  1024. X    return(FALSE);
  1025. #endif
  1026. #if     CPM
  1027. X        mlwrite("Not availible under CP/M-86");
  1028. X        return(FALSE);
  1029. #endif
  1030. X    /* get the filter name and its args */
  1031. X        if ((s=mlreply("cmd: |", oline, NLINE)) != TRUE)
  1032. X                return(s);
  1033. X    strcpy(line,oline);
  1034. X
  1035. X    /* setup the proper file names */
  1036. X    bp = curbp;
  1037. X    strcpy(tmpnam, bp->b_fname);    /* save the original name */
  1038. X    strcpy(bp->b_fname, bname1);    /* set it to our new one */
  1039. X
  1040. X    /* write it out, checking for errors */
  1041. X    if (writeout(filnam1,curbp,TRUE) != TRUE) {
  1042. X        mlwrite("[Cannot write filter file]");
  1043. X        strcpy(bp->b_fname, tmpnam);
  1044. X        return(FALSE);
  1045. X    }
  1046. X
  1047. #if     AMIGA
  1048. X        newcli = Open("CON:0/0/640/200/MicroEMACS Subprocess", NEW);
  1049. X    strcat(line, " <ram:fltinp >ram:fltout");
  1050. X        Execute(line,0L,newcli);
  1051. X    s = TRUE;
  1052. X        Close(newcli);
  1053. X        sgarbf = TRUE;
  1054. #endif
  1055. #if     MSDOS
  1056. X    strcat(line," <fltinp >fltout");
  1057. X    movecursor(term.t_nrow - 1, 0);
  1058. X    TTkclose();
  1059. X        system(line);
  1060. X    TTkopen();
  1061. X        sgarbf = TRUE;
  1062. X    s = TRUE;
  1063. #endif
  1064. #if     UNIX
  1065. #if    ! NeWS
  1066. X        ttclean(TRUE);
  1067. #endif
  1068. X    strcat(line," <fltinp >fltout");
  1069. X        system(line);
  1070. #if    ! NeWS
  1071. X        ttunclean();
  1072. X        TTflush();
  1073. X        sgarbf = TRUE;
  1074. #endif
  1075. X       s = TRUE;
  1076. #endif
  1077. X
  1078. X    /* on failure, escape gracefully */
  1079. X    if (s != TRUE || (readin(filnam2,FALSE,curbp,TRUE) == FALSE)) {
  1080. X        mlwrite("[Execution failed]");
  1081. X        strcpy(bp->b_fname, tmpnam);
  1082. X        unlink(filnam1);
  1083. X        unlink(filnam2);
  1084. X        return(s);
  1085. X    }
  1086. X
  1087. X    /* reset file name */
  1088. X    strcpy(bp->b_fname, tmpnam);    /* restore name */
  1089. X    bp->b_flag |= BFCHG;        /* flag it as changed */
  1090. X
  1091. X    /* and get rid of the temporary file */
  1092. X    unlink(filnam1);
  1093. X    unlink(filnam2);
  1094. X    return(TRUE);
  1095. }
  1096. X
  1097. #if     VMS
  1098. /*
  1099. X * Run a command. The "cmd" is a pointer to a command string, or NULL if you
  1100. X * want to run a copy of DCL in the subjob (this is how the standard routine
  1101. X * LIB$SPAWN works. You have to do wierd stuff with the terminal on the way in
  1102. X * and the way out, because DCL does not want the channel to be in raw mode.
  1103. X */
  1104. sys(cmd)
  1105. register char   *cmd;
  1106. {
  1107. X        struct  dsc$descriptor  cdsc;
  1108. X        struct  dsc$descriptor  *cdscp;
  1109. X        long    status;
  1110. X        long    substatus;
  1111. X        long    iosb[2];
  1112. X
  1113. X        status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
  1114. X                          oldmode, sizeof(oldmode), 0, 0, 0, 0);
  1115. X        if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
  1116. X                return (FALSE);
  1117. X        cdscp = NULL;                           /* Assume DCL.          */
  1118. X        if (cmd != NULL) {                      /* Build descriptor.    */
  1119. X                cdsc.dsc$a_pointer = cmd;
  1120. X                cdsc.dsc$w_length  = strlen(cmd);
  1121. X                cdsc.dsc$b_dtype   = DSC$K_DTYPE_T;
  1122. X                cdsc.dsc$b_class   = DSC$K_CLASS_S;
  1123. X                cdscp = &cdsc;
  1124. X        }
  1125. X        status = LIB$SPAWN(cdscp, 0, 0, 0, 0, 0, &substatus, 0, 0, 0);
  1126. X        if (status != SS$_NORMAL)
  1127. X                substatus = status;
  1128. X        status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
  1129. X                          newmode, sizeof(newmode), 0, 0, 0, 0);
  1130. X        if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
  1131. X                return (FALSE);
  1132. X        if ((substatus&STS$M_SUCCESS) == 0)     /* Command failed.      */
  1133. X                return (FALSE);
  1134. X        return (TRUE);
  1135. }
  1136. #endif
  1137. X
  1138. #if    ~AZTEC & ~MSC & ~TURBO & MSDOS
  1139. X
  1140. /*
  1141. X * This routine, once again by Bob McNamara, is a C translation of the "system"
  1142. X * routine in the MWC-86 run time library. It differs from the "system" routine
  1143. X * in that it does not unconditionally append the string ".exe" to the end of
  1144. X * the command name. We needed to do this because we want to be able to spawn
  1145. X * off "command.com". We really do not understand what it does, but if you don't
  1146. X * do it exactly "malloc" starts doing very very strange things.
  1147. X */
  1148. sys(cmd, tail)
  1149. char    *cmd;
  1150. char    *tail;
  1151. {
  1152. #if MWC86
  1153. X        register unsigned n;
  1154. X        extern   char     *__end;
  1155. X
  1156. X        n = __end + 15;
  1157. X        n >>= 4;
  1158. X        n = ((n + dsreg() + 16) & 0xFFF0) + 16;
  1159. X        return(execall(cmd, tail, n));
  1160. #endif
  1161. X
  1162. #if LATTICE
  1163. X        return(forklp(cmd, tail, (char *)NULL));
  1164. #endif
  1165. }
  1166. #endif
  1167. X
  1168. #if    MSDOS & LATTICE
  1169. /*    System: a modified version of lattice's system() function
  1170. X        that detects the proper switchar and uses it
  1171. X        written by Dana Hogget                */
  1172. X
  1173. system(cmd)
  1174. X
  1175. char *cmd;    /*  Incoming command line to execute  */
  1176. X
  1177. {
  1178. X    char *getenv();
  1179. X    static char *swchar = "/C";    /*  Execution switch  */
  1180. X    union REGS inregs;    /*  parameters for dos call  */
  1181. X    union REGS outregs;    /*  Return results from dos call  */
  1182. X    char *shell;        /*  Name of system command processor  */
  1183. X    char *p;        /*  Temporary pointer  */
  1184. X    int ferr;        /*  Error condition if any  */
  1185. X
  1186. X    /*  get name of system shell  */
  1187. X    if ((shell = getenv("COMSPEC")) == NULL) {
  1188. X        return (-1);        /*  No shell located  */
  1189. X    }
  1190. X
  1191. X    p = cmd;
  1192. X    while (isspace(*p)) {        /*  find out if null command */
  1193. X        p++;
  1194. X    }
  1195. X
  1196. X    /**  If the command line is not empty, bring up the shell  **/
  1197. X    /**  and execute the command.  Otherwise, bring up the     **/
  1198. X    /**  shell in interactive mode.   **/
  1199. X
  1200. X    if (p && *p) {
  1201. X        /**  detect current switch character and us it  **/
  1202. X        inregs.h.ah = 0x37;    /*  get setting data  */
  1203. X        inregs.h.al = 0x00;    /*  get switch character  */
  1204. X        intdos(&inregs, &outregs);
  1205. X        *swchar = outregs.h.dl;
  1206. X        ferr = forkl(shell, "command", swchar, cmd, (char *)NULL);
  1207. X    } else {
  1208. X        ferr = forkl(shell, "command", (char *)NULL);
  1209. X    }
  1210. X
  1211. X    return (ferr ? ferr : wait());
  1212. }
  1213. #endif
  1214. SHAR_EOF
  1215. chmod 0444 spawn.c ||
  1216. echo 'restore of spawn.c failed'
  1217. Wc_c="`wc -c < 'spawn.c'`"
  1218. test 20300 -eq "$Wc_c" ||
  1219.     echo 'spawn.c: original size 20300, current size' "$Wc_c"
  1220. # ============= st520.c ==============
  1221. echo 'x - extracting st520.c (Text)'
  1222. sed 's/^X//' << 'SHAR_EOF' > 'st520.c' &&
  1223. /*
  1224. X
  1225. The routines in this file provide support for the Atari 520 or 1040ST
  1226. using VT52 emulation.  The I/O services are provided here as well.  It
  1227. compiles into nothing if not a 520ST style device.
  1228. X
  1229. */
  1230. X
  1231. #define    termdef    1            /* don't define "term" external */
  1232. X
  1233. #include        <stdio.h>
  1234. #include        "estruct.h"
  1235. #include    "edef.h"
  1236. X
  1237. #if     ATARI & ST520 & MEGAMAX
  1238. #include    <osbind.h>
  1239. X
  1240. #define LINEA_INIT 0xA000
  1241. #define V_CEL_WR   -0x28
  1242. X
  1243. #define V_CEL_MY   -0x2a
  1244. #define V_CEL_HT   -0x2e
  1245. #define V_FNT_AD   -0x16
  1246. #define V_OFF_AD   -0x0a
  1247. #define V_DISAB    -346
  1248. X
  1249. #define NROW    25                      /* Screen size.                 */
  1250. #define NCOL    80                      /* Edit if you want to.         */
  1251. #define    MARGIN    8            /* size of minimim margin and    */
  1252. #define    SCRSIZ    64            /* scroll size for extended lines */
  1253. #define    NPAUSE    25            /* # times thru update to pause */
  1254. #define BIAS    0x20                    /* Origin 0 coordinate bias.    */
  1255. #define ESC     0x1B                    /* ESC character.               */
  1256. #define BEL     0x07                    /* ascii bell character         */
  1257. X
  1258. extern  int     ttopen();               /* Forward references.          */
  1259. extern  int     ttgetc();
  1260. extern  int     ttputc();
  1261. extern  int     ttflush();
  1262. extern  int     ttclose();
  1263. extern  int     st520move();
  1264. extern  int     st520eeol();
  1265. extern  int     st520eeop();
  1266. extern  int     st520beep();
  1267. extern  int     st520open();
  1268. extern    int    st520close();
  1269. extern    int    st520rev();
  1270. extern  int st520kopen();
  1271. extern  int st520kclose();
  1272. extern    int st520chgrez();
  1273. X
  1274. #if    COLOR
  1275. extern    int    st520fcol();
  1276. extern    int    st520bcol();
  1277. X
  1278. int        cfcolor = -1;        /* current fg (character) color */
  1279. int        cbcolor = -1;        /* current bg color */
  1280. int        oldpal[8];        /* pallette when emacs was invoked */
  1281. int        newpal[8] = {        /* default emacs pallette */
  1282. X    0x000, 0x700, 0x070, 0x770, 0x007, 0x707, 0x077, 0x777};
  1283. #endif
  1284. X
  1285. int STncolors = 0;        /* number of colors  */
  1286. int STrez;            /* physical screen resolution */    
  1287. X
  1288. /*
  1289. X * Dispatch table. All the
  1290. X * hard fields just point into the
  1291. X * terminal I/O code.
  1292. X */
  1293. TERM    term    = {
  1294. X        NROW-1,
  1295. X        NCOL,
  1296. X    MARGIN,
  1297. X    MARGIN,
  1298. X    SCRSIZ,
  1299. X    NPAUSE,
  1300. X        &st520open,
  1301. X        &st520close,
  1302. X    &st520kopen,
  1303. X    &st520kclose,
  1304. X        &ttgetc,
  1305. X        &ttputc,
  1306. X        &ttflush,
  1307. X        &st520move,
  1308. X        &st520eeol,
  1309. X        &st520eeop,
  1310. X        &st520beep,
  1311. X        &st520rev
  1312. #if    MULTREZ
  1313. X    , &st520chgrez
  1314. #endif
  1315. #if    COLOR
  1316. X    , &st520fcol,
  1317. X    &st520bcol
  1318. #endif
  1319. };
  1320. X    struct KBDvecs {
  1321. X        int (*midivec) ();
  1322. X        int (*vkbderr) ();
  1323. X        int (*vmiderr) ();
  1324. X        int (*statvec) ();
  1325. X        int (*mousevec) ();
  1326. X        int (*clockvec) ();
  1327. X        int (*joyvec) ();
  1328. X        int (*midisys) ();
  1329. X        int (*ikbdsys) ();
  1330. X    };
  1331. X    struct Param {
  1332. X        char topmode;
  1333. X        char buttons;
  1334. X        char xparam;
  1335. X        char yparam;
  1336. X        int xmax,ymax;
  1337. X        int xinitial,yinitial;
  1338. X    };
  1339. X    struct KBDvecs *kbdvecs;
  1340. X    struct Param *paramp;
  1341. X    char kbdcmds[25];
  1342. X
  1343. st520move(row, col)
  1344. {
  1345. X        ttputc(ESC);
  1346. X        ttputc('Y');
  1347. X        ttputc(row+BIAS);
  1348. X        ttputc(col+BIAS);
  1349. }
  1350. X
  1351. st520eeol()
  1352. {
  1353. X        ttputc(ESC);
  1354. X        ttputc('K');
  1355. }
  1356. X
  1357. st520eeop()
  1358. {
  1359. X
  1360. #if    COLOR
  1361. X        st520fcol(gfcolor);
  1362. X        st520bcol(gbcolor);
  1363. #endif
  1364. X        ttputc(ESC);
  1365. X        ttputc('J');
  1366. }
  1367. X
  1368. st520rev(status)    /* set the reverse video state */
  1369. X
  1370. int status;    /* TRUE = reverse video, FALSE = normal video */
  1371. X
  1372. {
  1373. X
  1374. X    if(status) {
  1375. X        ttputc(ESC);
  1376. X        ttputc('p');
  1377. X    }
  1378. X    else {
  1379. X        ttputc(ESC);
  1380. X        ttputc('q');
  1381. X    }
  1382. }
  1383. X
  1384. #if    COLOR
  1385. st520fcol(color)
  1386. int color;    
  1387. {
  1388. X        if(color == cfcolor || !STncolors)
  1389. X            return;
  1390. X        else {
  1391. X
  1392. X            ttputc(ESC);
  1393. X            ttputc('b');
  1394. X            ttputc(color & 0x0f);
  1395. X            cfcolor = color;
  1396. X        }
  1397. }
  1398. X
  1399. st520bcol(color)
  1400. int color;
  1401. {
  1402. X        if(color == cbcolor || !STncolors)
  1403. X            return;
  1404. X        else {
  1405. X            ttputc(ESC);
  1406. X            ttputc('c');
  1407. X            ttputc(color & 0x0f);
  1408. X            cbcolor = color;
  1409. X        }
  1410. X
  1411. }
  1412. #endif
  1413. X
  1414. st520beep()
  1415. {
  1416. #ifdef    BEL
  1417. X        ttputc(BEL);
  1418. X        ttflush();
  1419. #endif
  1420. }
  1421. X
  1422. st520open()
  1423. {
  1424. X    int i,j,k;
  1425. X    long phys, log;    /* screen bases */
  1426. X    
  1427. /* IMPORTANT: it is ABSOLUTELY necessary that the default resolution be the
  1428. X *    largest possible so that display will allocate (malloc) the maximum
  1429. X *    size for the VIDEO arrray
  1430. X */
  1431. X    STrez = Getrez();
  1432. X    switch(STrez) {
  1433. X        case 0: /* low res 25x40 16 colors */
  1434. X            phys = Physbase();
  1435. X            log  = Logbase();
  1436. X            Setscreen(log, phys, 1);
  1437. X            STrez = 1;
  1438. X            /* fall thru to med res */
  1439. X
  1440. X        case 1: /* med res 25x80 4 colors */
  1441. X            term.t_nrow = 25 - 1;
  1442. X            term.t_ncol  = 80;
  1443. X            grez = 1;
  1444. #if    COLOR
  1445. X            STncolors = 4;
  1446. X            for(i=0;i<8;i++) {
  1447. X                oldpal[i] = Setcolor(i,newpal[i]);
  1448. X            }
  1449. #endif
  1450. X            break;
  1451. X        case 2: /* high res 25x80 no colors */
  1452. X            term.t_nrow  = 40 - 1;
  1453. X            term.t_ncol  = 80;
  1454. X            grez = 2;
  1455. X            make_8x10(); /* create a smaller font */
  1456. X            set_40();    /* and go to 40 line mode */
  1457. #if    COLOR
  1458. X            STncolors = 0;
  1459. #endif
  1460. X            break;
  1461. X    }
  1462. X
  1463. X    revexist = TRUE;
  1464. X    eolexist = TRUE;
  1465. X    paramp = (struct Param *)malloc(sizeof(struct Param));
  1466. X    kbdvecs = (struct KBDvecs *)Kbdvbase();
  1467. X    paramp -> topmode = 0;
  1468. X    paramp -> buttons = 4;
  1469. X    paramp -> xparam = 8;
  1470. X    paramp -> yparam = 10;
  1471. X    paramp -> xmax = 79;
  1472. X    paramp -> ymax = 23;
  1473. X    paramp -> xinitial = 0;
  1474. X    paramp -> yinitial = 0;
  1475. X    Initmous(1,paramp,kbdvecs -> mousevec);
  1476. X
  1477. X    i = 0;
  1478. X    kbdcmds[i++] = 0x0a;    /*set mouse keycode mode */
  1479. X    kbdcmds[i++] = 0x08;
  1480. X    kbdcmds[i++] = 0x0a;
  1481. X    Ikbdws(i-1,&kbdcmds[0]);
  1482. X    Cursconf(1,0);
  1483. X    Cursconf(3,0);
  1484. X    Cconout(27);Cconout('E');
  1485. X        ttopen();
  1486. }
  1487. X
  1488. st520close()
  1489. X
  1490. {
  1491. X    int i,j,k;
  1492. X
  1493. X    i = 0;
  1494. X    kbdcmds[i++] = 0x80;    /*reset mouse keycode mode */
  1495. X    kbdcmds[i++] = 0x01;
  1496. X    Ikbdws(i-1,&kbdcmds[0]);
  1497. X    if(grez == 2 && STrez == 2) /* b/w monitor in 40 row mode */
  1498. X        restore();
  1499. X
  1500. #if        COLOR
  1501. X    for(i=0;i<STncolors;i++)
  1502. X        Setcolor(i,oldpal[i]);
  1503. #endif
  1504. X    Cconout(27);Cconout('E');
  1505. X    paramp -> buttons = 0;
  1506. X    Initmous(2,paramp,kbdvecs -> mousevec);
  1507. X    i = 0;
  1508. X    kbdcmds[i++] = 0x80;    /*reset the keyboard*/
  1509. X    kbdcmds[i++] = 0x01;
  1510. X    Ikbdws(i-1,&kbdcmds[0]);
  1511. X    Cursconf(1,0);
  1512. X    ttclose();
  1513. }
  1514. st520kopen()
  1515. {
  1516. X
  1517. }
  1518. st520kclose()
  1519. {
  1520. X
  1521. }
  1522. X
  1523. st520chgrez(nurez)
  1524. int nurez;
  1525. {
  1526. X    int ierr, i, j ,k;
  1527. X    long phys, log;    /* screen bases */
  1528. X    char dum[80]; /* for debugging only */
  1529. X        
  1530. X    if(grez == nurez)
  1531. X        return(TRUE);
  1532. X        
  1533. X    if(STrez == 2) { /* b/w monitor-only allow hi | med rez */
  1534. X        switch(nurez) {
  1535. X            case 2: /* high res */
  1536. X                term.t_nrow  = 40 - 1;
  1537. X                term.t_ncol  = 80;
  1538. X                make_8x10(); /* create a smaller font */
  1539. X                set_40();    /* and go to 40 line mode */
  1540. X                grez = 2;
  1541. X                sgarbf = TRUE;
  1542. X                onlywind(1,1);
  1543. X                break;
  1544. X            case 1: /* med res */
  1545. X                term.t_nrow  = 25 - 1;
  1546. X                term.t_ncol  = 80;
  1547. X                restore();
  1548. X                grez = 1;
  1549. X                sgarbf = TRUE;
  1550. X                onlywind(1,1);
  1551. X                break;
  1552. X            default:
  1553. X                mlwrite("Invalid resolution");
  1554. X                return(FALSE);
  1555. X                break;
  1556. X        }
  1557. X    }
  1558. X    else { /* color monitor-only allow low | medium resolution */
  1559. X        phys = Physbase();
  1560. X        log  = Logbase();
  1561. X        switch(nurez) {
  1562. X            case 1:
  1563. X                term.t_nrow  = 25 - 1;
  1564. X                term.t_ncol  = 80;
  1565. X                Setscreen(log, phys, 1);
  1566. X                STncolors = 4;
  1567. X                grez = 1;
  1568. X                sgarbf = TRUE;
  1569. X                onlywind(1,1);
  1570. X                break;
  1571. X            case 0:
  1572. X                term.t_nrow  = 25 - 1;
  1573. X                term.t_ncol  = 40;
  1574. X                Setscreen(log, phys, 0);
  1575. X                STncolors = 8;
  1576. X                grez = 0;
  1577. X                sgarbf = TRUE;
  1578. X                onlywind(1,1);
  1579. X                break;
  1580. X            default:
  1581. X                mlwrite("%Invalid resolution");
  1582. X                return(FALSE);
  1583. X                break;
  1584. X        }
  1585. X    }
  1586. }            
  1587. X
  1588. STcurblink(onoff)
  1589. int onoff;
  1590. {
  1591. X    if(onoff)
  1592. X        Cursconf(2,0);
  1593. X    else
  1594. X        Cursconf(3,0);
  1595. }
  1596. X
  1597. X
  1598. char parm_save[28];
  1599. long fnt_8x10[640];
  1600. X
  1601. make_8x10()
  1602. {
  1603. X    int i,j,k;
  1604. X    long savea23[2];
  1605. X    
  1606. X    for(i=0;i<640;i++)
  1607. X        fnt_8x10[i] = 0;
  1608. X        
  1609. X    asm {
  1610. X    movem.l    A2-A3,savea23(A6)
  1611. X    
  1612. X    dc.w    LINEA_INIT        ;A1 -> array of font headers
  1613. X
  1614. X    lea    parm_save(A4),A2    ;A2 -> parameters savearea
  1615. X    move.l    V_OFF_AD(A0),(A2)+
  1616. X    move.l    V_FNT_AD(A0),(A2)+
  1617. X    move.w    V_CEL_HT(A0),(A2)+
  1618. X    move.w    V_CEL_MY(A0),(A2)+
  1619. X    move.w    V_CEL_WR(A0),(A2)+
  1620. X
  1621. X
  1622. X    move.l    04(A1),A1        ; A1 -> 8x8 font header
  1623. X    move.l    76(A1),A2        ; A2 -> 8x8 font data
  1624. X    lea    fnt_8x10+0x100(A4),A3    ; A3 -> 2nd line of font buffer
  1625. X    move.w    #0x200-1,D0        ; D0 <- longword counter for font xfer
  1626. X
  1627. fnt_loop:
  1628. X
  1629. X    move.l    (A2)+,(A3)+
  1630. X    dbf    D0,fnt_loop
  1631. X        
  1632. X    movem.l    savea23(A6),A2-A3
  1633. X    }
  1634. X    
  1635. }
  1636. X
  1637. set_40()
  1638. {
  1639. X    long    savea23[2];
  1640. X    
  1641. X    asm {
  1642. X    
  1643. ;
  1644. ;  use the 8x10 character set: 40 line mode
  1645. ;
  1646. X
  1647. X    movem.l    A2-A3,savea23(A6)
  1648. X    
  1649. X    dc.w    LINEA_INIT
  1650. X
  1651. X    move.l    04(A1),A1        ; A1 -> 8x8 font header
  1652. X    move.l    72(A1),V_OFF_AD(A0)    ; v_off_ad <- 8x8  offset table addr
  1653. X    lea    fnt_8x10(A4),A2
  1654. X    move.l    A2,V_FNT_AD(A0)        ; v_fnt_ad <- 8x10 font data addr
  1655. X
  1656. X    move.w    #10,V_CEL_HT(A0)    ; v_cel_ht <- 10   8x10 cell height
  1657. X    move.w    #39,V_CEL_MY(A0)    ; v_cel_my <- 39   maximum cell "Y"
  1658. X    move.w    #800,V_CEL_WR(A0)    ; v_cel_wr <- 800  offset to cell Y+1
  1659. X
  1660. X    movem.l savea23,A2-A3
  1661. X    }
  1662. }
  1663. X
  1664. set_20()
  1665. {
  1666. X    long    savea23[2];
  1667. X
  1668. X    asm {
  1669. X        
  1670. ;
  1671. ;  use the 8x10 character set: 20 line mode
  1672. ;
  1673. X
  1674. X    movem.l    A2-A3,savea23(A6)
  1675. X    
  1676. X    dc.w    LINEA_INIT        ; A0 -> line A variables
  1677. X
  1678. X    move.l    04(A1),A1        ; A1 -> 8x8 font header
  1679. X    move.l    72(A1),V_OFF_AD(A0)    ; v_off_ad <- 8x8  offset table addr
  1680. X    lea    fnt_8x10(A4),A2
  1681. X    move.l    A2,V_FNT_AD(A0)        ; v_fnt_ad <- 8x10 font data addr
  1682. X
  1683. X    move.w    #10,V_CEL_HT(A0)    ; v_cel_ht <- 10   8x10 cell height
  1684. X    move.w    #19,V_CEL_MY(A0)    ; v_cel_my <- 19   maximum cell "Y"
  1685. X    move.w    #1600,V_CEL_WR(A0)    ; v_cel_wr <- 800  offset to cell Y+1
  1686. X    
  1687. X    movem.l    savea23,A2-A3
  1688. X    }
  1689. }
  1690. X
  1691. X
  1692. restore()
  1693. {
  1694. X    long savea23[2];
  1695. X    
  1696. X    asm {
  1697. X    
  1698. ;  return what was saved in parameter save zone    
  1699. X
  1700. X    movem.l    A2-A3,savea23(A6)
  1701. X
  1702. X    dc.w    LINEA_INIT        ; a0 -> line A variables
  1703. X
  1704. X    lea    parm_save(A4),A2    ; a2 -> parameter save area
  1705. X    move.l    (A2)+,V_OFF_AD(A0)
  1706. X    move.l    (A2)+,V_FNT_AD(A0)
  1707. X    move.w    (A2)+,V_CEL_HT(A0)
  1708. X    move.w    (A2)+,V_CEL_MY(A0)
  1709. X    move.w    (A2)+,V_CEL_WR(A0)
  1710. X    
  1711. X    movem.l    savea23(A6),A2-A3
  1712. X    }          
  1713. }
  1714. GetCurStat(onoff)
  1715. int    onoff;
  1716. {
  1717. X    long savea23[2];
  1718. X
  1719. X    asm {
  1720. X    movem.l    A2-A3,savea23(A6)
  1721. X
  1722. X    dc.w    LINEA_INIT        ; a0 -> line A variables
  1723. X    move.w    V_DISAB(A0),onoff(A6)    ; 0 = cursor visible
  1724. X    moveq    #0,D0
  1725. X    move.w    V_DISAB(A0),D0    
  1726. X    movem.l    savea23(A6),A2-A3
  1727. X    }          
  1728. }
  1729. #else
  1730. #if    ATARI & ST520 & LATTICE
  1731. X
  1732. /*
  1733. X    These routines provide support for the ATARI 1040ST using
  1734. the LATTICE compiler using the virtual VT52 Emulator
  1735. X
  1736. */
  1737. X
  1738. #define NROW    40                      /* Screen size.                 */
  1739. #define NCOL    80                      /* Edit if you want to.         */
  1740. #define    MARGIN    8            /* size of minimim margin and    */
  1741. #define    SCRSIZ    64            /* scroll size for extended lines */
  1742. #define    NPAUSE    300            /* # times thru update to pause */
  1743. #define BIAS    0x20                    /* Origin 0 coordinate bias.    */
  1744. #define ESC     0x1B                    /* ESC character.               */
  1745. #define BEL     0x07                    /* ASCII bell character         */
  1746. X
  1747. /****    ST Internals definitions        *****/
  1748. X
  1749. /*    BIOS calls */
  1750. X
  1751. #define    BCONSTAT    1    /* return input device status */
  1752. #define    CONIN        2    /* read character from device */
  1753. #define    BCONOUT        3    /* write character to device */
  1754. X
  1755. /*    XBIOS calls */
  1756. X
  1757. #define    INITMOUS    0    /* initialize the mouse */
  1758. #define    GETREZ        4    /* get current resolution */
  1759. #define    SETSCREEN    5    /* set screen resolution */
  1760. #define    SETPALETTE    6    /* set the color pallette */
  1761. #define    SETCOLOR    7    /* set or read a color */
  1762. #define    CURSCONF    21    /* set cursor configuration */
  1763. #define    IKBDWS        25    /* intelligent keyboard send command */
  1764. #define    KBDVBASE    34    /* get keyboard table base */
  1765. X
  1766. /*    GEMDOS calls */
  1767. X
  1768. #define    EXEC        0x4b    /* Exec off a process */
  1769. X
  1770. #define    CON        2    /* CON: Keyboard and screen device */
  1771. X
  1772. /*    LINE A variables    */
  1773. X
  1774. #define LINEA_INIT 0xA000
  1775. #define V_CEL_WR   -0x28
  1776. #define V_CEL_MY   -0x2a
  1777. #define V_CEL_HT   -0x2e
  1778. #define V_FNT_AD   -0x16
  1779. #define V_OFF_AD   -0x0a
  1780. #define V_DISAB    -346
  1781. X
  1782. /*    Palette color definitions    */
  1783. X
  1784. #define    LOWPAL    "000700070770007707077777"
  1785. #define    MEDPAL    "000700007777"
  1786. #define    HIGHPAL    "000111"
  1787. X
  1788. /*    ST Global definitions        */
  1789. X
  1790. /* keyboard vector table */
  1791. struct KVT {
  1792. X    long midivec;        /* midi input */
  1793. X    long vkbderr;        /* keyboard error */
  1794. X    long vmiderr;        /* MIDI error */
  1795. X    long statvec;        /* IKBD status */
  1796. X    int (*mousevec)();    /* mouse vector */
  1797. X    long clockvec;        /* clock vector */
  1798. X    long joyvec;        /* joystict vector */
  1799. } *ktable;
  1800. X
  1801. int (*sysmint)();            /* system mouse interupt handler */
  1802. X
  1803. /* mouse parameter table */
  1804. struct Param {
  1805. X    char topmode;
  1806. X    char buttons;
  1807. X    char xparam;
  1808. X    char yparam;
  1809. X    int xmax,ymax;
  1810. X    int xinitial,yinitial;
  1811. } mparam;
  1812. X
  1813. int initrez;            /* initial screen resolution */
  1814. int currez;            /* current screen resolution */
  1815. char resname[][8] = {        /* screen resolution names */
  1816. X    "LOW", "MEDIUM", "HIGH", "DENSE"
  1817. };
  1818. short spalette[16];            /* original color palette settings */
  1819. short palette[16];            /* current palette settings */
  1820. X
  1821. extern  int     ttopen();               /* Forward references.          */
  1822. extern  int     ttgetc();
  1823. extern  int     ttputc();
  1824. extern  int     ttflush();
  1825. extern  int     ttclose();
  1826. extern  int     stmove();
  1827. extern  int     steeol();
  1828. extern  int     steeop();
  1829. extern  int     stbeep();
  1830. extern  int     stopen();
  1831. extern    int    stclose();
  1832. extern    int    stgetc();
  1833. extern    int    stputc();
  1834. extern    int    strev();
  1835. extern    int    strez();
  1836. extern    int    stkopen();
  1837. extern    int    stkclose();
  1838. X
  1839. #if    COLOR
  1840. extern    int    stfcol();
  1841. extern    int    stbcol();
  1842. #endif
  1843. X
  1844. /*
  1845. X * Dispatch table. All the
  1846. X * hard fields just point into the
  1847. X * terminal I/O code.
  1848. X */
  1849. TERM    term    = {
  1850. X    NROW-1,
  1851. X        NROW-1,
  1852. X        NCOL,
  1853. X        NCOL,
  1854. X    MARGIN,
  1855. X    SCRSIZ,
  1856. X    NPAUSE,
  1857. X        &stopen,
  1858. X        &stclose,
  1859. X    &stkopen,
  1860. X    &stkclose,
  1861. X        &stgetc,
  1862. X    &stputc,
  1863. X        &ttflush,
  1864. X        &stmove,
  1865. X        &steeol,
  1866. X        &steeop,
  1867. X        &stbeep,
  1868. X        &strev,
  1869. X    &strez
  1870. #if    COLOR
  1871. X    , &stfcol,
  1872. X    &stbcol
  1873. #endif
  1874. };
  1875. X
  1876. stmove(row, col)
  1877. {
  1878. X        stputc(ESC);
  1879. X        stputc('Y');
  1880. X        stputc(row+BIAS);
  1881. X        stputc(col+BIAS);
  1882. }
  1883. X
  1884. steeol()
  1885. {
  1886. X        stputc(ESC);
  1887. X        stputc('K');
  1888. }
  1889. X
  1890. steeop()
  1891. {
  1892. #if    COLOR
  1893. X    stfcol(gfcolor);
  1894. X    stbcol(gbcolor);
  1895. #endif
  1896. X        stputc(ESC);
  1897. X        stputc('J');
  1898. }
  1899. X
  1900. strev(status)    /* set the reverse video state */
  1901. X
  1902. int status;    /* TRUE = reverse video, FALSE = normal video */
  1903. X
  1904. {
  1905. X    if (currez > 1) {
  1906. X        stputc(ESC);
  1907. X        stputc(status ? 'p' : 'q');
  1908. X    }
  1909. }
  1910. X
  1911. #if    COLOR
  1912. mapcol(clr)    /* medium rez color translation */
  1913. X
  1914. int clr;    /* emacs color number to translate */
  1915. X
  1916. {
  1917. X    static int mctable[] = {0, 1, 2, 3, 2, 1, 2, 3};
  1918. X
  1919. X    if (currez != 1)
  1920. X        return(clr);
  1921. X    else
  1922. X        return(mctable[clr]);
  1923. }
  1924. X
  1925. stfcol(color)    /* set the forground color */
  1926. X
  1927. int color;    /* color to set forground to */
  1928. X
  1929. {
  1930. X    if (currez < 2) {
  1931. X        stputc(ESC);
  1932. X        stputc('b');
  1933. X        stputc(mapcol(color));
  1934. X    }
  1935. }
  1936. X
  1937. stbcol(color)    /* set the background color */
  1938. X
  1939. int color;    /* color to set background to */
  1940. X
  1941. X
  1942. {
  1943. X    if (currez < 2) {
  1944. X        stputc(ESC);
  1945. X        stputc('c');
  1946. X        stputc(mapcol(color));
  1947. X    }
  1948. }
  1949. #endif
  1950. X
  1951. stbeep()
  1952. {
  1953. X        stputc(BEL);
  1954. X        ttflush();
  1955. }
  1956. X
  1957. domouse()    /* mouse interupt handler */
  1958. X
  1959. {
  1960. X    return((*sysmint)());
  1961. }
  1962. X
  1963. stkopen()    /* open the keyboard (and mouse) */
  1964. X
  1965. {
  1966. X    /* grab the keyboard vector table */
  1967. X    ktable = (struct KVT *)xbios(KBDVBASE);
  1968. X    sysmint = ktable->mousevec;    /* save mouse vector */
  1969. X
  1970. X    /* initialize the mouse */
  1971. X    mparam.topmode = 0;
  1972. X    mparam.buttons = 4;
  1973. X    mparam.xparam = 8;
  1974. X    mparam.yparam = 10;
  1975. X    mparam.xmax = 79;
  1976. X    mparam.ymax = 23;
  1977. X    mparam.xinitial = 0;
  1978. X    mparam.yinitial = 0;
  1979. X    xbios(INITMOUS, 4, &mparam, &domouse);
  1980. }
  1981. X
  1982. stopen()    /* open the screen */
  1983. X
  1984. {
  1985. X    int i;
  1986. X
  1987. X        ttopen();
  1988. X    eolexist = TRUE;
  1989. X
  1990. X    /* switch to a steady cursor */
  1991. X    xbios(CURSCONF, 3);
  1992. X
  1993. X    /* save the current color palette */
  1994. X    for (i=0; i<16; i++)
  1995. X        spalette[i] = xbios(SETCOLOR, i, -1);
  1996. X
  1997. X    /* and find the current resolution */
  1998. X    initrez = currez = xbios(GETREZ);
  1999. X    strcpy(sres, resname[currez]);
  2000. X
  2001. X    /* set up the screen size and palette */
  2002. X    switch (currez) {
  2003. X        case 0:    term.t_mrow = 25 - 1;
  2004. X            term.t_nrow = 25 - 1;
  2005. X            term.t_ncol = 40;
  2006. X            strcpy(palstr, LOWPAL);
  2007. X            break;
  2008. X
  2009. X        case 1: term.t_mrow = 25 - 1;
  2010. X            term.t_nrow = 25 - 1;
  2011. X            strcpy(palstr, MEDPAL);
  2012. X            break;
  2013. X
  2014. X        case 2: term.t_mrow = 40 - 1;
  2015. X            term.t_nrow = 25 - 1;
  2016. X            strcpy(palstr, HIGHPAL);
  2017. X    }
  2018. X
  2019. X    /* and set up the default palette */
  2020. X    spal(palstr);
  2021. X
  2022. X    stputc(ESC);    /* automatic overflow off */
  2023. X    stputc('w');
  2024. X    stputc(ESC);    /* turn cursor on */
  2025. X    stputc('e');
  2026. }
  2027. X
  2028. stkclose()    /* close the keyboard (and mouse) */
  2029. X
  2030. {
  2031. X    static char resetcmd[] = {0x80, 0x01};    /* keyboard reset command */
  2032. X
  2033. X    /* restore the mouse interupt routines */
  2034. X    xbios(INITMOUS, 2, &mparam, (long)sysmint);
  2035. X
  2036. X    /* and reset the keyboard controller */
  2037. X    xbios(IKBDWS, 1, &resetcmd[0]);
  2038. }
  2039. X
  2040. stclose()
  2041. X
  2042. {
  2043. X    stputc(ESC);    /* auto overflow on */
  2044. X    stputc('v');
  2045. X
  2046. X    /* switch to a flashing cursor */
  2047. X    xbios(CURSCONF, 2);
  2048. X
  2049. X    /* restore the original screen resolution */
  2050. X    strez(resname[initrez]);
  2051. X
  2052. X    /* restore the original palette settings */
  2053. X    xbios(SETPALETTE, spalette);
  2054. X
  2055. X    ttclose();
  2056. }
  2057. X
  2058. /*     spal(pstr):    reset the current palette according to a
  2059. X            "palette string" of the form
  2060. X
  2061. X    000111222333444555666777
  2062. X
  2063. X    which contains the octal values for the palette registers
  2064. */
  2065. X
  2066. spal(pstr)
  2067. X
  2068. char *pstr;    /* palette string */
  2069. X
  2070. {
  2071. X    int pal;    /* current palette position */
  2072. X    int clr;    /* current color value */
  2073. X    int i;
  2074. X
  2075. X    for (pal = 0; pal < 16; pal++) {
  2076. X        if (*pstr== 0)
  2077. X            break;
  2078. X
  2079. X        /* parse off a color */
  2080. X        clr = 0;
  2081. X        for (i = 0; i < 3; i++)
  2082. X            if (*pstr)
  2083. X                clr = clr * 16 + (*pstr++ - '0');
  2084. X        palette[pal] = clr;
  2085. X    };
  2086. X
  2087. X    /* and now set it */
  2088. X    xbios(SETPALETTE, palette);
  2089. }
  2090. X
  2091. stgetc()    /* get a char from the keyboard */
  2092. X
  2093. {
  2094. X    int rval;        /* return value from BIOS call */
  2095. X    static int funkey = 0;    /* held fuction key scan code */
  2096. X
  2097. X    /* if there is a pending function key, return it */
  2098. X    if (funkey) {
  2099. X        rval = funkey;
  2100. X        funkey = 0;
  2101. X    } else {
  2102. X        /* waiting... flash the cursor */
  2103. X        xbios(CURSCONF, 2);
  2104. X
  2105. X        /* get the character */
  2106. X        rval = bios(CONIN, CON);
  2107. X        if ((rval & 255) == 0) {
  2108. X            funkey = (rval >> 16) & 255;
  2109. X            rval = 0;
  2110. X        }
  2111. X
  2112. X        /* and switch to a steady cursor */
  2113. X        xbios(CURSCONF, 3);
  2114. X    }
  2115. X
  2116. X    return(rval & 255);
  2117. }
  2118. X
  2119. stputc(c)    /* output char c to the screen */
  2120. X
  2121. char c;        /* character to print out */
  2122. X
  2123. {
  2124. X    bios(BCONOUT, CON, c);
  2125. }
  2126. X
  2127. strez(newrez)    /* change screen resolution */
  2128. X
  2129. char *newrez;    /* requested resolution */
  2130. X
  2131. {
  2132. X    int nrez;    /* requested new resolution */
  2133. X
  2134. X    /* first, decode the resolution name */
  2135. X    for (nrez = 0; nrez < 4; nrez++)
  2136. X        if (strcmp(newrez, resname[nrez]) == 0)
  2137. X            break;
  2138. X    if (nrez == 4) {
  2139. X        mlwrite("%%No such resolution");
  2140. X        return(FALSE);
  2141. X    }
  2142. X
  2143. X    /* next, make sure this resolution is legal for this monitor */
  2144. X    if ((currez < 2 && nrez > 1) || (currez > 1 && nrez < 2)) {
  2145. X        mlwrite("%%Resolution illegal for this monitor");
  2146. X        return(FALSE);
  2147. X    }
  2148. X
  2149. X    /* eliminate non-changes */
  2150. X    if (currez == nrez)
  2151. X        return(TRUE);
  2152. X
  2153. X    /* finally, make the change */
  2154. X    switch (nrez) {
  2155. X        case 0:    /* low resolution - 16 colors */
  2156. X            newwidth(TRUE, 40);
  2157. X            strcpy(palstr, LOWPAL);
  2158. X            xbios(SETSCREEN, -1, -1, 0);
  2159. X            break;
  2160. X
  2161. X        case 1:    /* medium resolution - 4 colors */
  2162. X            newwidth(TRUE, 80);
  2163. X            strcpy(palstr, MEDPAL);
  2164. X            xbios(SETSCREEN, -1, -1, 1);
  2165. X            break;
  2166. X
  2167. X        case 2:    /* High resolution - 2 colors - 25 lines */
  2168. X            newscreensize(25, term.t_ncol);
  2169. X            strcpy(palstr, HIGHPAL);
  2170. X            /* change char set back to normal */
  2171. X            break;
  2172. X
  2173. X        case 3:    /* Dense resolution - 2 colors - 40 lines */
  2174. X            newscreensize(40, term.t_ncol);
  2175. X            strcpy(palstr, HIGHPAL);
  2176. X            /*change char set size */
  2177. X            break;
  2178. X    }
  2179. X
  2180. X    /* and set up the default palette */
  2181. X    spal(palstr);
  2182. X    currez = nrez;
  2183. X    strcpy(sres, resname[currez]);
  2184. X
  2185. X    stputc(ESC);    /* automatic overflow off */
  2186. X    stputc('w');
  2187. X    stputc(ESC);    /* turn cursor on */
  2188. X    stputc('e');
  2189. X
  2190. X    return(TRUE);
  2191. }
  2192. X
  2193. system(cmd)    /* call the system to execute a new program */
  2194. X
  2195. char *cmd;    /* command to execute */
  2196. X
  2197. {
  2198. X    char *pptr;            /* pointer into program name */
  2199. X    char pname[NSTRING];        /* name of program to execute */
  2200. X    char tail[NSTRING];        /* command tail */
  2201. X
  2202. X    /* scan off program name.... */
  2203. X    pptr = pname;
  2204. X    while (*cmd && (*cmd != ' ' && *cmd != '\t'))
  2205. X        *pptr++ = *cmd++;
  2206. X    *pptr = 0;
  2207. X
  2208. X    /* create program name length/string */
  2209. X    tail[0] = strlen(cmd);
  2210. X    strcpy(&tail[1], cmd);
  2211. X
  2212. X    /* go do it! */
  2213. X    return(gemdos(        (int)EXEC,
  2214. X                (int)0,
  2215. X                (char *)pname,
  2216. X                (char *)tail,
  2217. X                (char *)NULL));
  2218. }
  2219. X
  2220. #if    TYPEAH
  2221. typahead()
  2222. X
  2223. {
  2224. X    int rval;    /* return value from BIOS call */
  2225. X
  2226. X    /* get the status of the console */
  2227. X    rval = bios(BCONSTAT, CON);
  2228. X
  2229. X    /* end return the results */
  2230. X    if (rval == 0)
  2231. X        return(FALSE);
  2232. X    else
  2233. X        return(TRUE);
  2234. }
  2235. #endif
  2236. X
  2237. #if    FLABEL
  2238. fnclabel(f, n)        /* label a function key */
  2239. X
  2240. int f,n;    /* default flag, numeric argument [unused] */
  2241. X
  2242. {
  2243. X    /* on machines with no function keys...don't bother */
  2244. X    return(TRUE);
  2245. }
  2246. #endif
  2247. #else
  2248. sthello()
  2249. {
  2250. }
  2251. #endif
  2252. #endif
  2253. X
  2254. SHAR_EOF
  2255. chmod 0444 st520.c ||
  2256. echo 'restore of st520.c failed'
  2257. Wc_c="`wc -c < 'st520.c'`"
  2258. test 19931 -eq "$Wc_c" ||
  2259.     echo 'st520.c: original size 19931, current size' "$Wc_c"
  2260. # ============= tags ==============
  2261. echo 'x - extracting tags (Text)'
  2262. sed 's/^X//' << 'SHAR_EOF' > 'tags' &&
  2263. ABORT    estruct.h    /^#define ABORT    2            \/* Death, ESC, abort, etc.    *\/$/
  2264. ABS    estruct.h    /^#define ABS    0x10    \/* command causes absolute (i.e. non-relative) motion *\/$/
  2265. AEDIT    estruct.h    /^#define    AEDIT    1    \/* advanced editing options: e.g. en\/detabbing    *\/$/
  2266. ALTDOTO    undo.c    /^#define ALTDOTO(bp) (bp->b_uddotos[1^(bp->b_udstki/
  2267. ALTDOTP    undo.c    /^#define ALTDOTP(bp) (bp->b_uddotps[1^(bp->b_udstki/
  2268. ALTSTK    undo.c    /^#define ALTSTK(bp) (&(bp->b_udstks[1^(bp->b_udstki/
  2269. AMG_MAXBUF    termio.c    /^#define AMG_MAXBUF      1024L$/
  2270. AMIGA    estruct.h    /^#define AMIGA    0            \/* AmigaDOS            *\/$/
  2271. ANSI    estruct.h    /^#define ANSI    0            \/* ANSI escape sequences    *\/$/
  2272. ANY    estruct.h    /^#define    ANY        2$/
  2273. APROP    estruct.h    /^#define    APROP    1    \/* Add code for Apropos command    (needs REBIND)    *\/$/
  2274. AT386    estruct.h    /^#define AT386    0            \/* AT style 386 unix console    *\/$/
  2275. ATARI    estruct.h    /^#define    ATARI    0            \/* Atari 520\/1040ST screen    *\/$/
  2276. AZTEC    estruct.h    /^#define    AZTEC    0    \/* Aztec C 3.20e *\/$/
  2277. BACK    csrch.c    /^#define BACK 0$/
  2278. BANG    estruct.h    /^#define BANG    (4<<16)        \/* allow a ! after the command name *\/$/
  2279. BEL    tcap.c    /^#define BEL     0x07$/
  2280. BFCHG    estruct.h    /^#define BFCHG    0x02            \/* Changed since last write    *\/$/
  2281. SHAR_EOF
  2282. true || echo 'restore of tags failed'
  2283. echo 'End of Vile part 13'
  2284. echo 'File tags is continued in part 14'
  2285. echo 14 > _shar_seq_.tmp
  2286. exit 0
  2287. -- 
  2288.         paul fox, pgf@cayman.com, (617)494-1999
  2289.         Cayman Systems, 26 Landsdowne St., Cambridge, MA 02139
  2290.