home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / gnu / emacs-18.59-src.lha / src / diffs / emacs-18.59.diffs
Text File  |  1993-10-03  |  325KB  |  11,140 lines

  1. diff -rcP emacs-18.59-fsf/cpp/SCOPTIONS emacs-18.59-amiga/cpp/SCOPTIONS
  2. *** emacs-18.59-fsf/cpp/SCOPTIONS    Thu Jan  1 00:00:00 1970
  3. --- emacs-18.59-amiga/cpp/SCOPTIONS    Sat Jun  5 12:01:06 1993
  4. ***************
  5. *** 0 ****
  6. --- 1,7 ----
  7. + IGNORE=161
  8. + IGNORE=154
  9. + IGNORE=100
  10. + IGNORE=181
  11. + IGNORE=84
  12. + IGNORE=93
  13. + IGNORE=72
  14. \ No newline at end of file
  15. diff -rcP emacs-18.59-fsf/cpp/cccp.c emacs-18.59-amiga/cpp/cccp.c
  16. *** emacs-18.59-fsf/cpp/cccp.c    Fri Sep 28 20:17:57 1990
  17. --- emacs-18.59-amiga/cpp/cccp.c    Sat Jun  5 12:07:16 1993
  18. ***************
  19. *** 97,103 ****
  20. --- 97,113 ----
  21.   
  22.   #ifdef EMACS
  23.   #define NO_SHORTNAMES
  24. + #ifdef AMIGA
  25. + #include "/src/config.h"
  26. + #undef fflush
  27. + #undef fwrite
  28. + #undef main
  29. + #undef putchar
  30. + #undef AMIGA_DUMP
  31. + #include <string.h>
  32. + #else
  33.   #include "../src/config.h"
  34. + #endif
  35.   #ifdef static
  36.   #undef static
  37.   #endif
  38. ***************
  39. *** 115,121 ****
  40. --- 125,135 ----
  41.   #include <ctype.h>
  42.   #include <stdio.h>
  43.   #ifndef USG
  44. + #ifdef AMIGA
  45. + #include <time.h>
  46. + #else
  47.   #include <sys/time.h>        /* for __DATE__ and __TIME__ */
  48. + #endif
  49.   #else
  50.   #define index strchr
  51.   #define rindex strrchr
  52. ***************
  53. *** 123,130 ****
  54. --- 137,146 ----
  55.   #include <fcntl.h>
  56.   #endif /* USG */
  57.   
  58. + #ifndef AMIGA
  59.   void bcopy (), bzero ();
  60.   int bcmp ();
  61. + #endif
  62.   
  63.   char *xmalloc (), *xrealloc (), *xcalloc ();
  64.   void fatal (), pfatal_with_name (), perror_with_name ();
  65. ***************
  66. *** 142,156 ****
  67. --- 158,186 ----
  68.   /* #include "file" starts with the first entry in the stack */
  69.   /* #include <file> starts with the second. */
  70.   /* -I directories are added after the first */
  71. + #ifdef AMIGA
  72. + struct directory_stack default_includes[2] =
  73. +   {
  74. +     { &default_includes[1], "" },
  75. +     { 0, "include:" }
  76. +   };
  77. + #else
  78.   struct directory_stack default_includes[2] =
  79.     {
  80.       { &default_includes[1], "." },
  81.       { 0, "/usr/include" }
  82.     };
  83. + #endif
  84.   struct directory_stack *include = &default_includes[0];
  85.   
  86. + #ifdef AMIGA
  87.   int max_include_len = 14;    /* strlen (default_include) + 2
  88.                               (for / and null) */
  89. + #else
  90. + int max_include_len = 9;    /* strlen (default_include) + 1
  91. +                             (for null) */
  92. + #endif
  93.   
  94.   char STDIN_FILE[] = "";        /* Empty, like real cpp */
  95.   int put_out_comments = 0;    /* JF non-zero means leave comments in the
  96. ***************
  97. *** 379,385 ****
  98.       dirtmp->next = include->next;
  99.       include->next = dirtmp;
  100.       dirtmp->fname = argv[i]+2;
  101. -     include = dirtmp;
  102.       if (strlen (argv[i]) > max_include_len)
  103.         max_include_len = strlen (argv[i]);
  104.       break;
  105. --- 409,414 ----
  106. ***************
  107. *** 405,415 ****
  108.     else if ((f = open (in_fname, O_RDONLY)) < 0)
  109.       goto perror;
  110.   
  111. !   fstat (f, &sbuf);
  112.     fp->fname = in_fname;
  113.     fp->lineno = 1;
  114.     /* JF all this is mine about reading pipes and ttys */
  115. !   if ((sbuf.st_mode & S_IFMT) != S_IFREG) {
  116.       int size;
  117.       int bsize;
  118.       int cnt;
  119. --- 434,444 ----
  120.     else if ((f = open (in_fname, O_RDONLY)) < 0)
  121.       goto perror;
  122.   
  123. !   if (f) fstat (f, &sbuf);
  124.     fp->fname = in_fname;
  125.     fp->lineno = 1;
  126.     /* JF all this is mine about reading pipes and ttys */
  127. !   if (!f || (sbuf.st_mode & S_IFMT) != S_IFREG) {
  128.       int size;
  129.       int bsize;
  130.       int cnt;
  131. ***************
  132. *** 478,488 ****
  133.     struct keyword_table *handle_directive ();
  134.     int excess_newlines = 0;
  135.     int escaped = 0;
  136. !   
  137.     U_CHAR *bp;
  138. !   
  139.     check_expand(op, ip->length);
  140. !   
  141.     ip->bufp = ip->buf;
  142.     limit = ip->buf + ip->length;
  143.     while (1) {
  144. --- 507,517 ----
  145.     struct keyword_table *handle_directive ();
  146.     int excess_newlines = 0;
  147.     int escaped = 0;
  148.     U_CHAR *bp;
  149.     check_expand(op, ip->length);
  150.     ip->bufp = ip->buf;
  151.     limit = ip->buf + ip->length;
  152.     while (1) {
  153. ***************
  154. *** 615,639 ****
  155.           *op->bufp++ = '/';
  156.         ip->bufp = bp + 1;
  157.         break;
  158. !       
  159.       case '0': case '1': case '2': case '3': case '4':
  160.       case '5': case '6': case '7': case '8': case '9':
  161.         /* if digit is not part of identifier, it is random */
  162.         if (ident_length == 0)
  163.       goto randomchar;
  164.         /* fall through */
  165. !       
  166.       case '_':
  167.       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  168.       case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  169.       case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  170.       case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  171. !     case 'y': case 'z': 
  172.       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  173.       case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  174.       case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  175.       case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  176. !     case 'Y': case 'Z': 
  177.         ident_length++;
  178.         /* compute step of hash function, to avoid a proc call on every token */
  179.         hash = HASHSTEP(hash, c);
  180. --- 644,668 ----
  181.           *op->bufp++ = '/';
  182.         ip->bufp = bp + 1;
  183.         break;
  184.       case '0': case '1': case '2': case '3': case '4':
  185.       case '5': case '6': case '7': case '8': case '9':
  186.         /* if digit is not part of identifier, it is random */
  187.         if (ident_length == 0)
  188.       goto randomchar;
  189.         /* fall through */
  190.       case '_':
  191.       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  192.       case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  193.       case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  194.       case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  195. !     case 'y': case 'z':
  196.       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  197.       case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  198.       case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  199.       case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  200. !     case 'Y': case 'Z':
  201.         ident_length++;
  202.         /* compute step of hash function, to avoid a proc call on every token */
  203.         hash = HASHSTEP(hash, c);
  204. ***************
  205. *** 646,676 ****
  206.       for (hp = hashtab[MAKE_POS(hash) % HASHSIZE]; hp != NULL;
  207.            hp = hp->next) {
  208.             U_CHAR *save_ibufp;    /* kludge, see below */
  209. !           
  210.             if (hp->length == ident_length) {
  211.           register int i = ident_length;
  212.           register U_CHAR *p = hp->name;
  213.           register U_CHAR *q = op->bufp - i;
  214.   
  215. !         if (c != (U_CHAR) -1)
  216.             q--;
  217.   
  218.           do {        /* all this to avoid a strncmp() */
  219.             if (*p++ != *q++)
  220.           goto hashcollision;
  221.           } while (--i);
  222. !      
  223.           save_ibufp = ip->bufp;
  224.           /* back up over identifier, then expand token */
  225.           op->bufp -= ident_length;
  226. !         if (c != (U_CHAR) -1) op->bufp--;
  227.           macroexpand (hp, ip, op, &excess_newlines);
  228.   
  229.           check_expand(op, ip->length - (ip->bufp - ip->buf));
  230. !         
  231.           /* If we just processed an identifier at end of input,
  232.              return right away.  */
  233. !         if (c == (U_CHAR) -1)
  234.             return;
  235.   
  236.           /* if the expansion routine has not moved the input
  237. --- 675,705 ----
  238.       for (hp = hashtab[MAKE_POS(hash) % HASHSIZE]; hp != NULL;
  239.            hp = hp->next) {
  240.             U_CHAR *save_ibufp;    /* kludge, see below */
  241.             if (hp->length == ident_length) {
  242.           register int i = ident_length;
  243.           register U_CHAR *p = hp->name;
  244.           register U_CHAR *q = op->bufp - i;
  245.   
  246. !         if (c != -1)
  247.             q--;
  248.   
  249.           do {        /* all this to avoid a strncmp() */
  250.             if (*p++ != *q++)
  251.           goto hashcollision;
  252.           } while (--i);
  253.           save_ibufp = ip->bufp;
  254.           /* back up over identifier, then expand token */
  255.           op->bufp -= ident_length;
  256. !         if (c != -1) op->bufp--;
  257.           macroexpand (hp, ip, op, &excess_newlines);
  258.   
  259.           check_expand(op, ip->length - (ip->bufp - ip->buf));
  260.           /* If we just processed an identifier at end of input,
  261.              return right away.  */
  262. !         if (c == -1)
  263.             return;
  264.   
  265.           /* if the expansion routine has not moved the input
  266. ***************
  267. *** 679,685 ****
  268.              reason to put it back or not put it back. */
  269.           if (ip->bufp == save_ibufp)
  270.             *op->bufp++ = c;
  271. !         
  272.           break;        /* out of for loop */
  273.         }
  274.   hashcollision:
  275. --- 708,714 ----
  276.              reason to put it back or not put it back. */
  277.           if (ip->bufp == save_ibufp)
  278.             *op->bufp++ = c;
  279.           break;        /* out of for loop */
  280.         }
  281.   hashcollision:
  282. ***************
  283. *** 687,693 ****
  284.       }            /* end for loop */
  285.       ident_length = hash = 0; /* stop collecting identifier */
  286.         }
  287. !         
  288.         /* If we just processed an identifier at end of input,
  289.        return right away.  */
  290.         if (c == -1)
  291. --- 716,722 ----
  292.       }            /* end for loop */
  293.       ident_length = hash = 0; /* stop collecting identifier */
  294.         }
  295.         /* If we just processed an identifier at end of input,
  296.        return right away.  */
  297.         if (c == -1)
  298. ***************
  299. *** 746,752 ****
  300.     while (is_idchar[*cp])
  301.       cp++;
  302.     ident_length = cp - bp;
  303. !   
  304.     /*
  305.      * Decode the keyword and call the appropriate expansion
  306.      * routine, after moving the input pointer up to the next line.
  307. --- 775,781 ----
  308.     while (is_idchar[*cp])
  309.       cp++;
  310.     ident_length = cp - bp;
  311.     /*
  312.      * Decode the keyword and call the appropriate expansion
  313.      * routine, after moving the input pointer up to the next line.
  314. ***************
  315. *** 758,770 ****
  316.         register U_CHAR *buf;
  317.         register U_CHAR *limit = ip->buf + ip->length;
  318.         U_CHAR *skip_to_end_of_comment();
  319. !       
  320.         buf = bp = bp + ident_length;
  321.         while (bp < limit) {
  322.       if (*bp == '\'' || *bp == '\"') {        /* JF handle quotes right  */
  323.         U_CHAR quotec;
  324.   
  325. !       for (quotec = *bp++; bp < limit && *bp != quotec; bp++) {
  326.           if (*bp == '\\') bp++;
  327.           if (*bp == '\n') {
  328.             if (bp[-1] == '\\')
  329. --- 787,804 ----
  330.         register U_CHAR *buf;
  331.         register U_CHAR *limit = ip->buf + ip->length;
  332.         U_CHAR *skip_to_end_of_comment();
  333.         buf = bp = bp + ident_length;
  334.         while (bp < limit) {
  335.       if (*bp == '\'' || *bp == '\"') {        /* JF handle quotes right  */
  336.         U_CHAR quotec;
  337.   
  338. !       for (quotec = *bp++; bp < limit; bp++) {
  339. !         if (*bp == quotec)
  340. !           {
  341. !         bp++;
  342. !         break;
  343. !           }
  344.           if (*bp == '\\') bp++;
  345.           if (*bp == '\n') {
  346.             if (bp[-1] == '\\')
  347. ***************
  348. *** 801,813 ****
  349.                             some slop */
  350.       bp = buf;
  351.       buf = cp;
  352. !     
  353.       while (bp < limit) {
  354.         if (*bp == '\'' || *bp == '\"') {    /* JF handle quotes right  */
  355.           U_CHAR quotec;
  356.   
  357.           *cp++ = *bp;
  358. !         for (quotec = *bp++; bp < limit && *bp != quotec; *cp++ = *bp++) {
  359.             if (*bp == '\\')
  360.           *cp++ = *bp++;
  361.             if (*bp == '\n') {
  362. --- 835,852 ----
  363.                             some slop */
  364.       bp = buf;
  365.       buf = cp;
  366.       while (bp < limit) {
  367.         if (*bp == '\'' || *bp == '\"') {    /* JF handle quotes right  */
  368.           U_CHAR quotec;
  369.   
  370.           *cp++ = *bp;
  371. !         for (quotec = *bp++; bp < limit; *cp++ = *bp++) {
  372. !           if (*bp == quotec)
  373. !         {
  374. !           *cp++ = *bp++;
  375. !           break;
  376. !         }
  377.             if (*bp == '\\')
  378.           *cp++ = *bp++;
  379.             if (*bp == '\n') {
  380. ***************
  381. *** 939,950 ****
  382.         ++ip->bufp;
  383.       }
  384.       break;
  385. !     
  386.   oops:
  387. !     
  388.       error ("`defined' must be followed by IDENT or (IDENT)");
  389.       break;
  390. !       
  391.     default:
  392.       error("CCCP error: illegal special hash type"); /* time for gdb */
  393.       abort ();
  394. --- 978,989 ----
  395.         ++ip->bufp;
  396.       }
  397.       break;
  398.   oops:
  399.       error ("`defined' must be followed by IDENT or (IDENT)");
  400.       break;
  401.     default:
  402.       error("CCCP error: illegal special hash type"); /* time for gdb */
  403.       abort ();
  404. ***************
  405. *** 953,959 ****
  406.     check_expand(op, len);
  407.     bcopy (buf, op->bufp, len);
  408.     op->bufp += len;
  409. !   
  410.     return;
  411.   }
  412.   
  413. --- 992,998 ----
  414.     check_expand(op, len);
  415.     bcopy (buf, op->bufp, len);
  416.     op->bufp += len;
  417.     return;
  418.   }
  419.   
  420. ***************
  421. *** 978,984 ****
  422.     struct stat sbuf;        /* to stat the include file */
  423.     FILE_BUF *fp;    /* for input stack frame */
  424.     struct directory_stack *stackp;
  425. !   int flen;
  426.   
  427.     int save_indepth = indepth;
  428.                   /* in case of errors */
  429. --- 1017,1023 ----
  430.     struct stat sbuf;        /* to stat the include file */
  431.     FILE_BUF *fp;    /* for input stack frame */
  432.     struct directory_stack *stackp;
  433. !   int flen, maxlen;
  434.   
  435.     int save_indepth = indepth;
  436.                   /* in case of errors */
  437. ***************
  438. *** 1019,1025 ****
  439. --- 1058,1068 ----
  440.     if (err)
  441.       goto nope;
  442.   
  443. +   /* DG: This doesn't handle includes of aa:... on the Amiga */
  444. +   /* It doesn't seem worth it. */
  445.     other_dir = NULL;
  446. +   maxlen = max_include_len;
  447. + #if 0
  448.     if (stackp == include)
  449.       {
  450.         fp = &instack[indepth];
  451. ***************
  452. *** 1037,1049 ****
  453.             other_dir = (char *) alloca (n + 1);
  454.             strncpy (other_dir, nam, n);
  455.             other_dir[n] = '\0';
  456.           }
  457.             break;
  458.           }
  459.       }
  460.       }
  461.                 /* JF search directory path */
  462. !   fname = (char *) alloca (max_include_len + flen);
  463.     for (; stackp; stackp = stackp->next)
  464.       {
  465.         if (other_dir)
  466. --- 1080,1094 ----
  467.             other_dir = (char *) alloca (n + 1);
  468.             strncpy (other_dir, nam, n);
  469.             other_dir[n] = '\0';
  470. +                   if (n + 4 > maxlen) maxlen = n + 4;
  471.           }
  472.             break;
  473.           }
  474.       }
  475.       }
  476. + #endif
  477.                 /* JF search directory path */
  478. !   fname = (char *) alloca (maxlen + flen);
  479.     for (; stackp; stackp = stackp->next)
  480.       {
  481.         if (other_dir)
  482. ***************
  483. *** 1053,1058 ****
  484. --- 1098,1107 ----
  485.       }
  486.         else
  487.       strcpy (fname, stackp->fname);
  488. + #ifdef AMIGA
  489. +       if (fname[0] != 0 && fname[strlen(fname) - 1] != ':')
  490. +       /* Don't add / after : or empty strings */
  491. + #endif
  492.         strcat (fname, "/");
  493.         strncat (fname, fbeg, flen);
  494.         if ((f = open (fname, O_RDONLY)) >= 0)
  495. ***************
  496. *** 1064,1070 ****
  497. --- 1113,1123 ----
  498.         goto nope;
  499.       }
  500.   
  501. + #ifdef AMIGA
  502. +   if (stat(fname, &sbuf) < 0)
  503. + #else
  504.     if (fstat(f, &sbuf) < 0)
  505. + #endif
  506.       {
  507.         perror_with_name (fname);
  508.         goto nope;        /* impossible? */
  509. ***************
  510. *** 1202,1208 ****
  511.       ++bp;            /* skip paren */
  512.       /* Skip exactly one space or tab if any.  */
  513.       if (bp < limit && (*bp == ' ' || *bp == '\t')) ++bp;
  514. !       
  515.       /* now everything from bp before limit is the definition. */
  516.       defn = collect_expansion(bp, limit - bp, arg_ptrs);
  517.     } else {
  518. --- 1255,1261 ----
  519.       ++bp;            /* skip paren */
  520.       /* Skip exactly one space or tab if any.  */
  521.       if (bp < limit && (*bp == ' ' || *bp == '\t')) ++bp;
  522.       /* now everything from bp before limit is the definition. */
  523.       defn = collect_expansion(bp, limit - bp, arg_ptrs);
  524.     } else {
  525. ***************
  526. *** 1226,1235 ****
  527.         }
  528.       }
  529.     }
  530. !   
  531.     install (symname, T_MACRO, defn);
  532.     return 0;
  533. !   
  534.   nope:
  535.   
  536.     return 1;
  537. --- 1279,1288 ----
  538.         }
  539.       }
  540.     }
  541.     install (symname, T_MACRO, defn);
  542.     return 0;
  543.   nope:
  544.   
  545.     return 1;
  546. ***************
  547. *** 1308,1314 ****
  548.   
  549.       if (is_idstart[*p] && (p==buf || !is_idchar[*(p-1)])) {
  550.   
  551. !       for (id_len = 0; is_idchar[p[id_len]]; id_len++)
  552.       ;
  553.         for (arg = arglist; arg != NULL; arg = arg->next) {
  554.       struct reflist *tpat;
  555. --- 1361,1367 ----
  556.   
  557.       if (is_idstart[*p] && (p==buf || !is_idchar[*(p-1)])) {
  558.   
  559. !       for (id_len = 0; p+id_len < buf+size && is_idchar[p[id_len]]; id_len++)
  560.       ;
  561.         for (arg = arglist; arg != NULL; arg = arg->next) {
  562.       struct reflist *tpat;
  563. ***************
  564. *** 1341,1347 ****
  565.     *exp_p++ = '\0';
  566.   
  567.     defn->length = exp_p - defn->expansion - 1;
  568. !   
  569.     /* give back excess storage */
  570.     defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
  571.   
  572. --- 1394,1400 ----
  573.     *exp_p++ = '\0';
  574.   
  575.     defn->length = exp_p - defn->expansion - 1;
  576.     /* give back excess storage */
  577.     defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
  578.   
  579. ***************
  580. *** 1456,1462 ****
  581.       delete (hp);
  582.   }
  583.   
  584. ! /* handle #error command later */ 
  585.   do_error()
  586.   {
  587.   }
  588. --- 1509,1515 ----
  589.       delete (hp);
  590.   }
  591.   
  592. ! /* handle #error command later */
  593.   do_error()
  594.   {
  595.   }
  596. ***************
  597. *** 1465,1470 ****
  598. --- 1518,1538 ----
  599.    * the behavior of the #pragma directive is implementation defined.
  600.    * this implementation defines it as follows.
  601.    */
  602. + #ifdef AMIGA
  603. + do_pragma(buf, limit, op, keyword)
  604. +      U_CHAR *buf, *limit;
  605. +      FILE_BUF *op;
  606. +      struct keyword_table *keyword;
  607. + {
  608. +     /* Just copy the pragma directibe back out */
  609. +     int len2 = limit - buf, len1 = sizeof("#pragma") - 1;
  610. +     check_expand(op, len1 + len2);
  611. +     bcopy("#pragma", op->bufp, len1);
  612. +     bcopy(buf, op->bufp + len1, len2);
  613. +     op->bufp += len1 + len2;
  614. + }
  615. + #else
  616.   do_pragma()
  617.   {
  618.     close (0);
  619. ***************
  620. *** 1479,1484 ****
  621. --- 1547,1553 ----
  622.   nope:
  623.     fatal ("You are in a maze of twisty compiler features, all different");
  624.   }
  625. + #endif
  626.   
  627.   typedef struct if_stack {
  628.     struct if_stack *next;    /* for chaining to the next stack frame */
  629. ***************
  630. *** 1541,1547 ****
  631.       }
  632.       if_stack->type = T_ELIF;
  633.     }
  634. !   
  635.     value = eval_if_expression (buf, limit - buf);
  636.     conditional_skip (ip, value == 0, T_ELIF);
  637.   }
  638. --- 1610,1616 ----
  639.       }
  640.       if_stack->type = T_ELIF;
  641.     }
  642.     value = eval_if_expression (buf, limit - buf);
  643.     conditional_skip (ip, value == 0, T_ELIF);
  644.   }
  645. ***************
  646. *** 1574,1580 ****
  647.   
  648.     delete (save_defined);    /* clean up special symbol */
  649.     free (temp_obuf.buf);
  650. !   
  651.     return value;
  652.   }
  653.   
  654. --- 1643,1649 ----
  655.   
  656.     delete (save_defined);    /* clean up special symbol */
  657.     free (temp_obuf.buf);
  658.     return value;
  659.   }
  660.   
  661. ***************
  662. *** 1614,1620 ****
  663.     if_stack = temp;
  664.   
  665.     if_stack->type = type;
  666. !   
  667.     if (skip != 0) {
  668.       skip_if_group(ip);
  669.       return;
  670. --- 1683,1689 ----
  671.     if_stack = temp;
  672.   
  673.     if_stack->type = type;
  674.     if (skip != 0) {
  675.       skip_if_group(ip);
  676.       return;
  677. ***************
  678. *** 1724,1730 ****
  679.    * without changing  if_stack ;  this is so that the error message
  680.    * for missing #endif's etc. will point to the original #if.  It
  681.    * is possible that something different would be better.
  682. !  */ 
  683.   do_else(buf, limit, op, keyword)
  684.        U_CHAR *buf, *limit;
  685.        FILE_BUF *op;
  686. --- 1793,1799 ----
  687.    * without changing  if_stack ;  this is so that the error message
  688.    * for missing #endif's etc. will point to the original #if.  It
  689.    * is possible that something different would be better.
  690. !  */
  691.   do_else(buf, limit, op, keyword)
  692.        U_CHAR *buf, *limit;
  693.        FILE_BUF *op;
  694. ***************
  695. *** 1915,1921 ****
  696.         int totlen;        /* total amount of exp buffer filled so far */
  697.   
  698.         register struct reflist *ap;
  699. !       struct argptrs { 
  700.                  U_CHAR *argstart;
  701.                  int length;
  702.                } *args;
  703. --- 1984,1990 ----
  704.         int totlen;        /* total amount of exp buffer filled so far */
  705.   
  706.         register struct reflist *ap;
  707. !       struct argptrs {
  708.                  U_CHAR *argstart;
  709.                  int length;
  710.                } *args;
  711. ***************
  712. *** 1999,2005 ****
  713.         ip2->buf = ip2->bufp = defn->expansion;
  714.         ip2->length = defn->length;
  715.       }
  716. !   
  717.     rescan (ip2, op);
  718.     --indepth;
  719.     *excess_newlines_ptr += newlines_found;
  720. --- 2068,2074 ----
  721.         ip2->buf = ip2->bufp = defn->expansion;
  722.         ip2->length = defn->length;
  723.       }
  724.     rescan (ip2, op);
  725.     --indepth;
  726.     *excess_newlines_ptr += newlines_found;
  727. ***************
  728. *** 2024,2030 ****
  729.   {
  730.     int paren = 0;
  731.     int quotec = 0;
  732. !   
  733.     while (bp < ip->buf + ip->length) {
  734.       switch (*bp) {
  735.       case '(':
  736. --- 2093,2099 ----
  737.   {
  738.     int paren = 0;
  739.     int quotec = 0;
  740.     while (bp < ip->buf + ip->length) {
  741.       switch (*bp) {
  742.       case '(':
  743. ***************
  744. *** 2084,2092 ****
  745.       }
  746.   
  747.     if (ip != NULL)
  748. !     fprintf(stdout, "file %s, offset %d (line %d): ",
  749.           ip->fname, ip->bufp - ip->buf, ip->lineno);
  750. !   fprintf(stdout, "%s\n", msg);
  751.     return 0;
  752.   }
  753.   
  754. --- 2153,2161 ----
  755.       }
  756.   
  757.     if (ip != NULL)
  758. !     fprintf(stderr, "file %s, offset %d (line %d): ",
  759.           ip->fname, ip->bufp - ip->buf, ip->lineno);
  760. !   fprintf(stderr, "%s\n", msg);
  761.     return 0;
  762.   }
  763.   
  764. ***************
  765. *** 2109,2115 ****
  766.   {
  767.     register int i;
  768.     register U_CHAR *p;
  769. !   
  770.     if (obuf->length - (obuf->bufp - obuf->buf) > needed)
  771.       return obuf->buf;
  772.   
  773. --- 2178,2184 ----
  774.   {
  775.     register int i;
  776.     register U_CHAR *p;
  777.     if (obuf->length - (obuf->bufp - obuf->buf) > needed)
  778.       return obuf->buf;
  779.   
  780. ***************
  781. *** 2125,2131 ****
  782.   
  783.     return p;
  784.   }
  785. !   
  786.   /*
  787.    * install a name in the main hash table, even if it is already there.
  788.    *   name stops with first non alphanumeric, except leading '#'.
  789. --- 2194,2200 ----
  790.   
  791.     return p;
  792.   }
  793.   /*
  794.    * install a name in the main hash table, even if it is already there.
  795.    *   name stops with first non alphanumeric, except leading '#'.
  796. ***************
  797. *** 2198,2204 ****
  798.   delete(hp)
  799.        HASHNODE *hp;
  800.   {
  801. !   
  802.     if (hp->prev != NULL)
  803.       hp->prev->next = hp->next;
  804.     if (hp->next != NULL)
  805. --- 2267,2273 ----
  806.   delete(hp)
  807.        HASHNODE *hp;
  808.   {
  809.     if (hp->prev != NULL)
  810.       hp->prev->next = hp->next;
  811.     if (hp->next != NULL)
  812. ***************
  813. *** 2232,2241 ****
  814.        int hashsize;
  815.   {
  816.     register int r = 0;
  817. !   
  818.     while (len--)
  819.       r = HASHSTEP(r, *name++);
  820. !   
  821.     return MAKE_POS(r) % hashsize;
  822.   }
  823.   
  824. --- 2301,2310 ----
  825.        int hashsize;
  826.   {
  827.     register int r = 0;
  828.     while (len--)
  829.       r = HASHSTEP(r, *name++);
  830.     return MAKE_POS(r) % hashsize;
  831.   }
  832.   
  833. ***************
  834. *** 2282,2288 ****
  835.   #endif
  836.   
  837.     /* is there more? */
  838. !   
  839.   }
  840.   
  841.   /*
  842. --- 2351,2357 ----
  843.   #endif
  844.   
  845.     /* is there more? */
  846.   }
  847.   
  848.   /*
  849. ***************
  850. *** 2357,2363 ****
  851.   #endif /* not VMS */
  852.   }
  853.   
  854. ! void 
  855.   bcopy (b1, b2, length)
  856.        register char *b1;
  857.        register char *b2;
  858. --- 2426,2432 ----
  859.   #endif /* not VMS */
  860.   }
  861.   
  862. ! void
  863.   bcopy (b1, b2, length)
  864.        register char *b1;
  865.        register char *b2;
  866. ***************
  867. *** 2379,2385 ****
  868.       *b2++ = *b1++;
  869.   #endif /* not VMS */
  870.   }
  871. !  
  872.   int
  873.   bcmp (b1, b2, length)    /* This could be a macro! */
  874.        register char *b1;
  875. --- 2448,2454 ----
  876.       *b2++ = *b1++;
  877.   #endif /* not VMS */
  878.   }
  879.   int
  880.   bcmp (b1, b2, length)    /* This could be a macro! */
  881.        register char *b1;
  882. diff -rcP emacs-18.59-fsf/cpp/smakefile emacs-18.59-amiga/cpp/smakefile
  883. *** emacs-18.59-fsf/cpp/smakefile    Thu Jan  1 00:00:00 1970
  884. --- emacs-18.59-amiga/cpp/smakefile    Sat Oct  2 15:30:13 1993
  885. ***************
  886. *** 0 ****
  887. --- 1,23 ----
  888. + # Makefile for cccp in the Emacs distribution only.
  889. + # Here we assume that you are using SASC
  890. + # (since cccp is used by Emacs only to deal with long strings in macros.
  891. + CFLAGS=DEF EMACS idir //unix/include/ def STACK_DIRECTION=-1 def OUTPUT_LINE_COMMANDS nowvret debug sf
  892. + cpp: cccp
  893. +     -delete cpp
  894. +     makelink cpp cccp
  895. + cccp: cccp.o cexp.tab.o alloca.o
  896. +     sc link cccp.o alloca.o cexp.tab.o to cccp lib //unix/src/unix.lib
  897. + testexp: y.tab.c
  898. +     cc -g -DTEST_EXP_READER y.tab.c -o testexp
  899. + cexp.tab.c: cexp.y
  900. +     echo "expect 40 shift/reduce conflicts"
  901. +     bin:bison cexp.y >bison.debug
  902. + cccp.o: cccp.c
  903. + cexp.tab.o: cexp.tab.c
  904. + alloca.o: /src/alloca.c
  905. +     $(CC) $(CFLAGS) objname alloca.o /src/alloca.c
  906. diff -rcP emacs-18.59-fsf/etc/SCOPTIONS emacs-18.59-amiga/etc/SCOPTIONS
  907. *** emacs-18.59-fsf/etc/SCOPTIONS    Thu Jan  1 00:00:00 1970
  908. --- emacs-18.59-amiga/etc/SCOPTIONS    Sat Dec  5 18:07:36 1992
  909. ***************
  910. *** 0 ****
  911. --- 1,15 ----
  912. + STRINGMERGE
  913. + STRUCTUREEQUIVALENCE
  914. + NOWARNVOIDRETURN
  915. + NOVERSION
  916. + MEMORYSIZE=HUGE
  917. + INCLUDEDIR=src:unix/include
  918. + IGNORE=147
  919. + IGNORE=62
  920. + IGNORE=132
  921. + IGNORE=154
  922. + IGNORE=104
  923. + IGNORE=100
  924. + IGNORE=161
  925. + IGNORE=84
  926. + IGNORE=93
  927. diff -rcP emacs-18.59-fsf/etc/amiga-env.c emacs-18.59-amiga/etc/amiga-env.c
  928. *** emacs-18.59-fsf/etc/amiga-env.c    Thu Jan  1 00:00:00 1970
  929. --- emacs-18.59-amiga/etc/amiga-env.c    Sat Jun  5 16:55:12 1993
  930. ***************
  931. *** 0 ****
  932. --- 1,439 ----
  933. + /* env.c - manipulate environment and execute a program
  934. +    in that environment
  935. +    Mly 861126
  936. +    Copyright (C) 1986 Free Software Foundation, Inc.
  937. +     This program is free software; you can redistribute it and/or modify
  938. +     it under the terms of the GNU General Public License as published by
  939. +     the Free Software Foundation; either version 1, or (at your option)
  940. +     any later version.
  941. +     This program is distributed in the hope that it will be useful,
  942. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  943. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  944. +     GNU General Public License for more details.
  945. +     You should have received a copy of the GNU General Public License
  946. +     along with this program; if not, write to the Free Software
  947. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  948. +  In other words, you are welcome to use, share and improve this program.
  949. +  You are forbidden to forbid anyone else to use, share and improve
  950. +  what you give them.   Help stamp out software-hoarding!  */
  951. + /* 
  952. +    If first argument is "-", then a new environment is constructed
  953. +    from scratch; otherwise the environment is inherited from the parent
  954. +    process, except as modified by other options.
  955. +    
  956. +    So, "env - foo" will invoke the "foo" program in a null environment,
  957. +    whereas "env foo" would invoke "foo" in the same environment as that
  958. +    passed to "env" itself.
  959. +    Subsequent arguments are interpreted as follows:
  960. +    
  961. +    * "variable=value" (ie an arg containing a "=" character)
  962. +      means to set the specified environment variable to that value.
  963. +      `value' may be of zero length ("variable=").  Note that setting
  964. +      a variable to a zero-length value is different from unsetting it.
  965. +    * "-u variable" or "-unset variable"
  966. +      means to unset that variable
  967. +      If that variable isn't set, does nothing.
  968. +    * "-s variable value" or "-set variable value"
  969. +      same as "variable=value"
  970. +    * "-" or "--"
  971. +      are used to indicate that the following argument is the program
  972. +      to invoke.  This is only necessary when the program's name
  973. +      begins with "-" or contains a "="
  974. +    * anything else
  975. +      The first remaining argument specifies a program to invoke
  976. +      (it is searched for according to the specification of the PATH
  977. +      environment variable) and any arguments following that are
  978. +      passed as arguments to that program
  979. +      If no program-name is specified following the environment
  980. +      specifications the the resulting environment is printed
  981. +      (The is like specifying a program-name of "printenv")
  982. +    Examples:
  983. +      If the environment passed to "env" is
  984. +      { USER=rms EDITOR=emacs PATH=.:/gnubin:/hacks }
  985. +      * "env DISPLAY=gnu:0 nemacs"
  986. +         calls "nemacs" in the envionment
  987. +     { EDITOR=emacs USER=rms DISPLAY=gnu }
  988. +      * "env - USER=foo /hacks/hack bar baz"
  989. +        will call the "hack" program on arguments "bar" and "baz"
  990. +        in an environment in which the only variable is "USER"
  991. +        Note that the "-" option will clear out the PATH variable,
  992. +        so one should be careful to specify in which directory
  993. +        to find the program to call
  994. +        
  995. +      * "env -u EDITOR USER=foo PATH=/energy -- e=mc2 bar baz"
  996. +        The program "/energy/e=mc2" is called with environment
  997. +        { USER=foo PATH=/energy }
  998. + */
  999. + #include <exec/types.h>
  1000. + #include <dos/dostags.h>
  1001. + #include <dos/var.h>
  1002. + #include <proto/dos.h>
  1003. + #include <proto/exec.h>
  1004. + #ifdef EMACS
  1005. + #define NO_SHORTNAMES
  1006. + #include "../src/config.h"
  1007. + #endif /* EMACS */
  1008. + #include <stdio.h>
  1009. + #include <errno.h>
  1010. + #include <setjmp.h>
  1011. + extern int execvp ();
  1012. + extern char *index ();
  1013. + char *xmalloc (), *xrealloc ();
  1014. + char *concat ();
  1015. + char *progname;
  1016. + void setenv ();
  1017. + void fatal ();
  1018. + #define index strchr
  1019. + struct MsgPort *end_port;
  1020. + struct {
  1021. +   struct Message msg;
  1022. +   int rc;
  1023. + } end_msg;
  1024. + int gargc;
  1025. + char **gargv;
  1026. + jmp_buf unixexit_buf;
  1027. + void __saveds unix_start(void)
  1028. + {
  1029. +   int rc;
  1030. +   if (!(rc = setjmp(unixexit_buf)))
  1031. +     {
  1032. +       unixmain(gargc, gargv);
  1033. +       rc = 1;
  1034. +     }
  1035. +   end_msg.rc = rc - 1;
  1036. +   end_msg.msg.mn_Length = sizeof(end_msg);
  1037. +   end_msg.msg.mn_Node.ln_Type = NT_MESSAGE;
  1038. +   PutMsg(end_port, &end_msg);
  1039. + }
  1040. + void unixexit(int rc)
  1041. + {
  1042. +   longjmp(unixexit_buf, rc + 1);
  1043. + }
  1044. + main(int argc, char **argv)
  1045. + {
  1046. +   int rc = 1;
  1047. +   long stacksize;
  1048. +   struct Process *us = (struct Process *)FindTask(0);
  1049. +   if (us->pr_CLI) stacksize = ((struct CommandLineInterface *)BADDR(us->pr_CLI))->cli_DefaultStack << 2;
  1050. +   else stacksize = us->pr_StackSize;
  1051. +   gargc = argc;
  1052. +   gargv = argv;
  1053. +   
  1054. +   end_port = CreateMsgPort();
  1055. +   if (end_port && CreateNewProcTags(NP_Entry, unix_start,
  1056. +                     NP_Input, Input(), NP_CloseInput, 0UL,
  1057. +                     NP_Output, Output(), NP_CloseOutput, 0UL,
  1058. +                     NP_StackSize, stacksize,
  1059. +                     NP_Cli, TRUE, TAG_END))
  1060. +     {
  1061. +       while (!GetMsg(end_port)) WaitPort(end_port);
  1062. +       rc = end_msg.rc;
  1063. +     }
  1064. +   if (end_port) DeleteMsgPort(end_port);
  1065. +   Delay(1);
  1066. +   exit(rc);
  1067. + }
  1068. + #define exit unixexit
  1069. + unixmain (argc, argv)
  1070. +      register int argc;
  1071. +      register char **argv;
  1072. + {
  1073. +   register char *tem;
  1074. +   progname = argv[0];
  1075. +   argc--;
  1076. +   argv++;
  1077. +   /* "-" flag means to not inherit parent's environment */
  1078. +   /* This is ignored on the amiga */
  1079. +   if (argc && !strcmp (*argv, "-"))
  1080. +     {
  1081. +       argc--;
  1082. +       argv++;
  1083. +     }
  1084. +   while (argc > 0)
  1085. +     {
  1086. +       tem = index (*argv, '=');
  1087. +       if (tem)
  1088. +     /* If arg contains a "=" it specifies to set a variable */
  1089. +     {
  1090. +       *tem = '\000';
  1091. +       setenv (*argv, tem + 1);
  1092. +       argc--; argv++;
  1093. +       continue;
  1094. +     }
  1095. +       
  1096. +       if (**argv != '-')
  1097. +     /* Remaining args are program name and args to pass it */
  1098. +     break;
  1099. +       if (argc < 2)
  1100. +     fatal ("No argument following \"%s\" switch", *argv);
  1101. +        if (!strcmp (*argv, "-u") ||
  1102. +            !strcmp (*argv, "-unset"))
  1103. +     /* Unset a variable */
  1104. +     {
  1105. +       argc--; argv++;
  1106. +       setenv (*argv, 0);
  1107. +       argc--; argv++;
  1108. +     }
  1109. +       else if (!strcmp (*argv, "-s") ||
  1110. +            !strcmp (*argv, "-set"))
  1111. +     /* Set a variable */
  1112. +     {
  1113. +       argc--; argv++;
  1114. +       tem = *argv;
  1115. +       if (argc < 2)
  1116. +         fatal ("No value specified for variable \"%s\"",
  1117. +            tem);
  1118. +       argc--; argv++;
  1119. +       setenv (tem, *argv);
  1120. +       argc--; argv++;
  1121. +     }
  1122. +       else if (!strcmp (*argv, "-") || !strcmp (*argv, "--"))
  1123. +     {
  1124. +       argc--; argv++;
  1125. +       break;
  1126. +     }
  1127. +       else
  1128. +     {
  1129. +       fatal ("unknown switch \"%s\"", *argv);
  1130. +     }
  1131. +     }
  1132. +   /* If no program specified print the environment and exit */
  1133. +   if (argc <= 0)
  1134. +     {
  1135. +       printenv();
  1136. +       exit (0);
  1137. +     }
  1138. +   else
  1139. +     {
  1140. +       extern int errno, sys_nerr;
  1141. +       extern char *sys_errlist[];
  1142. +       (void) execvp (*argv, argv);
  1143. +       fprintf (stderr, "%s: Cannot execute \"%s\"",
  1144. +            progname, *argv);
  1145. +       if (errno < sys_nerr)
  1146. +     fprintf (stderr, ": %s\n" , sys_errlist[errno]);
  1147. +       else
  1148. +     putc ('\n', stderr);
  1149. +       exit (errno != 0 ? errno : 1);
  1150. +     }
  1151. + }
  1152. + int execvp(program, argv)
  1153. + char *program, **argv;
  1154. + {
  1155. +   int index, comsize;
  1156. +   char *combuf, *bp;
  1157. +   long err, rc;
  1158. +   
  1159. +   combuf = xmalloc(256);
  1160. +   comsize = 256;
  1161. +   bp = combuf;
  1162. +   for (index = 0; argv[index] != 0; index++)
  1163. +     {
  1164. +       char *s = argv[index];
  1165. +       int len;
  1166. +       len = 3;
  1167. +       while (*s) len += 1 + 2 * (*s++ == '"');
  1168. +       if (bp + len + 1 >= combuf + comsize)
  1169. +     {
  1170. +       char *newbuf;
  1171. +       int new_comsize;
  1172. +       new_comsize = 2 * comsize + len;
  1173. +       newbuf = xmalloc(new_comsize);
  1174. +       memcpy(newbuf, combuf, comsize);
  1175. +       bp = newbuf + (bp - combuf);
  1176. +       combuf = newbuf;
  1177. +       comsize = new_comsize;
  1178. +     }
  1179. +       *bp++ = ' ';
  1180. +       *bp++ = '"';
  1181. +       s = argv[index];
  1182. +       while (*s)
  1183. +     {
  1184. +       if (*s == '"' || *s == '*') *bp++ = '*';
  1185. +       *bp++ = *s++;
  1186. +     }
  1187. +       *bp++ = '"';
  1188. +     }
  1189. +   *bp = '\0';
  1190. +   rc = SystemTags(combuf,
  1191. +           SYS_UserShell, 1UL,
  1192. +           TAG_END);
  1193. +   err = IoErr();
  1194. +   free(combuf);
  1195. +   if (rc != -1) exit(rc);
  1196. +   
  1197. +   errno = convert_oserr(err);
  1198. +   return -1;
  1199. + }
  1200. + int convert_oserr(int ioerr)
  1201. + {
  1202. +   extern int _OSERR;
  1203. +   _OSERR = ioerr;
  1204. +   switch (ioerr)
  1205. +     {
  1206. +     case 0: return 0;
  1207. +     case ERROR_NO_FREE_STORE: return ENOMEM;
  1208. +     case ERROR_TASK_TABLE_FULL: return EAGAIN;
  1209. +     case ERROR_BAD_TEMPLATE: case ERROR_REQUIRED_ARG_MISSING:
  1210. +     case ERROR_KEY_NEEDS_ARG: case ERROR_TOO_MANY_ARGS:
  1211. +     case ERROR_UNMATCHED_QUOTES: case ERROR_LINE_TOO_LONG: return EINVAL;
  1212. +     case ERROR_OBJECT_IN_USE: return EBUSY;
  1213. +     case ERROR_OBJECT_EXISTS: return EEXIST;
  1214. +     case ERROR_DIR_NOT_FOUND: return ENOENT;
  1215. +     case ERROR_OBJECT_NOT_FOUND: return ENOENT;
  1216. +     case ERROR_BAD_STREAM_NAME: return EINVAL;
  1217. +     case ERROR_OBJECT_TOO_LARGE: return E2BIG;
  1218. +     case ERROR_ACTION_NOT_KNOWN: return EINVAL;
  1219. +     case ERROR_INVALID_COMPONENT_NAME: return EINVAL;
  1220. +     case ERROR_INVALID_LOCK: return EINVAL;
  1221. +     case ERROR_OBJECT_WRONG_TYPE: return EINVAL;
  1222. +     case ERROR_DISK_WRITE_PROTECTED: return EACCES;
  1223. +     case ERROR_SEEK_ERROR: return EIO;
  1224. +     case ERROR_DISK_FULL: return ENOSPC;
  1225. +     case ERROR_DELETE_PROTECTED: return EACCES;
  1226. +     case ERROR_WRITE_PROTECTED: return EACCES;
  1227. +     case ERROR_READ_PROTECTED: return EACCES;
  1228. +     case ERROR_RENAME_ACROSS_DEVICES: return EXDEV;
  1229. +     default: return EOSERR;
  1230. +     }
  1231. + }
  1232. + printenv(void)
  1233. + /* Effect: Prints a UNIX style environment from the AmigaDOS environment.
  1234. + */
  1235. + {
  1236. +   struct LocalVar *scan_env;
  1237. +   struct Process *us = (struct Process *)FindTask(0);
  1238. +   for (scan_env = (struct LocalVar *)us->pr_LocalVars.mlh_Head;
  1239. +        scan_env->lv_Node.ln_Succ;
  1240. +        scan_env = (struct LocalVar *)scan_env->lv_Node.ln_Succ)
  1241. +     if (scan_env->lv_Node.ln_Type == LV_VAR &&
  1242. +     !(scan_env->lv_Flags & (GVF_GLOBAL_ONLY | GVF_BINARY_VAR)))
  1243. +       {
  1244. +     /* We only handle local text variables */
  1245. +     printf("%s=", scan_env->lv_Node.ln_Name);
  1246. +     fwrite(scan_env->lv_Value, 1, scan_env->lv_Len, stdout);
  1247. +     putchar('\n');
  1248. +       }
  1249. + }
  1250. + void
  1251. + setenv (var, val)
  1252. +   register char *var, *val;
  1253. + {
  1254. +   if (val) SetVar(var, val, -1, LV_VAR | GVF_LOCAL_ONLY);
  1255. +   else DeleteVar(var, LV_VAR | GVF_LOCAL_ONLY);
  1256. + }
  1257. + void
  1258. + fatal (msg, arg1, arg2)
  1259. +      char *msg, *arg1, *arg2;
  1260. + {
  1261. +   fprintf (stderr, "%s: ", progname);
  1262. +   fprintf (stderr, msg, arg1, arg2);
  1263. +   putc ('\n', stderr);
  1264. +   exit (1);
  1265. + }
  1266. + extern char *malloc (), *realloc ();
  1267. + void
  1268. + memory_fatal ()
  1269. + {
  1270. +   fatal ("Out of memory");
  1271. + }
  1272. + char *
  1273. + xmalloc (size)
  1274. +      int size;
  1275. + {
  1276. +   register char *value;
  1277. +   value = (char *) malloc (size);
  1278. +   if (!value) memory_fatal ();
  1279. +   return (value);
  1280. + }
  1281. + char *
  1282. + xrealloc (ptr, size)
  1283. +      char *ptr;
  1284. +      int size;
  1285. + {
  1286. +   register char *value;
  1287. +   value = (char *) realloc (ptr, size);
  1288. +   if (!value) memory_fatal ();
  1289. +   return (value);
  1290. + }
  1291. + /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3.  */
  1292. + char *
  1293. + concat (s1, s2, s3)
  1294. +      char *s1, *s2, *s3;
  1295. + {
  1296. +   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
  1297. +   char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
  1298. +   strcpy (result, s1);
  1299. +   strcpy (result + len1, s2);
  1300. +   strcpy (result + len1 + len2, s3);
  1301. +   *(result + len1 + len2 + len3) = 0;
  1302. +   return result;
  1303. + }
  1304. + /*
  1305. +  * Local variables:
  1306. +  * compile-command: "lc -L -v amiga-env.c"
  1307. +  * end:
  1308. +  */
  1309. diff -rcP emacs-18.59-fsf/etc/etags.c emacs-18.59-amiga/etc/etags.c
  1310. *** emacs-18.59-fsf/etc/etags.c    Thu Aug 20 05:11:01 1992
  1311. --- emacs-18.59-amiga/etc/etags.c    Sun May  9 18:35:40 1993
  1312. ***************
  1313. *** 338,347 ****
  1314. --- 338,354 ----
  1315.       {
  1316.         for (i=1; i<ac; i++)
  1317.       {
  1318. + #ifdef AMIGA
  1319. +       rename(outfile, "OTAGS");
  1320. +       sprintf(cmd, "egrep >%s -v '\t%s\t' OTAGS", outfile, av[i]);
  1321. +       system(cmd);
  1322. +       unlink("OTAGS");
  1323. + #else
  1324.         sprintf(cmd,
  1325.             "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
  1326.             outfile, av[i], outfile);
  1327.         system(cmd);
  1328. + #endif
  1329.       }
  1330.         aflag++;
  1331.       }
  1332. ***************
  1333. *** 357,363 ****
  1334. --- 364,374 ----
  1335.   #ifndef VMS
  1336.     if (uflag)
  1337.       {
  1338. + #ifdef AMIGA
  1339. +       sprintf(cmd, "c:sort from %s to %s", outfile, outfile);
  1340. + #else
  1341.         sprintf(cmd, "sort %s -o %s", outfile, outfile);
  1342. + #endif
  1343.         system(cmd);
  1344.       }
  1345.   #endif
  1346. diff -rcP emacs-18.59-fsf/etc/make-docfile.c emacs-18.59-amiga/etc/make-docfile.c
  1347. *** emacs-18.59-fsf/etc/make-docfile.c    Fri Oct 25 18:43:28 1991
  1348. --- emacs-18.59-amiga/etc/make-docfile.c    Sun May  9 18:35:46 1993
  1349. ***************
  1350. *** 57,64 ****
  1351. --- 57,86 ----
  1352.         i += 2;
  1353.       }
  1354.   
  1355. + #ifdef AMIGA
  1356. +   {
  1357. +     char fn[512], *fpos;
  1358. +     int c;
  1359. +     c = getchar();
  1360. +     do
  1361. +       {
  1362. +     while (c == ' ' || c == '\n' || c == '\t') c = getchar();
  1363. +     if (c == EOF) break;
  1364. +     fpos = fn;
  1365. +     do *fpos++ = c;
  1366. +     while ((c = getchar()) != EOF && c != ' ' && c != '\t' && c != '\n');
  1367. +     *fpos = 0;
  1368. +     fprintf(stderr, "doc file %s\n", fn);
  1369. +     err_count += scan_file (fn); /* err_count seems to be {mis,un}used */
  1370. +       }
  1371. +     while (1);
  1372. +   }
  1373. + #else
  1374.     for (; i < argc; i++)
  1375.       err_count += scan_file (argv[i]);    /* err_count seems to be {mis,un}used */
  1376. + #endif
  1377.   #ifndef VMS
  1378.     exit (err_count);            /* see below - shane */
  1379.   #endif /* VMS */
  1380. diff -rcP emacs-18.59-fsf/etc/sh.c emacs-18.59-amiga/etc/sh.c
  1381. *** emacs-18.59-fsf/etc/sh.c    Thu Jan  1 00:00:00 1970
  1382. --- emacs-18.59-amiga/etc/sh.c    Sat Jun  5 11:44:06 1993
  1383. ***************
  1384. *** 0 ****
  1385. --- 1,145 ----
  1386. + ;/*
  1387. + SC LINK NOSTKCHK DEF SASC=1 sh.c
  1388. + QUIT
  1389. + */
  1390. + /*
  1391. +  * original version: David Gay
  1392. +  *
  1393. +  * 05/18/93 ch added SAS support, external verbose flag and primitive_parse
  1394. +  */
  1395. + #include <exec/types.h>
  1396. + #include <dos/dostags.h>
  1397. + #include <stdio.h>
  1398. + #ifdef SASC
  1399. + #include <string.h>
  1400. + #include <stdlib.h>
  1401. + #endif
  1402. + #include <proto/dos.h>
  1403. + /*
  1404. +   translates:
  1405. +  
  1406. +   echo "string1;string2" ; cd xx:c ; copy xx yy
  1407. +  
  1408. +       into
  1409. +  
  1410. +   echo "string1;string2" \n cd xx:c \n copy xx yy
  1411. +   note:
  1412. +     this is a really primitive function ;-) , it may be 
  1413. +     changed if necessary
  1414. + */
  1415. + #define QUOTE    '"'
  1416. + void primitive_parse(char *s)
  1417. + {
  1418. +     int c;
  1419. +     while(c = *s++)
  1420. +     {
  1421. +     if(c == QUOTE)
  1422. +     {
  1423. +         while((c = *s++) && (c != QUOTE))
  1424. +         ;
  1425. +         if(!c)
  1426. +         break;
  1427. +     }
  1428. +     else if(c == ';')
  1429. +         *(s-1) = '\n';
  1430. +     }
  1431. + }
  1432. + int execute(char *cmd, int debug)
  1433. + {
  1434. +     long rc;
  1435. +     char *s;
  1436. +     while (*cmd == ' ') cmd++;
  1437. +     if (strncmp(cmd, "exec", 4) == 0 && (cmd[4] == ' ' || cmd[4] == '\t')) 
  1438. +     cmd += 4;
  1439. +     
  1440. +     s = cmd;
  1441. +     primitive_parse(s);
  1442. +     if(debug)
  1443. +     fprintf(stderr,"/etc/sh: preparsed line:\n%s\n", cmd);
  1444. +     if ((rc = SystemTags(cmd, SYS_UserShell, TRUE, TAG_END)) == -1)
  1445. +     {
  1446. +     fprintf(stderr, "Failed to execute command %s\n", cmd);
  1447. +     return 20;
  1448. +     }
  1449. +     return rc;
  1450. + }
  1451. + void main(int argc, char **argv)
  1452. + {
  1453. +   int command;
  1454. +   char *command_string;
  1455. +   char *program_name = argv[0];
  1456. +   struct RDArgs *args;
  1457. +   long opts[1];
  1458. +   static char options[] = "";
  1459. +   long debug = 0;
  1460. +   char *shenv;
  1461. +   /* Throw out AmigaDOS args so that Input() is clean */
  1462. +   if (args = ReadArgs(options, opts, NULL)) FreeArgs(args);
  1463. +   shenv = getenv("EMACS_SH_DEBUG");
  1464. +   if(shenv)
  1465. +       if(strstr(shenv, "-v")) /* external verbose flag */
  1466. +       debug = 1;
  1467. +   
  1468. +   command = 0;
  1469. +   /* Simplistic argument parsing */
  1470. +   argv++;
  1471. +   argc--;
  1472. +   while (argc > 0 && argv[0][0] == '-')
  1473. +     {
  1474. +       switch (argv[0][1])
  1475. +     {
  1476. +     case 'c':
  1477. +       if (argc == 1) goto usage;
  1478. +       command = 1;
  1479. +       command_string = argv[1];
  1480. +       argv++;
  1481. +       argc--;
  1482. +       break;
  1483. +     case 'v':
  1484. +       debug = 1;
  1485. +       break;
  1486. +     case 'i':
  1487. +       /* ignored for now */
  1488. +       break;
  1489. +     default: goto usage;
  1490. +     }
  1491. +       argc--;
  1492. +       argv++;
  1493. +     }
  1494. +   if (argc != 0) goto usage;
  1495. +   if (command) 
  1496. +   {
  1497. +       if(debug)
  1498. +       fprintf(stderr,"%s: command_string = %s\n", argv[0], command_string);
  1499. +       exit(execute(command_string, debug));
  1500. +   }
  1501. +   else exit(Execute("", Input(), NULL) ? 0 : 1);
  1502. +  usage:
  1503. +   fprintf(stderr, "%s [-i] [-v] [-c command]\n", program_name);
  1504. +   exit(1);
  1505. + }
  1506. + /*
  1507. +  * Local variables:
  1508. +  * compile-command: "sc link nostkchk def SASC=1 sh.c"
  1509. +  * end:
  1510. +  */
  1511. diff -rcP emacs-18.59-fsf/etc/smakefile emacs-18.59-amiga/etc/smakefile
  1512. *** emacs-18.59-fsf/etc/smakefile    Thu Jan  1 00:00:00 1970
  1513. --- emacs-18.59-amiga/etc/smakefile    Sat Oct  2 15:30:23 1993
  1514. ***************
  1515. *** 0 ****
  1516. --- 1,17 ----
  1517. + all: etags sh wakeup make-docfile # env
  1518. + env: amiga-env.c
  1519. +     echo "'sc link to env nostkchk amiga-env.c' should work (but doesn't)."
  1520. +     echo "You're welcome to try ..."
  1521. + make-docfile: make-docfile.c
  1522. +     sc link make-docfile.c
  1523. + sh: sh.c
  1524. +     sc link sh.c
  1525. + wakeup: wakeup.c
  1526. +     sc link wakeup.c
  1527. + etags: etags.c
  1528. +     sc link idir //unix/include def ETAGS etags.c lib //unix/src/unix.lib
  1529. diff -rcP emacs-18.59-fsf/etc/termcap.amiga emacs-18.59-amiga/etc/termcap.amiga
  1530. *** emacs-18.59-fsf/etc/termcap.amiga    Thu Jan  1 00:00:00 1970
  1531. --- emacs-18.59-amiga/etc/termcap.amiga    Sun May  9 18:35:58 1993
  1532. ***************
  1533. *** 0 ****
  1534. --- 1,12 ----
  1535. +  Amiga termcap by Kent Polk and David Gay
  1536. + AA|amiga|Amiga ANSI:\
  1537. +    :co#80:li#23:am:bs:bw:MT:\
  1538. +    :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
  1539. +    :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
  1540. +    :ae=\017:al=\E[L:as=\016:bl=\007:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
  1541. +    :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:ho=\E[H:ic=\E[@:is=\E[20l:\
  1542. +    :k1=\E0~:k2=\E1~:k3=\E2~:k4=\E3~:k5=\E4~:k6=\E5~:k7=\E6~:k8=\E7~:k9=\E8~:\
  1543. +    :k0=\E9~:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\E[D:\
  1544. +    :mb=\E[7;2m:md=\E[1m:me=\E[0m:mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:nl=\E[B:\
  1545. +    :rs=\Ec:se=\E[0m:sf=\E[S:so=\E[7m:sr=\E[T:ue=\E[0m:up=\E[A:us=\E[4m:\
  1546. +    :ve=\E[\040p:vi=\E[\060\040p:xn:
  1547. diff -rcP emacs-18.59-fsf/etc/wakeup.c emacs-18.59-amiga/etc/wakeup.c
  1548. *** emacs-18.59-fsf/etc/wakeup.c    Tue Jul 30 21:03:39 1991
  1549. --- emacs-18.59-amiga/etc/wakeup.c    Sun May  9 18:36:20 1993
  1550. ***************
  1551. *** 18,28 ****
  1552. --- 18,34 ----
  1553.   
  1554.     while (1)
  1555.       {
  1556. + #ifdef AMIGA
  1557. +       if (Write(Output(), "Wake up!\n", 9) != 9) exit(0);
  1558. +       chkabort();
  1559. + #define sleep(n) Delay(50 * (n))
  1560. + #else
  1561.         /* Make sure wakeup stops when Emacs goes away.  */
  1562.         if (getppid () == 1)
  1563.       exit (0);
  1564.         printf ("Wake up!\n");
  1565.         fflush (stdout);
  1566. + #endif
  1567.         /* If using a period of 60, produce the output when the minute
  1568.        changes. */
  1569.         if (period == 60)
  1570. diff -rcP emacs-18.59-fsf/lisp/amiga-init.el emacs-18.59-amiga/lisp/amiga-init.el
  1571. *** emacs-18.59-fsf/lisp/amiga-init.el    Thu Jan  1 00:00:00 1970
  1572. --- emacs-18.59-amiga/lisp/amiga-init.el    Sat Jun  5 11:35:42 1993
  1573. ***************
  1574. *** 0 ****
  1575. --- 1,206 ----
  1576. + (global-set-key "\C-z" 'amiga-iconify)
  1577. + (setq amiga-map (make-keymap))
  1578. + (global-set-key "\C-x\C-^" amiga-map)
  1579. + (load "amiga-mouse")
  1580. + (load "amiga-menu")
  1581. + (define-key amiga-map "A" 'previous-line)
  1582. + (define-key amiga-map "B" 'next-line)
  1583. + (define-key amiga-map "D" 'backward-char)
  1584. + (define-key amiga-map "C" 'forward-char)
  1585. + (define-key amiga-map "?~" 'info)
  1586. + (define-key amiga-map "T" 'scroll-down)
  1587. + (define-key amiga-map "S" 'scroll-up)
  1588. + (define-key amiga-map " @" 'forward-word)
  1589. + (define-key amiga-map " A" 'backward-word)
  1590. + (define-key amiga-map "\M-A" 'beginning-of-buffer)
  1591. + (define-key amiga-map "\M-B" 'end-of-buffer)
  1592. + (define-key amiga-map "\M-D" 'beginning-of-line)
  1593. + (define-key amiga-map "\M-C" 'end-of-line)
  1594. + (define-key amiga-map "\M- \M-@" 'forward-sexp)
  1595. + (define-key amiga-map "\M- \M-A" 'backward-sexp)
  1596. + (define-key amiga-map "\M-T" 'scroll-down-1)
  1597. + (define-key amiga-map "\M-S" 'scroll-up-1)
  1598. + ; Keypad sequences are handled like normal ones
  1599. + (define-key amiga-map "K" 'do-nothing)
  1600. + (defun do-nothing () (interactive))
  1601. + (defun scroll-down-1 ()
  1602. +   "Move up one line on screen"
  1603. +   (interactive)
  1604. +   (scroll-down 1))
  1605. + (defun scroll-up-1 ()
  1606. +   "Move down one line on screen"
  1607. +   (interactive)
  1608. +   (scroll-up 1))
  1609. + ;; ARexx stuff
  1610. + ;;; This function needs to be re-written to handle rexx returned results.
  1611. + ;;;
  1612. + (setq amiga-arexx-processing nil)
  1613. + (setq amiga-arexx-errors nil)
  1614. + (defvar amiga-arexx-failat 5
  1615. +   "Return level from which arexx commands returns cause errors")
  1616. + ;;
  1617. + ;; process incoming rexx messages
  1618. + ;;
  1619. + (defun amiga-arexx-process ()
  1620. +   (interactive)
  1621. +   (if (not amiga-arexx-processing)
  1622. +       (progn
  1623. +     (setq amiga-arexx-processing t)
  1624. +     (condition-case nil ; Avoid blocking of processing in case of bugs
  1625. +         (let (arexxcmd)
  1626. +           (while (setq arexxcmd (amiga-arexx-get-next-msg))
  1627. +         (let ((rc 0) result)
  1628. +           (condition-case err ; detect errors in arexx command
  1629. +               (let ((expr (car (read-from-string arexxcmd))))
  1630. +             (setq result (prin1-to-string (eval expr))))
  1631. +             (error (progn
  1632. +                  (setq rc 20)
  1633. +                  (setq result (prin1-to-string err)))))
  1634. +           (amiga-arexx-reply rc result))))
  1635. +       (error nil))
  1636. +     (setq amiga-arexx-processing nil))))
  1637. + (defun amiga-arexx-wait-command (id)
  1638. +   "Waits for a pending ARexx commands (MSGID) to complete.
  1639. + Also processes any pending ARexx requests during this interval.
  1640. + returns the result list associated with this id, which takes the
  1641. + form: (msgid result-code error-or-string)
  1642. + ``error-or-string'' depends on ``result-code''.
  1643. + if ``result-code'' is 0 the command finished successfully and
  1644. + ``error-or-string'' will be a string or nil, otherwise the command
  1645. + returned with an error and ``error-or-string'' will be an interger
  1646. + that is the secondary error code of the arexx command."
  1647. +   (amiga-arexx-process)
  1648. +   (while (not (amiga-arexx-check-command id))
  1649. +     (amiga-arexx-wait)
  1650. +     (amiga-arexx-process))
  1651. +   (amiga-arexx-get-msg-results id))
  1652. + (defconst amiga-arexx-error-messages
  1653. + ["No cause"
  1654. + "Program not found"
  1655. + "Execution halted"
  1656. + "Insufficient memory"
  1657. + "Invalid character"
  1658. + "Unmatched quote"
  1659. + "Unterminated comment"
  1660. + "Clause too long"
  1661. + "Invalid token"
  1662. + "Symbol or string too long"
  1663. + "Invalid message packet"
  1664. + "Command string error"
  1665. + "Error return from function"
  1666. + "Host environment not found"
  1667. + "Requested library not found"
  1668. + "Function not found"
  1669. + "Function did not return value"
  1670. + "Wrong number of arguments"
  1671. + "Invalid argument to function"
  1672. + "Invalid PROCEDURE"
  1673. + "Unexpected THEN or WHEN"
  1674. + "Unexpected ELSE or OTHERWISE"
  1675. + "Unexpected BREAK, LEAVE or ITERATE"
  1676. + "Invalid statement in SELECT"
  1677. + "Missing or multiple THEN"
  1678. + "Missing OTHERWISE"
  1679. + "Missing or unexpected END"
  1680. + "Symbol mismatch"
  1681. + "Invalid DO syntax"
  1682. + "Incomplete IF or SELECT"
  1683. + "Label not found"
  1684. + "Symbol expected"
  1685. + "Symbol or string expected"
  1686. + "Invalid keyword"
  1687. + "Required keyword missing"
  1688. + "Extraneous characters"
  1689. + "Keyword conflict"
  1690. + "Invalid template"
  1691. + "Invalid TRACE request"
  1692. + "Unitialized variable"
  1693. + "Invalid variable name"
  1694. + "Invalid expression"
  1695. + "Unbalanced parentheses"
  1696. + "Nesting limit exceeded"
  1697. + "Invalid expression result"
  1698. + "Expression required"
  1699. + "Boolean value not 0 or 1"
  1700. + "Arithmetic conversion error"
  1701. + "Invalid operand"
  1702. + ]
  1703. + "The arexx error messages, sorted by number")
  1704. + (defun amiga-arexx-do-command (str as-file)
  1705. +   "Sends ARexx command STR (like amiga-arexx-send-command).
  1706. + If AS-FILE is true, STR is an arexx command, otherwise it is a file name.
  1707. + Waits for the command to return.  If the arexx command fails an error will
  1708. + be caused.
  1709. + If you would like to get result strings and errors (ie. not cause
  1710. + a lisp error) use: (amiga-arexx-do-command-with-results)"
  1711. +   (interactive "sARexx command:
  1712. + P")
  1713. +   (let ((id (amiga-arexx-send-command str as-file)))
  1714. +     (if (not id)
  1715. +     (error "Failed to send arexx command.")
  1716. +       (let ((reslist (amiga-arexx-wait-command id)))
  1717. +     (let ((rc (nth 1 reslist)) (second (nth 2 reslist)))
  1718. +       (if (> rc 0)
  1719. +           (progn            ; error
  1720. +         (let ((error-message
  1721. +                (if (< second (length amiga-arexx-error-messages))
  1722. +              (aref amiga-arexx-error-messages second)
  1723. +              (format nil "Unknown error %d" second))))
  1724. +           (error "Arexx command failed, level %d, cause %s" rc error-message))
  1725. +         reslist)
  1726. +       second))))))
  1727. + (defun amiga-arexx-do-command-with-results (str as-file)
  1728. +   "Sends ARexx command STR (like amiga-arexx-do-command).
  1729. + If AS-FILE is true, STR is an arexx command, otherwise it is a file name.
  1730. + Waits for the command to return.
  1731. + The return value is one of three things:
  1732. +  - the command executed succesfully: nil or a result string.
  1733. +  - the command failed: a list of the form (RC ERROR-CODE)
  1734. +    where RC is the severity and ERROR-CODE is the secondary error."
  1735. +   (interactive "sARexx command:
  1736. + P")
  1737. +   (let ((id (amiga-arexx-send-command str as-file)))
  1738. +     (if (not id)
  1739. +     (error "Failed to send arexx command.")
  1740. +       (let ((reslist (amiga-arexx-wait-command id)))
  1741. +     (let ((rc (nth 1 reslist)) (second (nth 2 reslist)))
  1742. +       (if (and rc (> rc 0))
  1743. +           (list rc second)
  1744. +         second))))))
  1745. + (define-key amiga-map "X" 'amiga-arexx-process)
  1746. + (setq amiga-arexx-initialized t) ;; ARexx commands can now be processed.
  1747. + (defun amiga-wb-process ()
  1748. +   "Process all pending workbench events, ie load all files requested"
  1749. +   (interactive)
  1750. +   (let (file)
  1751. +     (condition-case nil
  1752. +     (while (setq file (amiga-get-wb-event t))
  1753. +       (condition-case nil
  1754. +           (find-file file)
  1755. +         (error nil)))
  1756. +       (error nil))))
  1757. + (define-key amiga-map "W" 'amiga-wb-process)
  1758. + (setq amiga-wb-initialized t) ;; WB events can now be processed.
  1759. + (setq completion-ignore-case t)
  1760. + ;; Default is no numbered versions on Amiga, because directory searches are too
  1761. + ;; slow.
  1762. + (setq version-control 'never)
  1763. Binary files emacs-18.59-fsf/lisp/amiga-init.elc and emacs-18.59-amiga/lisp/amiga-init.elc differ
  1764. diff -rcP emacs-18.59-fsf/lisp/amiga-menu.el emacs-18.59-amiga/lisp/amiga-menu.el
  1765. *** emacs-18.59-fsf/lisp/amiga-menu.el    Thu Jan  1 00:00:00 1970
  1766. --- emacs-18.59-amiga/lisp/amiga-menu.el    Sat Nov 21 16:13:18 1992
  1767. ***************
  1768. *** 0 ****
  1769. --- 1,135 ----
  1770. + ;(provide 'amiga-menu)
  1771. + (defconst amiga-menu-pick (char-to-string 3))
  1772. + (defconst amiga-menu-help (char-to-string 7))
  1773. + (defvar amiga-menus-description nil
  1774. +   "Variable containing the menus setup for Emacs")
  1775. + (defun amiga-menus-set (menus)
  1776. +   "Setup menus for emacs (parameter as for amiga-menus)"
  1777. +   (define-key mouse-map amiga-menu-pick 'amiga-menus-dispatch)
  1778. +   (define-key mouse-map amiga-menu-help 'amiga-menus-help)
  1779. +   (setq amiga-menus-description menus)
  1780. +   (amiga-menus menus))
  1781. + (defun amiga-menus-dispatch (selection)
  1782. +   (let* ((menu (car selection))
  1783. +      (item (cadr selection))
  1784. +      (code (cadr (nth item (cadr (nth menu amiga-menus-description))))))
  1785. +     (if (and (listp code) (eq (car code) 'call-interactively)
  1786. +          (listp (cadr code)) (eq (car (cadr code)) 'quote))
  1787. +     (setq this-command (cadr (cadr code))))
  1788. +     (eval code)))
  1789. + (defun amiga-menus-help (selection)
  1790. +   (let* ((menu (car selection))
  1791. +      (item (cadr selection))
  1792. +      (cmd (cadr (nth item (cadr (nth menu amiga-menus-description))))))
  1793. +     (if (and (listp cmd) (eq (car cmd) 'call-interactively)
  1794. +          (listp (car (cdr cmd))) (eq (car (car (cdr cmd))) 'quote))
  1795. +     (describe-function (car (cdr (car (cdr cmd)))))
  1796. +     (error "Don't know how to describe %s" cmd))))
  1797. + (defun make-explicit-string (str)
  1798. +   (if (and (>= (length str) 2) (= (elt str 0) 27) (< (elt str 1) 128))
  1799. +       (key-description (concat (char-to-string (+ 128 (elt str 1)))
  1800. +                    (substring str 2)))
  1801. +       (key-description str)))
  1802. + (defun make-command-name (command str width)
  1803. +   (let ((keys (where-is-internal command nil t))
  1804. +     (string (if str str (symbol-name command))))
  1805. +     (if keys
  1806. +     (format (if width (format "%%-%ds%%s" (+ width 2)) "%s (%s)")
  1807. +         string (make-explicit-string keys))
  1808. +     string)))
  1809. + (defun menu-items (commands proportional)
  1810. +   (let* ((width (if proportional nil 0))
  1811. +      (names (mapcar
  1812. +          (function (lambda (cmd)
  1813. +                  (if cmd
  1814. +                  (let* ((name (if (symbolp cmd)
  1815. +                           (symbol-name cmd)
  1816. +                           (car cmd)))
  1817. +                     (len (length name)))
  1818. +                    (if (and (not proportional) (> len width))
  1819. +                        (setq width len))
  1820. +                    name))))
  1821. +          commands)))
  1822. +     (mapcar
  1823. +      (function (lambda (cmd)
  1824. +          (let ((name (car names)))
  1825. +            (setq names (cdr names))
  1826. +            (if cmd
  1827. +                (let ((command (if (symbolp cmd) cmd (cadr cmd))))
  1828. +              (list (make-command-name command name width)
  1829. +                    (list 'call-interactively (list 'quote command))
  1830. +                    (caddr cmd)))))))
  1831. +      commands)))
  1832. + (defun convert-menu-buffer (proportional)
  1833. +   "Convert the current buffer into a loadable menu file for emacs.\n\
  1834. + If PROPORTIONAL is true (or if a prefix arg is given), assume menu is in a \n\
  1835. + proportional font & present it differently."
  1836. +   (interactive "P")
  1837. +   (save-buffer)
  1838. +   (widen)
  1839. +   (goto-char 1)
  1840. +   (let ((menu-spec (reverse (read (current-buffer))))
  1841. +     menu-code)
  1842. +     (while menu-spec
  1843. +       (let ((menu-item (car menu-spec)))
  1844. +     (setq menu-code
  1845. +           (cons (list (car menu-item)
  1846. +               (menu-items (cdr menu-item) proportional))
  1847. +             menu-code))
  1848. +     (setq menu-spec (cdr menu-spec))))
  1849. +     (let ((new-buf
  1850. +        (find-file (concat
  1851. +                (substring (buffer-file-name) 0
  1852. +                   (string-match "\\.menu$" (buffer-file-name)))
  1853. +                ".el"))))
  1854. +       (erase-buffer)
  1855. +       (prin1 (list 'amiga-menus-set (list 'quote menu-code)) (current-buffer))
  1856. +       (beginning-of-buffer))))
  1857. + (defvar menu-mode-syntax-table nil
  1858. +   "Syntax table used while in menu mode.")
  1859. + (defvar menu-mode-abbrev-table nil
  1860. +   "Abbrev table used while in menu mode.")
  1861. + (define-abbrev-table 'menu-mode-abbrev-table ())
  1862. + (if menu-mode-syntax-table
  1863. +     ()
  1864. +   (setq menu-mode-syntax-table (make-syntax-table))
  1865. +   (modify-syntax-entry ?' "w   " menu-mode-syntax-table))
  1866. + (defvar menu-mode-map ())
  1867. + (if menu-mode-map
  1868. +     ()
  1869. +   (setq menu-mode-map (make-sparse-keymap))
  1870. +   (define-key menu-mode-map "\t" 'indent-relative)
  1871. +   (define-key menu-mode-map "\C-c\C-c" 'convert-menu-buffer))
  1872. + (defun menu-mode ()
  1873. +   "Major mode for editing menus intended for humans to read.
  1874. + Indentation works like in indented-text-mode. This could be improved.\\{menu-mode-map}
  1875. + Turning on menu-mode calls the value of the variable menu-mode-hook,
  1876. + if that value is non-nil."
  1877. +   (interactive)
  1878. +   (kill-all-local-variables)
  1879. +   (use-local-map menu-mode-map)
  1880. +   (define-abbrev-table 'menu-mode-abbrev-table ())
  1881. +   (setq local-abbrev-table menu-mode-abbrev-table)
  1882. +   (set-syntax-table menu-mode-syntax-table)
  1883. +   (make-local-variable 'indent-line-function)
  1884. +   (setq indent-line-function 'indent-relative-maybe)
  1885. +   (use-local-map menu-mode-map)
  1886. +   (setq mode-name "Menu")
  1887. +   (setq major-mode 'menu-mode)
  1888. +   (run-hooks 'menu-mode-hook))
  1889. + (setq auto-mode-alist (cons '("\\.menu$" . menu-mode) auto-mode-alist))
  1890. Binary files emacs-18.59-fsf/lisp/amiga-menu.elc and emacs-18.59-amiga/lisp/amiga-menu.elc differ
  1891. diff -rcP emacs-18.59-fsf/lisp/amiga-mouse.el emacs-18.59-amiga/lisp/amiga-mouse.el
  1892. *** emacs-18.59-fsf/lisp/amiga-mouse.el    Thu Jan  1 00:00:00 1970
  1893. --- emacs-18.59-amiga/lisp/amiga-mouse.el    Sat Nov 21 16:13:20 1992
  1894. ***************
  1895. *** 0 ****
  1896. --- 1,276 ----
  1897. + ;; Mouse support for Amiga Intuition window system.
  1898. + ;; Copyright (C) 1985, 1987 Free Software Foundation, Inc.
  1899. + ;; This file is part of GNU Emacs.
  1900. + ;; GNU Emacs is distributed in the hope that it will be useful,
  1901. + ;; but WITHOUT ANY WARRANTY.  No author or distributor
  1902. + ;; accepts responsibility to anyone for the consequences of using it
  1903. + ;; or for whether it serves any particular purpose or works at all,
  1904. + ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  1905. + ;; License for full details.
  1906. + ;; Everyone is granted permission to copy, modify and redistribute
  1907. + ;; GNU Emacs, but only under the conditions described in the
  1908. + ;; GNU Emacs General Public License.   A copy of this license is
  1909. + ;; supposed to have been given to you along with GNU Emacs so you
  1910. + ;; can know your rights and responsibilities.  It should be in a
  1911. + ;; file named COPYING.  Among other things, the copyright notice
  1912. + ;; and this notice must be preserved on all copies.
  1913. + (provide 'amiga-mouse)
  1914. + (defconst amiga-button-right (char-to-string 0))
  1915. + (defconst amiga-button-middle (char-to-string 1))
  1916. + (defconst amiga-button-left (char-to-string 2))
  1917. + (defconst amiga-button-right-up (char-to-string 4))
  1918. + (defconst amiga-button-middle-up (char-to-string 5))
  1919. + (defconst amiga-button-left-up (char-to-string 6))
  1920. + (defconst amiga-button-s-right (char-to-string 16))
  1921. + (defconst amiga-button-s-middle (char-to-string 17))
  1922. + (defconst amiga-button-s-left (char-to-string 18))
  1923. + (defconst amiga-button-s-right-up (char-to-string 20))
  1924. + (defconst amiga-button-s-middle-up (char-to-string 21))
  1925. + (defconst amiga-button-s-left-up (char-to-string 22))
  1926. + (defconst amiga-button-m-right (char-to-string 32))
  1927. + (defconst amiga-button-m-middle (char-to-string 33))
  1928. + (defconst amiga-button-m-left (char-to-string 34))
  1929. + (defconst amiga-button-m-right-up (char-to-string 36))
  1930. + (defconst amiga-button-m-middle-up (char-to-string 37))
  1931. + (defconst amiga-button-m-left-up (char-to-string 38))
  1932. + (defconst amiga-button-c-right (char-to-string 64))
  1933. + (defconst amiga-button-c-middle (char-to-string 65))
  1934. + (defconst amiga-button-c-left (char-to-string 66))
  1935. + (defconst amiga-button-c-right-up (char-to-string 68))
  1936. + (defconst amiga-button-c-middle-up (char-to-string 69))
  1937. + (defconst amiga-button-c-left-up (char-to-string 70))
  1938. + (defconst amiga-button-m-s-right (char-to-string 48))
  1939. + (defconst amiga-button-m-s-middle (char-to-string 49))
  1940. + (defconst amiga-button-m-s-left (char-to-string 50))
  1941. + (defconst amiga-button-m-s-right-up (char-to-string 52))
  1942. + (defconst amiga-button-m-s-middle-up (char-to-string 53))
  1943. + (defconst amiga-button-m-s-left-up (char-to-string 54))
  1944. + (defconst amiga-button-c-s-right (char-to-string 80))
  1945. + (defconst amiga-button-c-s-middle (char-to-string 81))
  1946. + (defconst amiga-button-c-s-left (char-to-string 82))
  1947. + (defconst amiga-button-c-s-right-up (char-to-string 84))
  1948. + (defconst amiga-button-c-s-middle-up (char-to-string 85))
  1949. + (defconst amiga-button-c-s-left-up (char-to-string 86))
  1950. + (defconst amiga-button-c-m-right (char-to-string 96))
  1951. + (defconst amiga-button-c-m-middle (char-to-string 97))
  1952. + (defconst amiga-button-c-m-left (char-to-string 98))
  1953. + (defconst amiga-button-c-m-right-up (char-to-string 100))
  1954. + (defconst amiga-button-c-m-middle-up (char-to-string 101))
  1955. + (defconst amiga-button-c-m-left-up (char-to-string 102))
  1956. + (defconst amiga-button-c-m-s-right (char-to-string 112))
  1957. + (defconst amiga-button-c-m-s-middle (char-to-string 113))
  1958. + (defconst amiga-button-c-m-s-left (char-to-string 114))
  1959. + (defconst amiga-button-c-m-s-right-up (char-to-string 116))
  1960. + (defconst amiga-button-c-m-s-middle-up (char-to-string 117))
  1961. + (defconst amiga-button-c-m-s-left-up (char-to-string 118))
  1962. + (defmacro cadr (x) (list 'car (list 'cdr x)))
  1963. + (defmacro caddr (x) (list 'car (list 'cdr (list 'cdr x))))
  1964. + (defmacro cadddr (x) (list 'car (list 'cdr (list 'cdr (list 'cdr x)))))
  1965. + (defun coordinates-in-window-p (arg w)
  1966. +   (let ((x (car arg))
  1967. +     (y (cadr arg))
  1968. +     (edges (window-edges w)))
  1969. +     (and (>= x (car edges)) (< x (caddr edges))
  1970. +      (>= y (cadr edges)) (< y (cadddr edges))
  1971. +      (list (- x (car edges)) (- y (cadr edges))))))
  1972. + (defvar amiga-process-mouse-hook nil
  1973. +   "Hook to run after each mouse event is processed.  Should take two
  1974. + arguments; the first being a list (XPOS YPOS) corresponding to character
  1975. + offset from top left of screen and the second being a specifier for the
  1976. + buttons/keys.
  1977. + This will normally be set on a per-buffer basis.")
  1978. + (defun amiga-flush-mouse-queue () 
  1979. +   "Process all queued mouse events."
  1980. +   ;; A mouse event causes a special character sequence to be given
  1981. +   ;; as keyboard input.  That runs this function, which process all
  1982. +   ;; queued mouse events and returns.
  1983. +   (interactive)
  1984. +   (while (> (amiga-mouse-events) 0)
  1985. +     (amiga-proc-mouse-event)
  1986. +     (and (boundp 'amiga-process-mouse-hook)
  1987. +      (symbol-value 'amiga-process-mouse-hook)
  1988. +      (funcall amiga-process-mouse-hook amiga-mouse-pos amiga-mouse-item))))
  1989. + (defun amiga-mouse-select (arg)
  1990. +   "Select Emacs window the mouse is on."
  1991. +   (let ((start-w (selected-window))
  1992. +     (done nil)
  1993. +     (w (selected-window))
  1994. +     (rel-coordinate nil))
  1995. +     (if (eq start-w (minibuffer-window))
  1996. +     (setq rel-coordinate (coordinates-in-window-p arg w))
  1997. +     (while (and (not done)
  1998. +             (null (setq rel-coordinate
  1999. +                 (coordinates-in-window-p arg w))))
  2000. +       (setq w (next-window w))
  2001. +       (if (eq w start-w)
  2002. +           (setq done t))))
  2003. +     (select-window w)
  2004. +     rel-coordinate))
  2005. + (defun amiga-mouse-keep-one-window (arg)
  2006. +   "Select Emacs window mouse is on, then kill all other Emacs windows."
  2007. +   (if (amiga-mouse-select arg)
  2008. +       (delete-other-windows)))
  2009. + (defun amiga-mouse-select-and-split (arg)
  2010. +   "Select Emacs window mouse is on, then split it vertically in half."
  2011. +   (if (amiga-mouse-select arg)
  2012. +       (split-window-vertically nil)))
  2013. + (defun amiga-mouse-set-point (arg)
  2014. +   "Select Emacs window mouse is on, and move point to mouse position."
  2015. +   (let* ((relative-coordinate (amiga-mouse-select arg))
  2016. +      margin-column
  2017. +      (rel-x (car relative-coordinate))
  2018. +      (rel-y (car (cdr relative-coordinate))))
  2019. +     (if relative-coordinate
  2020. +     (let ((prompt-width (if (eq (selected-window) (minibuffer-window))
  2021. +                 minibuffer-prompt-width 0)))
  2022. +       (move-to-window-line rel-y)
  2023. +       (setq margin-column
  2024. +         (if (or truncate-lines (> (window-hscroll) 0))
  2025. +             (current-column)
  2026. +           ;; If we are using line continuation,
  2027. +           ;; compensate if first character on a continuation line
  2028. +           ;; does not start precisely at the margin.
  2029. +           (- (current-column)
  2030. +              (% (current-column) (1- (window-width))))))
  2031. +       (move-to-column (+ rel-x (1- (max 1 (window-hscroll)))
  2032. +                  (if (= (point) 1)
  2033. +                  (- prompt-width) 0)
  2034. +                  margin-column))))))
  2035. + (defun amiga-mouse-set-mark (arg)
  2036. +   "Select Emacs window mouse is on, and set mark at mouse position.
  2037. + Display cursor at that position for a second."
  2038. +   (if (amiga-mouse-select arg)
  2039. +       (let ((point-save (point)))
  2040. +     (unwind-protect
  2041. +         (progn (amiga-mouse-set-point arg)
  2042. +            (push-mark nil t)
  2043. +            (sit-for 1))
  2044. +       (goto-char point-save)))))
  2045. + (defun amiga-mouse-cut (arg)
  2046. +   "Select Emacs window mouse is on, and set mark at mouse position. 
  2047. + Display cursor at that position for a second. Then cut."
  2048. +   (if (amiga-mouse-select arg)
  2049. +       (let ((point-save (point)))
  2050. +     (unwind-protect
  2051. +         (progn (amiga-mouse-set-point arg)
  2052. +            (push-mark nil t)
  2053. +            (kill-region point-save (point))
  2054. +            (sit-for 1))
  2055. +       (goto-char point-save)))))
  2056. + (defun amiga-mouse-copy (arg)
  2057. +   "Select Emacs window mouse is on, and set mark at mouse position. 
  2058. + Display cursor at that position for a second. Then copy."
  2059. +   (if (amiga-mouse-select arg)
  2060. +       (let ((point-save (point)))
  2061. +     (unwind-protect
  2062. +         (progn (amiga-mouse-set-point arg)
  2063. +            (push-mark nil t)
  2064. +            (copy-region-as-kill point-save (point))
  2065. +            (sit-for 1))
  2066. +       (goto-char point-save)))))
  2067. + (defun amiga-mouse-paste (arg)
  2068. +   "Move point to mouse position (and select window), then paste."
  2069. +   (if (amiga-mouse-select arg)
  2070. +       (progn
  2071. +     (amiga-mouse-set-point arg)
  2072. +     (yank))))
  2073. + (defun amiga-mouse-iconify (arg) (amiga-iconify))
  2074. + (defun amiga-mouse-ignore (arg)
  2075. +   "Don't do anything.")
  2076. + ; Prevent beeps. on button-up.  If the button isn't bound to anything, it
  2077. + (define-key mouse-map amiga-button-right 'amiga-mouse-ignore)
  2078. + (define-key mouse-map amiga-button-middle 'amiga-mouse-ignore)
  2079. + (define-key mouse-map amiga-button-left 'amiga-mouse-ignore)
  2080. + (define-key mouse-map amiga-button-right-up 'amiga-mouse-ignore)
  2081. + (define-key mouse-map amiga-button-middle-up 'amiga-mouse-ignore)
  2082. + (define-key mouse-map amiga-button-left-up 'amiga-mouse-ignore)
  2083. + (define-key mouse-map amiga-button-s-right 'amiga-mouse-ignore)
  2084. + (define-key mouse-map amiga-button-s-middle 'amiga-mouse-ignore)
  2085. + (define-key mouse-map amiga-button-s-left 'amiga-mouse-ignore)
  2086. + (define-key mouse-map amiga-button-s-right-up 'amiga-mouse-ignore)
  2087. + (define-key mouse-map amiga-button-s-middle-up 'amiga-mouse-ignore)
  2088. + (define-key mouse-map amiga-button-s-left-up 'amiga-mouse-ignore)
  2089. + (define-key mouse-map amiga-button-m-right 'amiga-mouse-ignore)
  2090. + (define-key mouse-map amiga-button-m-middle 'amiga-mouse-ignore)
  2091. + (define-key mouse-map amiga-button-m-left 'amiga-mouse-ignore)
  2092. + (define-key mouse-map amiga-button-m-right-up 'amiga-mouse-ignore)
  2093. + (define-key mouse-map amiga-button-m-middle-up 'amiga-mouse-ignore)
  2094. + (define-key mouse-map amiga-button-m-left-up 'amiga-mouse-ignore)
  2095. + (define-key mouse-map amiga-button-c-right 'amiga-mouse-ignore)
  2096. + (define-key mouse-map amiga-button-c-middle 'amiga-mouse-ignore)
  2097. + (define-key mouse-map amiga-button-c-left 'amiga-mouse-ignore)
  2098. + (define-key mouse-map amiga-button-c-right-up 'amiga-mouse-ignore)
  2099. + (define-key mouse-map amiga-button-c-middle-up 'amiga-mouse-ignore)
  2100. + (define-key mouse-map amiga-button-c-left-up 'amiga-mouse-ignore)
  2101. + (define-key mouse-map amiga-button-m-s-right 'amiga-mouse-ignore)
  2102. + (define-key mouse-map amiga-button-m-s-middle 'amiga-mouse-ignore)
  2103. + (define-key mouse-map amiga-button-m-s-left 'amiga-mouse-ignore)
  2104. + (define-key mouse-map amiga-button-m-s-right-up 'amiga-mouse-ignore)
  2105. + (define-key mouse-map amiga-button-m-s-middle-up 'amiga-mouse-ignore)
  2106. + (define-key mouse-map amiga-button-m-s-left-up 'amiga-mouse-ignore)
  2107. + (define-key mouse-map amiga-button-c-s-right 'amiga-mouse-ignore)
  2108. + (define-key mouse-map amiga-button-c-s-middle 'amiga-mouse-ignore)
  2109. + (define-key mouse-map amiga-button-c-s-left 'amiga-mouse-ignore)
  2110. + (define-key mouse-map amiga-button-c-s-right-up 'amiga-mouse-ignore)
  2111. + (define-key mouse-map amiga-button-c-s-middle-up 'amiga-mouse-ignore)
  2112. + (define-key mouse-map amiga-button-c-s-left-up 'amiga-mouse-ignore)
  2113. + (define-key mouse-map amiga-button-c-m-right 'amiga-mouse-ignore)
  2114. + (define-key mouse-map amiga-button-c-m-middle 'amiga-mouse-ignore)
  2115. + (define-key mouse-map amiga-button-c-m-left 'amiga-mouse-ignore)
  2116. + (define-key mouse-map amiga-button-c-m-right-up 'amiga-mouse-ignore)
  2117. + (define-key mouse-map amiga-button-c-m-middle-up 'amiga-mouse-ignore)
  2118. + (define-key mouse-map amiga-button-c-m-left-up 'amiga-mouse-ignore)
  2119. + (define-key mouse-map amiga-button-c-m-s-right 'amiga-mouse-ignore)
  2120. + (define-key mouse-map amiga-button-c-m-s-middle 'amiga-mouse-ignore)
  2121. + (define-key mouse-map amiga-button-c-m-s-left 'amiga-mouse-ignore)
  2122. + (define-key mouse-map amiga-button-c-m-s-right-up 'amiga-mouse-ignore)
  2123. + (define-key mouse-map amiga-button-c-m-s-middle-up 'amiga-mouse-ignore)
  2124. + (define-key mouse-map amiga-button-c-m-s-left-up 'amiga-mouse-ignore)
  2125. + ; Define a few events
  2126. + (define-key mouse-map amiga-button-left 'amiga-mouse-set-point)
  2127. + (define-key mouse-map amiga-button-s-left 'amiga-mouse-set-mark)
  2128. + (define-key mouse-map amiga-button-c-left 'amiga-mouse-cut)
  2129. + (define-key mouse-map amiga-button-m-left 'amiga-mouse-copy)
  2130. + (define-key mouse-map amiga-button-middle 'amiga-mouse-paste)
  2131. + (define-key mouse-map amiga-button-s-middle 'amiga-mouse-iconify)
  2132. + (define-key amiga-map "M" 'amiga-flush-mouse-queue)
  2133. + (setq amiga-mouse-initialized t)  ;; Mouse commands can now be processed.
  2134. Binary files emacs-18.59-fsf/lisp/amiga-mouse.elc and emacs-18.59-amiga/lisp/amiga-mouse.elc differ
  2135. diff -rcP emacs-18.59-fsf/lisp/compile.el emacs-18.59-amiga/lisp/compile.el
  2136. *** emacs-18.59-fsf/lisp/compile.el    Fri Aug 14 22:53:00 1992
  2137. --- emacs-18.59-amiga/lisp/compile.el    Thu Dec 24 17:06:50 1992
  2138. ***************
  2139. *** 43,49 ****
  2140.   ;; The filename excludes colons to avoid confusion when error message
  2141.   ;; starts with digits.
  2142.   (defvar compilation-error-regexp
  2143. !   "\\([^ :\n]+\\(: *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
  2144.     "Regular expression for filename/linenumber in error in compilation log.")
  2145.   
  2146.   (defun compile (command)
  2147. --- 43,49 ----
  2148.   ;; The filename excludes colons to avoid confusion when error message
  2149.   ;; starts with digits.
  2150.   (defvar compilation-error-regexp
  2151. !   "^\\([^ :\e]+\\([ :] *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
  2152.     "Regular expression for filename/linenumber in error in compilation log.")
  2153.   
  2154.   (defun compile (command)
  2155. ***************
  2156. *** 61,67 ****
  2157.   While grep runs asynchronously, you can use the \\[next-error] command
  2158.   to find the text that grep hits refer to."
  2159.     (interactive "sRun grep (with args): ")
  2160. !   (compile1 (concat "grep -n " command " /dev/null")
  2161.           "No more grep hits" "grep"))
  2162.   
  2163.   (defun compile1 (command error-message &optional name-of-mode)
  2164. --- 61,68 ----
  2165.   While grep runs asynchronously, you can use the \\[next-error] command
  2166.   to find the text that grep hits refer to."
  2167.     (interactive "sRun grep (with args): ")
  2168. !   (compile1 (concat "grep -n " command (if (eq system-type 'amigados) " nil:"
  2169. !                      " /dev/null"))
  2170.           "No more grep hits" "grep"))
  2171.   
  2172.   (defun compile1 (command error-message &optional name-of-mode)
  2173. ***************
  2174. *** 195,201 ****
  2175.       (let* ((pop-up-windows t)
  2176.          (w (display-buffer (marker-buffer (car next-error)))))
  2177.         (set-window-point w (car next-error))
  2178. !       (set-window-start w (car next-error)))
  2179.       (set-marker (car next-error) nil)))
  2180.   
  2181.   ;; Set compilation-error-list to nil, and
  2182. --- 196,208 ----
  2183.       (let* ((pop-up-windows t)
  2184.          (w (display-buffer (marker-buffer (car next-error)))))
  2185.         (set-window-point w (car next-error))
  2186. !       (if compilation-parse-sasc
  2187. !       (let ((thiswin (selected-window)))
  2188. !         (select-window w)
  2189. !         (vertical-motion -1)
  2190. !         (set-window-start w (point))
  2191. !         (select-window thiswin))
  2192. !     (set-window-start w (car next-error))))
  2193.       (set-marker (car next-error) nil)))
  2194.   
  2195.   ;; Set compilation-error-list to nil, and
  2196. ***************
  2197. *** 222,227 ****
  2198. --- 229,236 ----
  2199.   and visits its location."
  2200.     (setq compilation-error-list nil)
  2201.     (message "Parsing error messages...")
  2202. +   (goto-char (point-min))
  2203. +   (setq compilation-parse-sasc (search-forward "SAS/C" nil t))
  2204.     (let (text-buffer
  2205.       last-filename last-linenum)
  2206.       ;; Don't reparse messages already seen at last parse.
  2207. Binary files emacs-18.59-fsf/lisp/compile.elc and emacs-18.59-amiga/lisp/compile.elc differ
  2208. diff -rcP emacs-18.59-fsf/lisp/files.el emacs-18.59-amiga/lisp/files.el
  2209. *** emacs-18.59-fsf/lisp/files.el    Sun Oct 11 22:27:38 1992
  2210. --- emacs-18.59-amiga/lisp/files.el    Sat Nov 21 16:14:10 1992
  2211. ***************
  2212. *** 141,146 ****
  2213. --- 141,156 ----
  2214.   after you find a file.  If you explicitly request such a scan with
  2215.   \\[normal-mode], there is no query, regardless of this variable.")
  2216.   
  2217. + (defconst backup-char (if (eq system-type 'amigados) "!" "~")
  2218. +   "Character to add to file names to make backup names.")
  2219. + (defconst autosave-char (if (eq system-type 'amigados) "@" "#")
  2220. +   "Character to add to file names to make autosave names.")
  2221. + (defconst bufferfile-char (if (eq system-type 'amigados) "^" "%")
  2222. +   "Character to add to buffer names to make file names.")
  2223.   ;; Avoid losing in versions where CLASH_DETECTION is disabled.
  2224.   (or (fboundp 'lock-buffer)
  2225.       (fset 'lock-buffer 'ignore))
  2226. ***************
  2227. *** 380,386 ****
  2228.         (funcall (intern (concat (downcase mode) "-mode")))
  2229.       (let ((alist auto-mode-alist)
  2230.             (name buffer-file-name))
  2231. !       (let ((case-fold-search (eq system-type 'vax-vms)))
  2232.           ;; Remove backup-suffixes from file name.
  2233.           (setq name (file-name-sans-versions name))
  2234.           ;; Find first matching alist entry.
  2235. --- 390,397 ----
  2236.         (funcall (intern (concat (downcase mode) "-mode")))
  2237.       (let ((alist auto-mode-alist)
  2238.             (name buffer-file-name))
  2239. !       (let ((case-fold-search (or (eq system-type 'amigados)
  2240. !                       (eq system-type 'vax-vms))))
  2241.           ;; Remove backup-suffixes from file name.
  2242.           (setq name (file-name-sans-versions name))
  2243.           ;; Find first matching alist entry.
  2244. ***************
  2245. *** 559,566 ****
  2246.           (setq setmodes (file-modes backupname)))
  2247.           (file-error
  2248.            ;; If trouble writing the backup, write it in ~.
  2249. !          (setq backupname (expand-file-name "~/%backup%~"))
  2250. !          (message "Cannot write backup file; backing up in ~/%%backup%%~")
  2251.            (sleep-for 1)
  2252.            (condition-case ()
  2253.            (delete-file backupname)
  2254. --- 570,580 ----
  2255.           (setq setmodes (file-modes backupname)))
  2256.           (file-error
  2257.            ;; If trouble writing the backup, write it in ~.
  2258. !          (setq backupname
  2259. !            (expand-file-name (concat "~/" bufferfile-char "backup"
  2260. !                          bufferfile-char backup-char)))
  2261. !          (message "Cannot write backup file; backing up in ~/%sbackup%s%s"
  2262. !               bufferfile-char bufferfile-char backup-char)
  2263.            (sleep-for 1)
  2264.            (condition-case ()
  2265.            (delete-file backupname)
  2266. ***************
  2267. *** 588,605 ****
  2268.            (or (string-match ";[0-9]*\\'" name)
  2269.                (and (string-match "\\." name (string-match "[]>]" name))
  2270.                 (string-match "\\.[0-9]*\\'" name (match-end 0))))
  2271. !            (string-match "\\(\\.~[0-9]+\\)?~\\'" name))))
  2272.   
  2273.   (defun make-backup-file-name (file)
  2274.     "Create the non-numeric backup file name for FILE.
  2275.   This is a separate function so you can redefine it for customization."
  2276. !   (concat file "~"))
  2277.   
  2278.   (defun backup-file-name-p (file)
  2279.     "Return non-nil if FILE is a backup file name (numeric or not).
  2280.   This is a separate function so you can redefine it for customization.
  2281.   You may need to redefine file-name-sans-versions as well."
  2282. !   (string-match "~$" file))
  2283.   
  2284.   ;; I believe there is no need to alter this behavior for VMS;
  2285.   ;; since backup files are not made on VMS, it should not get called.
  2286. --- 602,620 ----
  2287.            (or (string-match ";[0-9]*\\'" name)
  2288.                (and (string-match "\\." name (string-match "[]>]" name))
  2289.                 (string-match "\\.[0-9]*\\'" name (match-end 0))))
  2290. !            (string-match (concat "\\(\\." backup-char "[0-9]+\\)?"
  2291. !                      backup-char "\\'") name))))
  2292.   
  2293.   (defun make-backup-file-name (file)
  2294.     "Create the non-numeric backup file name for FILE.
  2295.   This is a separate function so you can redefine it for customization."
  2296. !   (concat file backup-char))
  2297.   
  2298.   (defun backup-file-name-p (file)
  2299.     "Return non-nil if FILE is a backup file name (numeric or not).
  2300.   This is a separate function so you can redefine it for customization.
  2301.   You may need to redefine file-name-sans-versions as well."
  2302. !   (string-match (concat backup-char "$") file))
  2303.   
  2304.   ;; I believe there is no need to alter this behavior for VMS;
  2305.   ;; since backup files are not made on VMS, it should not get called.
  2306. ***************
  2307. *** 609,615 ****
  2308.    and whose cdr is a list of old versions to consider deleting now."
  2309.     (if (eq version-control 'never)
  2310.         (list (make-backup-file-name fn))
  2311. !     (let* ((base-versions (concat (file-name-nondirectory fn) ".~"))
  2312.          (bv-length (length base-versions))
  2313.          (possibilities (file-name-all-completions
  2314.                  base-versions
  2315. --- 624,630 ----
  2316.    and whose cdr is a list of old versions to consider deleting now."
  2317.     (if (eq version-control 'never)
  2318.         (list (make-backup-file-name fn))
  2319. !     (let* ((base-versions (concat (file-name-nondirectory fn) "." backup-char))
  2320.          (bv-length (length base-versions))
  2321.          (possibilities (file-name-all-completions
  2322.                  base-versions
  2323. ***************
  2324. *** 626,645 ****
  2325.                   kept-old-versions kept-new-versions -1)))
  2326.         (if (not deserve-versions-p)
  2327.         (list (make-backup-file-name fn))
  2328. !     (cons (concat fn ".~" (int-to-string (1+ high-water-mark)) "~")
  2329.             (if (and (> number-to-delete 0)
  2330.                  ;; Delete nothing if there is overflow
  2331.                  ;; in the number of versions to keep.
  2332.                  (>= (+ kept-new-versions kept-old-versions -1) 0))
  2333.             (mapcar (function (lambda (n)
  2334. !                       (concat fn ".~"
  2335. !                           (int-to-string n) "~")))
  2336.                 (let ((v (nthcdr kept-old-versions versions)))
  2337.                   (rplacd (nthcdr (1- number-to-delete) v) ())
  2338.                   v))))))))
  2339.   
  2340.   (defun backup-extract-version (fn)
  2341. !   (if (and (string-match "[0-9]+~$" fn bv-length)
  2342.          (= (match-beginning 0) bv-length))
  2343.         (string-to-int (substring fn bv-length -1))
  2344.         0))
  2345. --- 641,661 ----
  2346.                   kept-old-versions kept-new-versions -1)))
  2347.         (if (not deserve-versions-p)
  2348.         (list (make-backup-file-name fn))
  2349. !     (cons (concat fn "." backup-char (int-to-string (1+ high-water-mark))
  2350. !               backup-char)
  2351.             (if (and (> number-to-delete 0)
  2352.                  ;; Delete nothing if there is overflow
  2353.                  ;; in the number of versions to keep.
  2354.                  (>= (+ kept-new-versions kept-old-versions -1) 0))
  2355.             (mapcar (function (lambda (n)
  2356. !                       (concat fn "." backup-char
  2357. !                           (int-to-string n) backup-char)))
  2358.                 (let ((v (nthcdr kept-old-versions versions)))
  2359.                   (rplacd (nthcdr (1- number-to-delete) v) ())
  2360.                   v))))))))
  2361.   
  2362.   (defun backup-extract-version (fn)
  2363. !   (if (and (string-match (concat "[0-9]+" backup-char "$") fn bv-length)
  2364.          (= (match-beginning 0) bv-length))
  2365.         (string-to-int (substring fn bv-length -1))
  2366.         0))
  2367. ***************
  2368. *** 741,747 ****
  2369.                  ;; If file is precious, rename it away before
  2370.                  ;; overwriting it.
  2371.                  (let ((rename t) nodelete
  2372. !                  (file (concat buffer-file-name "#")))
  2373.                (condition-case ()
  2374.                    (progn (rename-file buffer-file-name file t)
  2375.                       (setq setmodes (file-modes file)))
  2376. --- 757,763 ----
  2377.                  ;; If file is precious, rename it away before
  2378.                  ;; overwriting it.
  2379.                  (let ((rename t) nodelete
  2380. !                  (file (concat buffer-file-name autosave-char)))
  2381.                (condition-case ()
  2382.                    (progn (rename-file buffer-file-name file t)
  2383.                       (setq setmodes (file-modes file)))
  2384. ***************
  2385. *** 774,779 ****
  2386. --- 790,798 ----
  2387.                   ;; Change the mode back, after writing.
  2388.                   (setq setmodes (file-modes buffer-file-name))
  2389.                   (set-file-modes buffer-file-name 511)))
  2390. +              (if (eq system-type 'amigados)
  2391. +              (if amiga-create-icons
  2392. +                  (amiga-put-icon buffer-file-name nil)))
  2393.                (write-region (point-min) (point-max) 
  2394.                      buffer-file-name nil t)))))
  2395.         (if setmodes
  2396. ***************
  2397. *** 983,998 ****
  2398.   See also auto-save-file-name-p."
  2399.     (if buffer-file-name
  2400.         (concat (file-name-directory buffer-file-name)
  2401. !           "#"
  2402.             (file-name-nondirectory buffer-file-name)
  2403. !           "#")
  2404. !     (expand-file-name (concat "#%" (buffer-name) "#"))))
  2405.   
  2406.   (defun auto-save-file-name-p (filename)
  2407.     "Return non-nil if FILENAME can be yielded by make-auto-save-file-name.
  2408.   FILENAME should lack slashes.
  2409.   You can redefine this for customization."
  2410. !   (string-match "^#.*#$" filename))
  2411.   
  2412.   (defconst list-directory-brief-switches "-CF"
  2413.     "*Switches for list-directory to pass to `ls' for brief listing,")
  2414. --- 1002,1018 ----
  2415.   See also auto-save-file-name-p."
  2416.     (if buffer-file-name
  2417.         (concat (file-name-directory buffer-file-name)
  2418. !           autosave-char
  2419.             (file-name-nondirectory buffer-file-name)
  2420. !           autosave-char)
  2421. !     (expand-file-name (concat autosave-char bufferfile-char (buffer-name)
  2422. !                   autosave-char))))
  2423.   
  2424.   (defun auto-save-file-name-p (filename)
  2425.     "Return non-nil if FILENAME can be yielded by make-auto-save-file-name.
  2426.   FILENAME should lack slashes.
  2427.   You can redefine this for customization."
  2428. !   (string-match (concat "^" autosave-char ".*" autosave-char "$") filename))
  2429.   
  2430.   (defconst list-directory-brief-switches "-CF"
  2431.     "*Switches for list-directory to pass to `ls' for brief listing,")
  2432. Binary files emacs-18.59-fsf/lisp/files.elc and emacs-18.59-amiga/lisp/files.elc differ
  2433. diff -rcP emacs-18.59-fsf/lisp/loadup.el emacs-18.59-amiga/lisp/loadup.el
  2434. *** emacs-18.59-fsf/lisp/loadup.el    Wed May 13 19:42:48 1992
  2435. --- emacs-18.59-amiga/lisp/loadup.el    Sat Nov 21 16:14:52 1992
  2436. ***************
  2437. *** 28,34 ****
  2438.   (load "simple")
  2439.   (garbage-collect)
  2440.   (load "help")
  2441. - (garbage-collect)
  2442.   (load "files")
  2443.   (garbage-collect)
  2444.   (load "indent")
  2445. --- 28,33 ----
  2446. ***************
  2447. *** 64,69 ****
  2448. --- 63,72 ----
  2449.       (progn
  2450.         (garbage-collect)
  2451.         (load "vms-patch")))
  2452. + (if (eq system-type 'amigados)
  2453. +     (progn
  2454. +       (garbage-collect)
  2455. +       (load "amiga-init")))
  2456.   
  2457.   ;If you want additional libraries to be preloaded and their
  2458.   ;doc strings kept in the DOC file rather than in core,
  2459. diff -rcP emacs-18.59-fsf/lisp/simple.el emacs-18.59-amiga/lisp/simple.el
  2460. *** emacs-18.59-fsf/lisp/simple.el    Wed Apr 15 08:13:32 1992
  2461. --- emacs-18.59-amiga/lisp/simple.el    Sat Nov 21 16:16:00 1992
  2462. ***************
  2463. *** 539,549 ****
  2464.   (defvar kill-ring-yank-pointer nil
  2465.     "The tail of the kill ring whose car is the last thing yanked.")
  2466.   
  2467.   (defun kill-append (string before-p)
  2468.     (setcar kill-ring
  2469.         (if before-p
  2470.             (concat string (car kill-ring))
  2471. !           (concat (car kill-ring) string))))
  2472.   
  2473.   (defun kill-region (beg end)
  2474.     "Kill between point and mark.
  2475. --- 539,585 ----
  2476.   (defvar kill-ring-yank-pointer nil
  2477.     "The tail of the kill ring whose car is the last thing yanked.")
  2478.   
  2479. + (if (eq system-type 'amigados)
  2480. +     (progn
  2481. +       (defun safe-amiga-paste ()
  2482. +     "Paste from the amiga clipboard, trapping any errors."
  2483. +     (condition-case nil
  2484. +         (amiga-paste)
  2485. +       (error nil)))
  2486. +       (defun check-clipboard ()
  2487. +     "If there is anything new in the clipboard, add it to the emacs kill ring.
  2488. + Returns t if there was something added, nil otherwise."
  2489. +     (let (added)
  2490. +       (if amiga-new-clip
  2491. +           (let ((str (safe-amiga-paste)))
  2492. +         (setq amiga-new-clip nil)
  2493. +         (if str
  2494. +             (progn
  2495. +               (kill-add str)
  2496. +               (setq added t)
  2497. +               (setq kill-ring-yank-pointer kill-ring)))))
  2498. +       added))
  2499. +       (defun update-clipboard (str)
  2500. +     (amiga-cut str)
  2501. +     (setq amiga-new-clip nil)))
  2502. +     (progn ; These could be defined for X-Windows.
  2503. +       (defun check-clipboard () nil)
  2504. +       (defun update-clipboard () nil)))
  2505.   (defun kill-append (string before-p)
  2506.     (setcar kill-ring
  2507.         (if before-p
  2508.             (concat string (car kill-ring))
  2509. !           (concat (car kill-ring) string)))
  2510. !   (update-clipboard (car kill-ring)))
  2511. ! (defun kill-add (string)
  2512. !   (check-clipboard)
  2513. !   (setq kill-ring (cons string kill-ring))
  2514. !   (update-clipboard string)
  2515. !   (if (> (length kill-ring) kill-ring-max)
  2516. !       (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
  2517.   
  2518.   (defun kill-region (beg end)
  2519.     "Kill between point and mark.
  2520. ***************
  2521. *** 571,579 ****
  2522.       (delete-region beg end)
  2523.       ;; Take the same string recorded for undo
  2524.       ;; and put it in the kill-ring.
  2525. !     (setq kill-ring (cons (car (car buffer-undo-list)) kill-ring))
  2526. !     (if (> (length kill-ring) kill-ring-max)
  2527. !         (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
  2528.       (setq this-command 'kill-region)
  2529.       (setq kill-ring-yank-pointer kill-ring))
  2530.       (copy-region-as-kill beg end)
  2531. --- 607,613 ----
  2532.       (delete-region beg end)
  2533.       ;; Take the same string recorded for undo
  2534.       ;; and put it in the kill-ring.
  2535. !     (kill-add (car (car buffer-undo-list)))
  2536.       (setq this-command 'kill-region)
  2537.       (setq kill-ring-yank-pointer kill-ring))
  2538.       (copy-region-as-kill beg end)
  2539. ***************
  2540. *** 584,594 ****
  2541.   (defun copy-region-as-kill (beg end)
  2542.     "Save the region as if killed, but don't kill it."
  2543.     (interactive "r")
  2544. !   (if (eq last-command 'kill-region)
  2545.         (kill-append (buffer-substring beg end) (< end beg))
  2546. !     (setq kill-ring (cons (buffer-substring beg end) kill-ring))
  2547. !     (if (> (length kill-ring) kill-ring-max)
  2548. !     (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
  2549.     (setq this-command 'kill-region)
  2550.     (setq kill-ring-yank-pointer kill-ring))
  2551.   
  2552. --- 618,626 ----
  2553.   (defun copy-region-as-kill (beg end)
  2554.     "Save the region as if killed, but don't kill it."
  2555.     (interactive "r")
  2556. !   (if (and (eq last-command 'kill-region) (not (check-clipboard)))
  2557.         (kill-append (buffer-substring beg end) (< end beg))
  2558. !     (kill-add (buffer-substring beg end)))
  2559.     (setq this-command 'kill-region)
  2560.     (setq kill-ring-yank-pointer kill-ring))
  2561.   
  2562. ***************
  2563. *** 643,648 ****
  2564. --- 675,681 ----
  2565.   text.
  2566.   See also the command \\[yank-pop]."
  2567.     (interactive "*P")
  2568. +   (check-clipboard)
  2569.     (rotate-yank-pointer (if (listp arg) 0
  2570.                (if (eq arg '-) -1
  2571.                  (1- arg))))
  2572. Binary files emacs-18.59-fsf/lisp/simple.elc and emacs-18.59-amiga/lisp/simple.elc differ
  2573. diff -rcP emacs-18.59-fsf/lisp/startup.el emacs-18.59-amiga/lisp/startup.el
  2574. *** emacs-18.59-fsf/lisp/startup.el    Sun Apr 19 05:20:08 1992
  2575. --- emacs-18.59-amiga/lisp/startup.el    Sat Nov 21 16:16:08 1992
  2576. ***************
  2577. *** 113,121 ****
  2578.       ;; Load user's init file, or load default one.
  2579.       (condition-case error
  2580.       (if init
  2581. !         (progn (load (if (eq system-type 'vax-vms)
  2582. !                  "sys$login:.emacs"
  2583. !                  (concat "~" init "/.emacs"))
  2584.                t t t)
  2585.              (or inhibit-default-init
  2586.                  (let ((inhibit-startup-message nil))
  2587. --- 113,121 ----
  2588.       ;; Load user's init file, or load default one.
  2589.       (condition-case error
  2590.       (if init
  2591. !         (progn (load (cond ((eq system-type 'vax-vms) "sys$login:.emacs")
  2592. !                    ((eq system-type 'amigados) "s:.emacs")
  2593. !                    (t (concat "~" init "/.emacs")))
  2594.                t t t)
  2595.              (or inhibit-default-init
  2596.                  (let ((inhibit-startup-message nil))
  2597. ***************
  2598. *** 129,134 ****
  2599. --- 129,138 ----
  2600.       (save-excursion
  2601.         (set-buffer "*scratch*")
  2602.         (funcall initial-major-mode)))
  2603. +     ;; On Amiga, initialise clipboard
  2604. +     (if (eq system-type 'amigados)
  2605. +     (let ((clip (safe-amiga-paste)))
  2606. +       (if clip (kill-add clip))))
  2607.       ;; Load library for our terminal type.
  2608.       ;; User init file can set term-file-prefix to nil to prevent this.
  2609.       (and term-file-prefix (not noninteractive)
  2610. Binary files emacs-18.59-fsf/lisp/startup.elc and emacs-18.59-amiga/lisp/startup.elc differ
  2611. diff -rcP emacs-18.59-fsf/lisp/term/intuition-win.el emacs-18.59-amiga/lisp/term/intuition-win.el
  2612. *** emacs-18.59-fsf/lisp/term/intuition-win.el    Thu Jan  1 00:00:00 1970
  2613. --- emacs-18.59-amiga/lisp/term/intuition-win.el    Sat Nov 21 16:08:08 1992
  2614. ***************
  2615. *** 0 ****
  2616. --- 1,47 ----
  2617. + (load "s:.emacs-menu" t t)
  2618. + (setq command-switch-alist (append '(("-fn" . amiga-handle-set-font)
  2619. +                      ("-fg" . amiga-handle-set-foreground)
  2620. +                      ("-bg" . amiga-handle-set-background)
  2621. +                      ("-geometry" . amiga-handle-set-geometry)
  2622. +                      ("-screen" . amiga-handle-set-screen))
  2623. +                    command-switch-alist))
  2624. + (defun amiga-handle-set-font (switch)
  2625. +   (condition-case err
  2626. +       (let ((wfont (car command-line-args-left))
  2627. +         (height (car (read-from-string (car (cdr command-line-args-left))))))
  2628. +     (setq command-line-args-left (cdr (cdr command-line-args-left)))
  2629. +     (amiga-set-font wfont height))
  2630. +     (error (message "Failed to load font"))))
  2631. + (defun amiga-handle-set-foreground (switch)
  2632. +   (condition-case err
  2633. +       (let ((pen (car (read-from-string (car command-line-args-left)))))
  2634. +     (setq command-line-args-left (cdr command-line-args-left))
  2635. +     (amiga-set-foreground-color pen))
  2636. +     (error (message "Failed to set foreground colour"))))
  2637. + (defun amiga-handle-set-background (switch)
  2638. +   (condition-case err
  2639. +       (let ((pen (car (read-from-string (car command-line-args-left)))))
  2640. +     (setq command-line-args-left (cdr command-line-args-left))
  2641. +     (amiga-set-background-color pen))
  2642. +     (error (message "Failed to set background colour"))))
  2643. + (defun amiga-handle-set-screen (switch)
  2644. +   (condition-case err
  2645. +       (let ((name (car command-line-args-left)))
  2646. +     (setq command-line-args-left (cdr command-line-args-left))
  2647. +     (amiga-set-geometry nil nil nil nil name))
  2648. +     (error (message "Couldn't open on public screen"))))
  2649. + (defun amiga-handle-set-geometry (switch)
  2650. +   (condition-case err
  2651. +       (let ((x (car (read-from-string (car command-line-args-left))))
  2652. +         (y (car (read-from-string (car (cdr command-line-args-left)))))
  2653. +         (w (car (read-from-string (car (cdr (cdr command-line-args-left))))))
  2654. +         (h (car (read-from-string (car (cdr (cdr (cdr command-line-args-left)))))))
  2655. + )
  2656. +     (setq command-line-args-left (cdr (cdr (cdr (cdr command-line-args-left)))))
  2657. +     (amiga-set-geometry x y w h nil))
  2658. +     (error (message "Couldn't set window size"))))
  2659. diff -rcP emacs-18.59-fsf/lisp/term/intuition-win.elc emacs-18.59-amiga/lisp/term/intuition-win.elc
  2660. *** emacs-18.59-fsf/lisp/term/intuition-win.elc    Thu Jan  1 00:00:00 1970
  2661. --- emacs-18.59-amiga/lisp/term/intuition-win.elc    Sun May 16 10:57:14 1993
  2662. ***************
  2663. *** 0 ****
  2664. --- 1,16 ----
  2665. + (load "s:.emacs-menu" t t)
  2666. + (setq command-switch-alist (append (quote (("-fn" . amiga-handle-set-font) ("-fg" . amiga-handle-set-foreground) ("-bg" . amiga-handle-set-background) ("-geometry" . amiga-handle-set-geometry) ("-screen" . amiga-handle-set-screen))) command-switch-alist))
  2667. + (defun amiga-handle-set-font (switch) (byte-code "ÀÁ‡" [err (byte-code "    @à   A@!@    AA‰ˆÄ
  2668. + \"*‡" [wfont command-line-args-left height read-from-string amiga-set-font] 4) ((error (byte-code "ÀÁ!‡" [message "Failed to load font"] 2)))] 3))
  2669. + (defun amiga-handle-set-foreground (switch) (byte-code "ÀÁ‡" [err (byte-code "    @!@    A‰ˆÃ!)‡" [pen command-line-args-left read-from-string amiga-set-foreground-color] 3) ((error (byte-code "ÀÁ!‡" [message "Failed to set foreground colour"] 2)))] 3))
  2670. + (defun amiga-handle-set-background (switch) (byte-code "ÀÁ‡" [err (byte-code "    @!@    A‰ˆÃ!)‡" [pen command-line-args-left read-from-string amiga-set-background-color] 3) ((error (byte-code "ÀÁ!‡" [message "Failed to set background colour"] 2)))] 3))
  2671. + (defun amiga-handle-set-screen (switch) (byte-code "ÀÁ‡" [err (byte-code "    @    A‰ˆÃÂÂÂÂ%)‡" [name command-line-args-left nil amiga-set-geometry] 6) ((error (byte-code "ÀÁ!‡" [message "Couldn't open on public screen"] 2)))] 3))
  2672. + (defun amiga-handle-set-geometry (switch) (byte-code "ÀÁ‡" [err (byte-code "Æ    @!@Æ    A@!@Æ    AA@!@Æ    AAA@!@    AAAA‰ˆÇ
  2673. +  Å%,‡" [x command-line-args-left y w h nil read-from-string amiga-set-geometry] 10) ((error (byte-code "ÀÁ!‡" [message "Couldn't set window size"] 2)))] 3))
  2674. diff -rcP emacs-18.59-fsf/lisp/texinfmt.el emacs-18.59-amiga/lisp/texinfmt.el
  2675. *** emacs-18.59-fsf/lisp/texinfmt.el    Sun Dec  8 05:28:09 1991
  2676. --- emacs-18.59-amiga/lisp/texinfmt.el    Sat Nov 21 16:16:32 1992
  2677. ***************
  2678. *** 874,880 ****
  2679.       (insert "\n* Menu:\n\n")
  2680.       (setq opoint (point))
  2681.       (texinfo-print-index nil indexelts)
  2682. !     (if (eq system-type 'vax-vms) 
  2683.       (texinfo-sort-region opoint (point))
  2684.         (shell-command-on-region opoint (point) "sort -fd" 1))))
  2685.   
  2686. --- 874,880 ----
  2687.       (insert "\n* Menu:\n\n")
  2688.       (setq opoint (point))
  2689.       (texinfo-print-index nil indexelts)
  2690. !     (if (or (eq system-type 'amigados) (eq system-type 'vax-vms)) 
  2691.       (texinfo-sort-region opoint (point))
  2692.         (shell-command-on-region opoint (point) "sort -fd" 1))))
  2693.   
  2694. Binary files emacs-18.59-fsf/lisp/texinfmt.elc and emacs-18.59-amiga/lisp/texinfmt.elc differ
  2695. diff -rcP emacs-18.59-fsf/src/SCOPTIONS emacs-18.59-amiga/src/SCOPTIONS
  2696. *** emacs-18.59-fsf/src/SCOPTIONS    Thu Jan  1 00:00:00 1970
  2697. --- emacs-18.59-amiga/src/SCOPTIONS    Sat Oct  2 15:31:56 1993
  2698. ***************
  2699. *** 0 ****
  2700. --- 1,15 ----
  2701. + STRINGMERGE
  2702. + STRUCTUREEQUIVALENCE
  2703. + NOWARNVOIDRETURN
  2704. + NOVERSION
  2705. + MEMORYSIZE=HUGE
  2706. + INCLUDEDIR=//unix/include
  2707. + IGNORE=147
  2708. + IGNORE=62
  2709. + IGNORE=132
  2710. + IGNORE=154
  2711. + IGNORE=104
  2712. + IGNORE=100
  2713. + IGNORE=161
  2714. + IGNORE=84
  2715. + IGNORE=93
  2716. diff -rcP emacs-18.59-fsf/src/alloc.c emacs-18.59-amiga/src/alloc.c
  2717. *** emacs-18.59-fsf/src/alloc.c    Mon Sep 21 05:45:30 1992
  2718. --- emacs-18.59-amiga/src/alloc.c    Sun Dec  6 12:42:02 1992
  2719. ***************
  2720. *** 76,81 ****
  2721. --- 76,86 ----
  2722.      Preallocated since perhaps we can't allocate it when memory is full.  */
  2723.   Lisp_Object memory_exhausted_message;
  2724.   
  2725. + #ifdef AMIGA_DUMP
  2726. + int *pure;   /* pure array is allocated at run-time */
  2727. + int puresize = DEF_PURESIZE; /* and has a variable size */
  2728. + #define PUREBEG (char *) pure
  2729. + #else /* not AMIGA_DUMP */
  2730.   #ifndef HAVE_SHM
  2731.   #ifdef VMS
  2732.   int pure[PURESIZE / sizeof (int)];    /*no need to initialize - wasted space*/
  2733. ***************
  2734. *** 87,92 ****
  2735. --- 92,98 ----
  2736.   #define pure PURE_SEG_BITS   /* Use shared memory segment */
  2737.   #define PUREBEG (char *)PURE_SEG_BITS
  2738.   #endif /* not HAVE_SHM */
  2739. + #endif /* not AMIGA_DUMP */
  2740.   
  2741.   /* Index in pure at which next pure object will be allocated. */
  2742.   int pureptr;
  2743. ***************
  2744. *** 608,614 ****
  2745.         XSET (val, Lisp_String,
  2746.           (struct Lisp_String *) current_string_block->chars);
  2747.       }
  2748. !     
  2749.     XSTRING (val)->size = length;
  2750.     XSTRING (val)->data[length] = 0;
  2751.   
  2752. --- 614,620 ----
  2753.         XSET (val, Lisp_String,
  2754.           (struct Lisp_String *) current_string_block->chars);
  2755.       }
  2756.     XSTRING (val)->size = length;
  2757.     XSTRING (val)->data[length] = 0;
  2758.   
  2759. ***************
  2760. *** 727,735 ****
  2761. --- 733,745 ----
  2762.   #ifdef __GNUC__
  2763.   Lisp_Object *staticvec[NSTATICS] = {0};
  2764.   #else
  2765. + #ifdef AMIGA_DUMP
  2766. + Lisp_Object *staticvec[NSTATICS]; /* Doesn't need to be pure */
  2767. + #else
  2768.   char staticvec1[NSTATICS * sizeof (Lisp_Object *)] = {0};
  2769.   #define staticvec ((Lisp_Object **) staticvec1)
  2770.   #endif
  2771. + #endif
  2772.   
  2773.   /* Put an entry in staticvec, pointing at the variable whose address is given */
  2774.   
  2775. ***************
  2776. *** 859,870 ****
  2777.       {
  2778.         mark_object (&catch->tag);
  2779.         mark_object (&catch->val);
  2780. !     }  
  2781.     for (handler = handlerlist; handler; handler = handler->next)
  2782.       {
  2783.         mark_object (&handler->handler);
  2784.         mark_object (&handler->var);
  2785. !     }  
  2786.     for (backlist = backtrace_list; backlist; backlist = backlist->next)
  2787.       {
  2788.         if (!XMARKBIT (*backlist->function))
  2789. --- 869,880 ----
  2790.       {
  2791.         mark_object (&catch->tag);
  2792.         mark_object (&catch->val);
  2793. !     }
  2794.     for (handler = handlerlist; handler; handler = handler->next)
  2795.       {
  2796.         mark_object (&handler->handler);
  2797.         mark_object (&handler->var);
  2798. !     }
  2799.     for (backlist = backtrace_list; backlist; backlist = backlist->next)
  2800.       {
  2801.         if (!XMARKBIT (*backlist->function))
  2802. ***************
  2803. *** 882,888 ****
  2804.           mark_object (&backlist->args[i]);
  2805.           XMARK (backlist->args[i]);
  2806.         }
  2807. !     }  
  2808.   
  2809.     gc_sweep ();
  2810.   
  2811. --- 892,898 ----
  2812.           mark_object (&backlist->args[i]);
  2813.           XMARK (backlist->args[i]);
  2814.         }
  2815. !     }
  2816.   
  2817.     gc_sweep ();
  2818.   
  2819. ***************
  2820. *** 900,906 ****
  2821.       i = backlist->nargs - 1;
  2822.         for (; i >= 0; i--)
  2823.       XUNMARK (backlist->args[i]);
  2824. !     }  
  2825.     XUNMARK (buffer_defaults.name);
  2826.     XUNMARK (buffer_local_symbols.name);
  2827.   
  2828. --- 910,916 ----
  2829.       i = backlist->nargs - 1;
  2830.         for (; i >= 0; i--)
  2831.       XUNMARK (backlist->args[i]);
  2832. !     }
  2833.     XUNMARK (buffer_defaults.name);
  2834.     XUNMARK (buffer_local_symbols.name);
  2835.   
  2836. ***************
  2837. *** 936,942 ****
  2838.     {
  2839.       register struct cons_block *cblk;
  2840.       register int lim = cons_block_index;
  2841. !   
  2842.       for (cblk = cons_block; cblk; cblk = cblk->next)
  2843.         {
  2844.       register int i;
  2845. --- 946,952 ----
  2846.     {
  2847.       register struct cons_block *cblk;
  2848.       register int lim = cons_block_index;
  2849.       for (cblk = cons_block; cblk; cblk = cblk->next)
  2850.         {
  2851.       register int i;
  2852. ***************
  2853. *** 949,955 ****
  2854.     {
  2855.       register struct symbol_block *sblk;
  2856.       register int lim = symbol_block_index;
  2857. !   
  2858.       for (sblk = symbol_block; sblk; sblk = sblk->next)
  2859.         {
  2860.       register int i;
  2861. --- 959,965 ----
  2862.     {
  2863.       register struct symbol_block *sblk;
  2864.       register int lim = symbol_block_index;
  2865.       for (sblk = symbol_block; sblk; sblk = sblk->next)
  2866.         {
  2867.       register int i;
  2868. ***************
  2869. *** 964,970 ****
  2870.     {
  2871.       register struct marker_block *sblk;
  2872.       register int lim = marker_block_index;
  2873. !   
  2874.       for (sblk = marker_block; sblk; sblk = sblk->next)
  2875.         {
  2876.       register int i;
  2877. --- 974,980 ----
  2878.     {
  2879.       register struct marker_block *sblk;
  2880.       register int lim = marker_block_index;
  2881.       for (sblk = marker_block; sblk; sblk = sblk->next)
  2882.         {
  2883.       register int i;
  2884. ***************
  2885. *** 1197,1203 ****
  2886.       register int num_free = 0, num_used = 0;
  2887.   
  2888.       cons_free_list = 0;
  2889. !   
  2890.       for (cblk = cons_block; cblk; cblk = cblk->next)
  2891.         {
  2892.       register int i;
  2893. --- 1207,1213 ----
  2894.       register int num_free = 0, num_used = 0;
  2895.   
  2896.       cons_free_list = 0;
  2897.       for (cblk = cons_block; cblk; cblk = cblk->next)
  2898.         {
  2899.       register int i;
  2900. ***************
  2901. *** 1226,1232 ****
  2902.       register int num_free = 0, num_used = 0;
  2903.   
  2904.       symbol_free_list = 0;
  2905. !   
  2906.       for (sblk = symbol_block; sblk; sblk = sblk->next)
  2907.         {
  2908.       register int i;
  2909. --- 1236,1242 ----
  2910.       register int num_free = 0, num_used = 0;
  2911.   
  2912.       symbol_free_list = 0;
  2913.       for (sblk = symbol_block; sblk; sblk = sblk->next)
  2914.         {
  2915.       register int i;
  2916. ***************
  2917. *** 1260,1266 ****
  2918.       register int num_free = 0, num_used = 0;
  2919.   
  2920.       marker_free_list = 0;
  2921. !   
  2922.       for (mblk = marker_block; mblk; mblk = mblk->next)
  2923.         {
  2924.       register int i;
  2925. --- 1270,1276 ----
  2926.       register int num_free = 0, num_used = 0;
  2927.   
  2928.       marker_free_list = 0;
  2929.       for (mblk = marker_block; mblk; mblk = mblk->next)
  2930.         {
  2931.       register int i;
  2932. ***************
  2933. *** 1400,1406 ****
  2934.             while ((unsigned) size > STRING_BLOCK_SIZE)
  2935.           {
  2936.             if (size & 1) size ^= MARKBIT | 1;
  2937. !           size = *(int *)size & ~MARKBIT;
  2938.           }
  2939.   
  2940.             total_string_size += size;
  2941. --- 1410,1417 ----
  2942.             while ((unsigned) size > STRING_BLOCK_SIZE)
  2943.           {
  2944.             if (size & 1) size ^= MARKBIT | 1;
  2945. !           size = *(int *)size;
  2946. !                   size &= ~MARKBIT;
  2947.           }
  2948.   
  2949.             total_string_size += size;
  2950. ***************
  2951. *** 1438,1444 ****
  2952.             if (size & 1) size ^= MARKBIT | 1;
  2953.             objptr = (Lisp_Object *)size;
  2954.   
  2955. !           size = XFASTINT (*objptr) & ~MARKBIT;
  2956.             if (XMARKBIT (*objptr))
  2957.               {
  2958.                 XSET (*objptr, Lisp_String, newaddr);
  2959. --- 1449,1456 ----
  2960.             if (size & 1) size ^= MARKBIT | 1;
  2961.             objptr = (Lisp_Object *)size;
  2962.   
  2963. !           size = XFASTINT (*objptr);
  2964. !                   size &= ~MARKBIT;
  2965.             if (XMARKBIT (*objptr))
  2966.               {
  2967.                 XSET (*objptr, Lisp_String, newaddr);
  2968. ***************
  2969. *** 1498,1504 ****
  2970.        Qt tends to return NULL, which effectively turns undo back on.
  2971.        So don't call truncate_undo_list if undo_list is Qt.  */
  2972.         if (! EQ (nextb->undo_list, Qt))
  2973. !     nextb->undo_list 
  2974.         = truncate_undo_list (nextb->undo_list, undo_threshold,
  2975.                   undo_high_threshold);
  2976.         nextb = nextb->next;
  2977. --- 1510,1516 ----
  2978.        Qt tends to return NULL, which effectively turns undo back on.
  2979.        So don't call truncate_undo_list if undo_list is Qt.  */
  2980.         if (! EQ (nextb->undo_list, Qt))
  2981. !     nextb->undo_list
  2982.         = truncate_undo_list (nextb->undo_list, undo_threshold,
  2983.                   undo_high_threshold);
  2984.         nextb = nextb->next;
  2985. diff -rcP emacs-18.59-fsf/src/alloca.c emacs-18.59-amiga/src/alloca.c
  2986. *** emacs-18.59-fsf/src/alloca.c    Sat Jul 25 21:40:32 1992
  2987. --- emacs-18.59-amiga/src/alloca.c    Sun Nov 22 10:12:50 1992
  2988. ***************
  2989. *** 72,78 ****
  2990.   #define    STACK_DIRECTION    0        /* direction unknown */
  2991.   #endif
  2992.   
  2993. ! #if STACK_DIRECTION != 0
  2994.   
  2995.   #define    STACK_DIR    STACK_DIRECTION    /* known at compile-time */
  2996.   
  2997. --- 72,78 ----
  2998.   #define    STACK_DIRECTION    0        /* direction unknown */
  2999.   #endif
  3000.   
  3001. ! #if (STACK_DIRECTION) != 0
  3002.   
  3003.   #define    STACK_DIR    STACK_DIRECTION    /* known at compile-time */
  3004.   
  3005. ***************
  3006. *** 137,142 ****
  3007. --- 137,144 ----
  3008.   
  3009.   static header *last_alloca_header = NULL; /* -> last alloca header */
  3010.   
  3011. + int alloca_calling;
  3012.   pointer
  3013.   alloca (size)            /* returns pointer to storage */
  3014.        unsigned    size;        /* # bytes to allocate */
  3015. ***************
  3016. *** 176,185 ****
  3017. --- 178,189 ----
  3018.   
  3019.     /* Allocate combined header + user data storage. */
  3020.   
  3021. +   alloca_calling = 1;
  3022.     {
  3023.       register pointer    new = xmalloc (sizeof (header) + size);
  3024.       /* address of header */
  3025.   
  3026. +     alloca_calling = 0;
  3027.       ((header *)new)->h.next = last_alloca_header;
  3028.       ((header *)new)->h.deep = depth;
  3029.   
  3030. diff -rcP emacs-18.59-fsf/src/amiga.h emacs-18.59-amiga/src/amiga.h
  3031. *** emacs-18.59-fsf/src/amiga.h    Thu Jan  1 00:00:00 1970
  3032. --- emacs-18.59-amiga/src/amiga.h    Sat Dec  5 18:07:10 1992
  3033. ***************
  3034. *** 0 ****
  3035. --- 1,145 ----
  3036. + /* Prototypes for functions defined in amiga_clipboard.c */
  3037. + void syms_of_amiga_clipboard(void);
  3038. + void early_clipboard(void);
  3039. + void init_clipboard(void);
  3040. + void cleanup_clipboard(void);
  3041. + /* Prototypes for functions defined in amiga_dump.c */
  3042. + void map_out_data(char *fn);
  3043. + void map_in_data(int load);
  3044. + extern void *far first_fn, *far last_fn;
  3045. + /* Prototypes for functions defined in amiga_menu.c */
  3046. + void suspend_menus(void);
  3047. + int resume_menus(void);
  3048. + void syms_of_amiga_menu(void);
  3049. + void init_amiga_menu(void);
  3050. + void cleanup_amiga_menu(void);
  3051. + /* Prototypes for functions defined in amiga_processes.c */
  3052. + /* Simulation of unix processes & signals */
  3053. + int wait_for_termination(int pid);
  3054. + int wait_without_blocking(void);
  3055. + char *amiga_path(void);
  3056. + void init_amiga_processes(void);
  3057. + void cleanup_amiga_processes(void);
  3058. + /* Prototypes for functions defined in amiga_rexx.c */
  3059. + int check_arexx(int force, int kbd);
  3060. + void init_amiga_rexx(void);
  3061. + void cleanup_amiga_rexx(void);
  3062. + void syms_of_amiga_rexx(void);
  3063. + /* Prototypes for functions defined in amiga_screen.c */
  3064. + extern struct Window *emacs_win;
  3065. + void get_window_size(int *widthp, int *heightp);
  3066. + void reset_window(void);
  3067. + void force_window(void);
  3068. + void add_wbevent(struct WBArg *wbarg);
  3069. + void check_window(int force);
  3070. + void setup_intchar(char intchar);
  3071. + void start_count(int n);
  3072. + void stop_count(int n);
  3073. + void suspend_count(int n);
  3074. + void resume_count(int n);
  3075. + int disp_counts(void);
  3076. + void screen_puts(char *str, unsigned int len);
  3077. + void syms_of_amiga_screen(void);
  3078. + void init_amiga_screen(void);
  3079. + void cleanup_amiga_screen(void);
  3080. + /* Prototypes for functions defined in amiga_serial.c */
  3081. + void init_amiga_serial(void);
  3082. + void cleanup_amiga_serial(void);
  3083. + void check_serial(int force);
  3084. + void serial_puts(char *str, int len);
  3085. + unsigned long serial_baud_rate(void);
  3086. + /* Prototypes for functions defined in amiga_sysdep.c */
  3087. + extern int selecting;
  3088. + int set_exclusive_use(int fd);
  3089. + int sys_suspend(void);
  3090. + char *get_system_name(void);
  3091. + char *expand_path(char *path, char *buf, int len);
  3092. + int syms_of_amiga(void);
  3093. + void cleanup_amiga(void);
  3094. + void amiga_undump_reinit(void);
  3095. + void *early_xmalloc(long size);
  3096. + void *early_xrealloc(void *old, long size);
  3097. + /* Failure stuff */
  3098. + void wbmessage(char *msg);
  3099. + void fail(char *cause);
  3100. + void fail_nomem(void);
  3101. + void _fail_internal(char *file, int line);
  3102. + #define fail_internal() _fail_internal(__FILE__, __LINE__);
  3103. + enum exit_method { use_exit, use_xcexit, use_safe };
  3104. + extern enum exit_method amiga_fail_exit;
  3105. + #define MALLOC_HUNK_SIZE 92000 /* Default malloc hunk size */
  3106. + extern long malloc_hunk_size; /* Amount of memory malloc'ed by a to-be-dumped emacs */
  3107. + extern long malloc_bytes_used;    /* Amount of this hunk actually used */
  3108. + extern long far pre_alloc;    /* amount of memory to reserve for emacs */
  3109. + extern int puresize;        /* Size of pure hunk */
  3110. + /* Various special values used to find the beginning & end of the text, data,
  3111. +    bss and malloc segments. */
  3112. + extern int first_data, last_data, first_bss, last_bss;
  3113. + extern void first_function(), last_function();
  3114. + extern char *malloc_hunk;
  3115. + extern int amiga_initialized;    /* True once Emacs has been undumped or initialised */
  3116. + struct mem_header        /* sizeof() must be multiple of 4 ! */
  3117. + {
  3118. +     struct mem_header *next, *prev;
  3119. +     long size;
  3120. +     /* Data follows */
  3121. + };
  3122. + extern struct mem_header *free_list;
  3123. + /* Prototypes for functions defined in amiga_term.c */
  3124. + int amiga_term_init(void);
  3125. + /* Prototypes for functions defined in amiga_tty.c */
  3126. + extern struct timeinfo *far odd_timer;
  3127. + extern unsigned long odd_sig;
  3128. + int setpgrp_of_tty(int pid);
  3129. + int init_sigio(void);
  3130. + int reset_sigio(void);
  3131. + int request_sigio(void);
  3132. + int unrequest_sigio(void);
  3133. + int tabs_safe_p(void);
  3134. + int get_screen_size(int *widthp, int *heightp);
  3135. + int init_baud_rate(void);
  3136. + void check_intuition(void);
  3137. + #define AMIGASEQ 256 /* When passed to enque, insert the Amiga sequence introducer
  3138. +                 C-x C-^ */
  3139. + void enque(unsigned int c, int meta);
  3140. + int init_sys_modes(void);
  3141. + int reset_sys_modes(void);
  3142. + void amiga_consume_input(void);
  3143. + int discard_tty_input(void);
  3144. + int emacs_fflush(struct __iobuf *f);
  3145. + void emacs_putchar(int c);
  3146. + void emacs_output(char *str, int size);
  3147. + void emacs_fwrite(char *str, unsigned int nblocks, unsigned int len, FILE *f);
  3148. + void syms_of_amiga_tty(void);
  3149. + void init_amiga_tty(void);
  3150. + void cleanup_amiga_tty(void);
  3151. + void early_amiga_tty(void);
  3152. + void amiga_term_open(void);
  3153. + /* Signal mask used to detect available keyboard input.
  3154. +    Must be set by amiga_serial or amiga_screen */
  3155. + extern unsigned long inputsig;
  3156. + /* Prototypes for functions defined in amiga_unix.c */
  3157. + void MemCleanup(void);
  3158. + char *malloc(int size);
  3159. + int free(void *p);
  3160. + char *calloc(long n, long size);
  3161. + char *realloc(char *p, long size);
  3162. + void emacs_malloc_init(void);
  3163. diff -rcP emacs-18.59-fsf/src/amiga_clipboard.c emacs-18.59-amiga/src/amiga_clipboard.c
  3164. *** emacs-18.59-fsf/src/amiga_clipboard.c    Thu Jan  1 00:00:00 1970
  3165. --- emacs-18.59-amiga/src/amiga_clipboard.c    Tue Mar 23 09:41:50 1993
  3166. ***************
  3167. *** 0 ****
  3168. --- 1,225 ----
  3169. + #include "config.h"
  3170. + #undef NULL
  3171. + #include "lisp.h"
  3172. + #include "termchar.h"
  3173. + #include "amiga.h"
  3174. + #include <stdio.h>
  3175. + #include <internal/devices.h>
  3176. + #undef LONGBITS
  3177. + #include <exec/types.h>
  3178. + #include <exec/io.h>
  3179. + #include <devices/clipboard.h>
  3180. + #include <libraries/iffparse.h>
  3181. + #include <utility/hooks.h>
  3182. + #include <proto/exec.h>
  3183. + #include <proto/iffparse.h>
  3184. + #define  ID_FTXT    MAKE_ID('F','T','X','T')
  3185. + #define  ID_CHRS    MAKE_ID('C','H','R','S')
  3186. + /*
  3187. +  * Text error messages for possible IFFERR_#? returns from various
  3188. +  * IFF routines.  To get the index into this array, take your IFFERR code,
  3189. +  * negate it, and subtract one.
  3190. +  *  idx = -error - 1;
  3191. +  */
  3192. + static char *far ifferrormsgs[] = {
  3193. +     "End of file (not an error).",
  3194. +     "End of context (not an error).",
  3195. +     "No lexical scope.",
  3196. +     "Insufficient memory.",
  3197. +     "Stream read error.",
  3198. +     "Stream write error.",
  3199. +     "Stream seek error.",
  3200. +     "File is corrupt.",
  3201. +     "IFF syntax error.",
  3202. +     "Not an IFF file.",
  3203. +     "Required call-back hook missing.",
  3204. +     "Return to client.  You should never see this."
  3205. + };
  3206. + Lisp_Object amiga_new_clip;
  3207. + static struct IFFHandle *far iff;
  3208. + struct Library *IFFParseBase;
  3209. + static struct IOClipReq *far ClipRequest;
  3210. + static struct Hook cliphook;
  3211. + /* added __interrupt flag this disables stack checking for this function
  3212. +  * so we can compile with stack checking on.  -ch3/19/93. */
  3213. + static ULONG __saveds __asm __interrupt
  3214. + clip_change(    register __a0 struct Hook    *hook,
  3215. +         register __a2 VOID        *object,
  3216. +         register __a1 ULONG        *message )
  3217. + {
  3218. +     amiga_new_clip = 1;
  3219. +     return 0;
  3220. + }
  3221. + static Lisp_Object clip_unwind(Lisp_Object dummy)
  3222. + {
  3223. +     CloseIFF (iff);
  3224. +     CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
  3225. +     return Qnil;
  3226. + }
  3227. + static int clip_protect(void)
  3228. + {
  3229. +     int count = specpdl_ptr - specpdl;
  3230. +     record_unwind_protect(clip_unwind, Qnil);
  3231. +     return count;
  3232. + }
  3233. + static long clip_check(long err)
  3234. + {
  3235. +     if(err) error ("Clipboard IO failed, error %ld: %s\n",
  3236. +            err, ifferrormsgs[-err - 1]);
  3237. +     return err;
  3238. + }
  3239. + static void cut(char *str, int size)
  3240. + {
  3241. +     int count;
  3242. +     if (!(iff->iff_Stream = (ULONG) OpenClipboard (0)))
  3243. +     error ("Clipboard open failed.");
  3244. +     count = clip_protect();
  3245. +     /* Open clipbaord */
  3246. +     InitIFFasClip (iff);
  3247. +     clip_check(OpenIFF (iff, IFFF_WRITE));
  3248. +     /* Write data */
  3249. +     clip_check(PushChunk(iff, ID_FTXT, ID_FORM, IFFSIZE_UNKNOWN));
  3250. +     clip_check(PushChunk(iff, 0, ID_CHRS, IFFSIZE_UNKNOWN));
  3251. +     if (WriteChunkBytes(iff, str, size) != size) clip_check(IFFERR_WRITE);
  3252. +     clip_check(PopChunk(iff));
  3253. +     clip_check(PopChunk(iff));
  3254. +     /* & close */
  3255. +     unbind_to (count);
  3256. + }
  3257. + DEFUN ("amiga-cut", Famiga_cut, Samiga_cut,
  3258. +   1, 1, 0,
  3259. +   "Copy string into Amiga clipboard.")
  3260. +   (arg)
  3261. +      Lisp_Object arg;
  3262. + {
  3263. +     struct Lisp_String *p;
  3264. +     CHECK_STRING (arg, 0);
  3265. +     p = XSTRING (arg);
  3266. +     cut(p->data, p->size);
  3267. +     return Qnil;
  3268. + }
  3269. + DEFUN ("amiga-paste", Famiga_paste, Samiga_paste,
  3270. +   0, 0, 0,
  3271. +   "Returns text currently in the Amiga clipboard, or NIL if there is none.")
  3272. +   ()
  3273. + {
  3274. +     long err = 0;
  3275. +     Lisp_Object result = Qnil;
  3276. +     struct ContextNode  *cn;
  3277. +     int count;
  3278. +     if (!(iff->iff_Stream = (ULONG) OpenClipboard (0)))
  3279. +     error ("Clipboard open failed.");
  3280. +     count = clip_protect();
  3281. +     /* Open clipbaord */
  3282. +     InitIFFasClip (iff);
  3283. +     clip_check(OpenIFF (iff, IFFF_READ));
  3284. +     clip_check(StopChunk(iff, ID_FTXT, ID_CHRS));
  3285. +     /* Find the first FTXT CHRS chunks */
  3286. +     while (result == Qnil)
  3287. +     {
  3288. +     long err = ParseIFF(iff, IFFPARSE_SCAN);
  3289. +     if (err == IFFERR_EOC) continue; /* enter next context */
  3290. +     else if (err == IFFERR_EOF) break;
  3291. +     else clip_check(err);
  3292. +     /* We only asked to stop at FTXT CHRS chunks
  3293. +      * If no error we've hit a stop chunk
  3294. +      * Read the CHRS chunk data
  3295. +      */
  3296. +     cn = CurrentChunk(iff);
  3297. +     if ((cn) && (cn->cn_Type == ID_FTXT) && (cn->cn_ID == ID_CHRS))
  3298. +     {
  3299. +         int size = cn->cn_Size, rlen;
  3300. +         result = make_string("", size);
  3301. +         if ((rlen = ReadChunkBytes(iff, XSTRING (result)->data, size)) != size)
  3302. +         if (rlen < 0) clip_check(rlen);
  3303. +         else clip_check(IFFERR_EOC);
  3304. +     }
  3305. +     }
  3306. +     unbind_to (count);
  3307. +     return result;
  3308. + }
  3309. + void syms_of_amiga_clipboard(void)
  3310. + {
  3311. +     DEFVAR_BOOL ("amiga-new-clip", &amiga_new_clip,
  3312. +          "Set to t every time a new clip is put in the Amiga clipboard");
  3313. +     amiga_new_clip = 0;
  3314. +     defsubr (&Samiga_cut);
  3315. +     defsubr (&Samiga_paste);
  3316. + }
  3317. + void early_clipboard(void)
  3318. + {
  3319. +     IFFParseBase = 0;
  3320. + }
  3321. + void init_clipboard(void)
  3322. + {
  3323. +     /* Initialise IFF for clipboard */
  3324. +     if (!(IFFParseBase = OpenLibrary("iffparse.library", 0)))
  3325. +       _fail("iffparse.library is required");
  3326. +     if (!(iff = AllocIFF())) no_memory();
  3327. +     ClipRequest = (struct IOClipReq *)
  3328. +     _device_open("clipboard.device", 0L, 0L, 0L, 0, sizeof(struct IOClipReq));
  3329. +     if (!ClipRequest) _fail("clipboard.device missing !?");
  3330. +     cliphook.h_Entry = (ULONG (*)())clip_change;
  3331. +     ClipRequest->io_Command = CBD_CHANGEHOOK;
  3332. +     ClipRequest->io_Length = 1; /* install */
  3333. +     ClipRequest->io_Data = (APTR)&cliphook;
  3334. +     DoIO((struct IORequest *)ClipRequest);
  3335. + }
  3336. + void cleanup_clipboard(void)
  3337. + {
  3338. +     if (ClipRequest)
  3339. +     {
  3340. +     cliphook.h_Entry = (ULONG (*)())clip_change;
  3341. +     ClipRequest->io_Command = CBD_CHANGEHOOK;
  3342. +     ClipRequest->io_Length = 0; /* remove */
  3343. +     ClipRequest->io_Data = (APTR)&cliphook;
  3344. +     DoIO((struct IORequest *)ClipRequest);
  3345. +     }
  3346. +     if (iff) FreeIFF(iff);
  3347. +     if (IFFParseBase) CloseLibrary(IFFParseBase);
  3348. +     _device_close((struct IORequest *)ClipRequest);
  3349. + }
  3350. diff -rcP emacs-18.59-fsf/src/amiga_data.c emacs-18.59-amiga/src/amiga_data.c
  3351. *** emacs-18.59-fsf/src/amiga_data.c    Thu Jan  1 00:00:00 1970
  3352. --- emacs-18.59-amiga/src/amiga_data.c    Sun Nov 22 10:12:54 1992
  3353. ***************
  3354. *** 0 ****
  3355. --- 1 ----
  3356. + /* Declarations of data that should not be squashed by the dump routine */
  3357. diff -rcP emacs-18.59-fsf/src/amiga_dump.c emacs-18.59-amiga/src/amiga_dump.c
  3358. *** emacs-18.59-fsf/src/amiga_dump.c    Thu Jan  1 00:00:00 1970
  3359. --- emacs-18.59-amiga/src/amiga_dump.c    Sun Nov 22 10:13:00 1992
  3360. ***************
  3361. *** 0 ****
  3362. --- 1,721 ----
  3363. + #include <exec/types.h>
  3364. + #include <fcntl.h>
  3365. + #include <stdio.h>
  3366. + #include <assert.h>
  3367. + #include <proto/dos.h>
  3368. + #include <internal/messages.h>
  3369. + #include "config.h"
  3370. + #include "lisp.h"
  3371. + #include "buffer.h"
  3372. + #include "regex.h"
  3373. + #include "amiga.h"
  3374. + #include "dispextern.h"
  3375. + #include "termchar.h"
  3376. + #define RANGE(ptr, s, e) ((char *)ptr >= (char *)s && (char *)ptr < (char *)e)
  3377. + #define HUNK_POS (VALBITS - 3)
  3378. + #define HUNK_MASK (7 << HUNK_POS)
  3379. + #define HUNK_CODE (0 << HUNK_POS)
  3380. + #define HUNK_DATA (1 << HUNK_POS)
  3381. + #define HUNK_BSS (2 << HUNK_POS)
  3382. + #define HUNK_MALLOC (3 << HUNK_POS)
  3383. + #define HUNK_PURE (4 << HUNK_POS)
  3384. + #define ARRAY_MARK_FLAG ((MARKBIT >> 1) & ~MARKBIT)
  3385. + void *far first_fn = first_function, *far last_fn = last_function;
  3386. + extern int *pure, puresize;
  3387. + extern struct gcpro *gcprolist;
  3388. + extern Lisp_Object *staticvec[];
  3389. + extern int staticidx;
  3390. + extern struct cons_block *cons_block;
  3391. + extern struct Lisp_Cons *cons_free_list;
  3392. + extern struct Lisp_Vector *all_vectors;
  3393. + extern struct symbol_block *symbol_block;
  3394. + extern struct Lisp_Symbol *symbol_free_list;
  3395. + extern struct marker_block *marker_block;
  3396. + extern struct Lisp_Marker *marker_free_list;
  3397. + struct string_block_head
  3398. +   {
  3399. +     struct string_block_head *next, *prev;
  3400. +     int pos;
  3401. +   };
  3402. + extern struct string_block_head *current_string_block;
  3403. + extern struct string_block_head *first_string_block;
  3404. + extern struct string_block_head *large_string_blocks;
  3405. + extern char *kbd_macro_buffer, *read_buffer, *chars_wasted, *copybuf;
  3406. + extern struct minibuf_save_data *minibuf_save_vector;
  3407. + extern struct re_pattern_buffer searchbuf;
  3408. + extern int *ILcost, *DLcost, *ILncost, *DLncost;
  3409. + extern Lisp_Object MouseMap, global_map, Vglobal_map, Vesc_map, Vctl_x_map;
  3410. + extern Lisp_Object Qvariable_documentation, selected_window;
  3411. + extern char *callint_argfuns[];
  3412. + static void *dump_malloc(int size)
  3413. + {
  3414. +   void *new = malloc(size);
  3415. +   if (!new) no_memory();
  3416. +   return new;
  3417. + }
  3418. + static void bailout(char *fn)
  3419. + {
  3420. +   if (fn) _message("%s isn't a dump file for this version of Emacs, aborting", fn);
  3421. +   else _message("Dump file isn't for this version of Emacs, aborting");
  3422. +   /* We are in deep trouble, as all our variables are potentially corrupt */
  3423. +   /* Therefore, no cleanup is possible */
  3424. +   /* Remove cleanup routines */
  3425. +   onexit(0);
  3426. +   /* However, the library & the memory allocation should be ok, so
  3427. +      we can exit reasonably */
  3428. +   _fail("Some system resources may have been lost");
  3429. + }
  3430. + static void *hunk_pointer(void *ptr)
  3431. + {
  3432. +     if (!ptr) return ptr;
  3433. +     if (RANGE(ptr, first_fn, last_fn))
  3434. +     return (void *)(HUNK_CODE | (char *)ptr - (char *)first_fn);
  3435. +     else if (RANGE(ptr, &first_data, &last_data))
  3436. +     return (void *)(HUNK_DATA | (char *)ptr - (char *)&first_data);
  3437. +     else if (RANGE(ptr, &first_bss, &last_bss))
  3438. +     return (void *)(HUNK_BSS | (char *)ptr - (char *)&first_bss);
  3439. +     else if (RANGE(ptr, malloc_hunk, malloc_hunk + malloc_hunk_size))
  3440. +     return (void *)(HUNK_MALLOC | (char *)ptr - malloc_hunk);
  3441. +     else if (RANGE(ptr, pure, (char *)pure + puresize))
  3442. +     return (void *)(HUNK_PURE | (char *)ptr - (char *)pure);
  3443. +     else bailout(0);
  3444. + }
  3445. + static Lisp_Object hunk_lispptr(Lisp_Object *objptr, Lisp_Object val)
  3446. + {
  3447. +     int type = val & ~VALMASK;
  3448. +     void *ptr = (void *)XPNTR(val);
  3449. +     if (RANGE(ptr, first_fn, last_fn))
  3450. +     return type | HUNK_CODE | (char *)ptr - (char *)first_fn;
  3451. +     else if (RANGE(ptr, &first_data, &last_data))
  3452. +     return type | HUNK_DATA | (char *)ptr - (char *)&first_data;
  3453. +     else if (RANGE(ptr, &first_bss, &last_bss))
  3454. +     return type | HUNK_BSS | (char *)ptr - (char *)&first_bss;
  3455. +     else if (RANGE(ptr, pure, (char *)pure + puresize))
  3456. +     return type | HUNK_PURE | (char *)ptr - (char *)pure;
  3457. +     else if (RANGE(ptr, malloc_hunk, malloc_hunk + malloc_hunk_size))
  3458. +     return type | HUNK_MALLOC | (char *)ptr - malloc_hunk;
  3459. +     else bailout(0);
  3460. + }
  3461. + static void patch_pointers ();
  3462. + static void patch_buffer (buf)
  3463. +      Lisp_Object buf;
  3464. + {
  3465. +   Lisp_Object tem;
  3466. +   register struct buffer *buffer = XBUFFER (buf);
  3467. +   register Lisp_Object *ptr;
  3468. +   buffer->text.beg = hunk_pointer (buffer->text.beg);
  3469. +   patch_pointers (&buffer->markers);
  3470. +   /* This is the buffer's markbit */
  3471. +   patch_pointers (&buffer->name);
  3472. +   XMARK (buffer->name);
  3473. +   for (ptr = &buffer->name + 1;
  3474. +        (char *)ptr < (char *)buffer + sizeof (struct buffer);
  3475. +        ptr++)
  3476. +     patch_pointers (ptr);
  3477. + }
  3478. + static void patch_pointers (objptr)
  3479. +      Lisp_Object *objptr;
  3480. + {
  3481. +   register Lisp_Object obj;
  3482. +   obj = *objptr;
  3483. +   XUNMARK (obj);
  3484. +  loop:
  3485. +   switch (XGCTYPE (obj))
  3486. +     {
  3487. +     case Lisp_String:
  3488. +       *objptr = hunk_lispptr(objptr, *objptr);
  3489. +       break;
  3490. +     case Lisp_Vector:
  3491. +     case Lisp_Window:
  3492. +     case Lisp_Process:
  3493. +     case Lisp_Window_Configuration:
  3494. +       *objptr = hunk_lispptr(objptr, *objptr);
  3495. +       {
  3496. +     register struct Lisp_Vector *ptr = XVECTOR (obj);
  3497. +     register int size = ptr->size;
  3498. +     register int i;
  3499. +     if (size & ARRAY_MARK_FLAG) break;   /* Already marked */
  3500. +     ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
  3501. +     for (i = 0; i < size; i++)     /* and then mark its elements */
  3502. +       patch_pointers (&ptr->contents[i]);
  3503. +       }
  3504. +       break;
  3505. +     case Lisp_Symbol:
  3506. +       *objptr = hunk_lispptr(objptr, *objptr);
  3507. +       {
  3508. +     register struct Lisp_Symbol *ptr = XSYMBOL (obj);
  3509. +     struct Lisp_Symbol *ptrx;
  3510. +     if (XMARKBIT (ptr->plist)) break;
  3511. +     XMARK (ptr->plist);
  3512. +     XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
  3513. +     patch_pointers (&ptr->name);
  3514. +     patch_pointers ((Lisp_Object *) &ptr->value);
  3515. +     patch_pointers (&ptr->function);
  3516. +     patch_pointers (&ptr->plist);
  3517. +     objptr = (Lisp_Object *)&ptr->next;
  3518. +     ptr = ptr->next;
  3519. +     if (ptr)
  3520. +       {
  3521. +         ptrx = ptr;        /* Use pf ptrx avoids compiler bug on Sun */
  3522. +         XSETSYMBOL (obj, ptrx);
  3523. +         goto loop;
  3524. +       }
  3525. +       }
  3526. +       break;
  3527. +     case Lisp_Marker: {
  3528. +     struct Lisp_Marker *ptr = XMARKER (obj);
  3529. +     *objptr = hunk_lispptr(objptr, *objptr);
  3530. +     if (XMARKBIT (ptr->chain)) break;
  3531. +     XMARK (ptr->chain);
  3532. +     ptr->buffer = hunk_pointer (ptr->buffer);
  3533. +     patch_pointers (&ptr->chain);
  3534. +     break;
  3535. +     }
  3536. +     case Lisp_Cons:
  3537. +     case Lisp_Buffer_Local_Value:
  3538. +     case Lisp_Some_Buffer_Local_Value:
  3539. +       *objptr = hunk_lispptr(objptr, *objptr);
  3540. +       {
  3541. +     register struct Lisp_Cons *ptr = XCONS (obj);
  3542. +     if (XMARKBIT (ptr->car)) break;
  3543. +     XMARK (ptr->car);
  3544. +     patch_pointers (&ptr->car);
  3545. +     objptr = &ptr->cdr;
  3546. +     obj = ptr->cdr;
  3547. +     goto loop;
  3548. +       }
  3549. +     case Lisp_Buffer:
  3550. +       *objptr = hunk_lispptr(objptr, *objptr);
  3551. +       if (!XMARKBIT (XBUFFER (obj)->name))
  3552. +     patch_buffer (obj);
  3553. +       break;
  3554. +     case Lisp_Subr: {
  3555. +     struct Lisp_Subr *subr = XSUBR(obj);
  3556. +     *objptr = hunk_lispptr(objptr, *objptr);
  3557. +     if (subr->min_args & 0x8000) break;
  3558. +     subr->min_args |= 0x8000;
  3559. +     subr->function = hunk_pointer(subr->function);
  3560. +     subr->symbol_name = hunk_pointer(subr->symbol_name);
  3561. +     subr->prompt = hunk_pointer(subr->prompt);
  3562. +     if ((long)subr->doc >= 0) /* Make sure that not a doc offset */
  3563. +         subr->doc = hunk_pointer(subr->doc);
  3564. +     break;
  3565. +     }
  3566. +     case Lisp_Int:
  3567. +     case Lisp_Void:
  3568. +     case Lisp_Buffer_Objfwd: break;
  3569. +     case Lisp_Intfwd:
  3570. +     case Lisp_Boolfwd:
  3571. +     case Lisp_Objfwd:
  3572. +     case Lisp_Internal_Stream:
  3573. +       *objptr = hunk_lispptr(objptr, *objptr);
  3574. +     /* Don't bother with Lisp_Buffer_Objfwd,
  3575. +        since all markable slots in current buffer marked anyway.  */
  3576. +     /* Don't need to do Lisp_Objfwd, since the places they point
  3577. +        are protected with staticpro.  */
  3578. +       break;
  3579. +     default:
  3580. +       abort ();
  3581. +     }
  3582. + }
  3583. + static void patch_chain(void **ptr, int offset)
  3584. + {
  3585. +     while (*ptr)
  3586. +     {
  3587. +     void **next = (void **)((char *)*ptr + offset);
  3588. +     *ptr = hunk_pointer(*ptr);
  3589. +     ptr = next;
  3590. +     }
  3591. + }
  3592. + static void patch(void)
  3593. + {
  3594. +     int i;
  3595. +     struct string_block_head *sptr;
  3596. +     struct buffer *bptr;
  3597. +     struct mem_header *mem;
  3598. +     for (i = 0; i < staticidx; i++)
  3599. +     {
  3600. +     if (!XMARKBIT(*staticvec[i]))
  3601. +     {
  3602. +         patch_pointers(staticvec[i]);
  3603. +         XMARK(*staticvec[i]);
  3604. +     }
  3605. +     staticvec[i] = hunk_pointer(staticvec[i]);
  3606. +     }
  3607. +     /* Patch all the pointers normally used before a dump ! */
  3608. +     patch_chain((void **)&cons_block, 0);
  3609. +     patch_chain((void **)&cons_free_list, 0);
  3610. +     patch_chain((void **)&all_vectors, 4);
  3611. +     patch_chain((void **)&symbol_block, 0);
  3612. +     patch_chain((void **)&symbol_free_list, 4);
  3613. +     patch_chain((void **)&marker_block, 0);
  3614. +     patch_chain((void **)&marker_free_list, 4);
  3615. +     /* Strings are lots of fun */
  3616. +     patch_chain((void **)&large_string_blocks, 0);
  3617. +     sptr = first_string_block;
  3618. +     while (sptr)
  3619. +     {
  3620. +     struct string_block *next = sptr->next;
  3621. +     if (sptr->next) sptr->next = hunk_pointer(sptr->next);
  3622. +     if (sptr->prev) sptr->prev = hunk_pointer(sptr->prev);
  3623. +     sptr = next;
  3624. +     }
  3625. +     first_string_block = hunk_pointer(first_string_block);
  3626. +     current_string_block = hunk_pointer(current_string_block);
  3627. +     /* More fun with buffers */
  3628. +     bptr = all_buffers;
  3629. +     if (bptr)
  3630. +     {
  3631. +     while (bptr->next)
  3632. +     {
  3633. +         struct buffer *next = bptr->next;
  3634. +         bptr->next = hunk_pointer(bptr->next);
  3635. +         bptr = next;
  3636. +     }
  3637. +     }
  3638. +     all_buffers = hunk_pointer(all_buffers);
  3639. +     current_buffer = hunk_pointer(current_buffer);
  3640. +     kbd_macro_buffer = hunk_pointer(kbd_macro_buffer);
  3641. +     minibuf_save_vector = hunk_pointer(minibuf_save_vector);
  3642. +     searchbuf.buffer = hunk_pointer(searchbuf.buffer);
  3643. +     searchbuf.fastmap = hunk_pointer(searchbuf.fastmap);
  3644. +     specpdl = hunk_pointer(specpdl);
  3645. +     read_buffer = hunk_pointer(read_buffer);
  3646. +     MouseMap = hunk_lispptr(&MouseMap, MouseMap);
  3647. +     global_map = hunk_lispptr(&global_map, global_map);
  3648. +     Vglobal_map = hunk_lispptr(&Vglobal_map, Vglobal_map);
  3649. +     Vesc_map = hunk_lispptr(&Vesc_map, Vesc_map);
  3650. +     Vctl_x_map = hunk_lispptr(&Vctl_x_map, Vctl_x_map);
  3651. +     Qvariable_documentation = hunk_lispptr(&Qvariable_documentation, Qvariable_documentation);
  3652. +     selected_window = hunk_lispptr(&selected_window, selected_window);
  3653. +     mem = free_list;
  3654. +     free_list = hunk_pointer(free_list);
  3655. +     while (mem)
  3656. +     {
  3657. +     struct mem_header *next = mem->next;
  3658. +     mem->prev = hunk_pointer(mem->prev);
  3659. +     mem->next = hunk_pointer(mem->next);
  3660. +     mem = next;
  3661. +     }
  3662. +     for (i = 0; i <= 4; i++)
  3663. +       callint_argfuns[i] = hunk_pointer(callint_argfuns[i]);
  3664. + }
  3665. + static dump(char *fn)
  3666. + {
  3667. +     BPTR fd;
  3668. +     long size;
  3669. +     fd = Open(fn, MODE_NEWFILE);
  3670. +     if (!fd)
  3671. +       {
  3672. +         static void unpatch();
  3673. +         unpatch();
  3674. +         _fail("emacs hasn't been dumped (%s missing)", fn);
  3675. +       }
  3676. +     Write(fd, (char *)&puresize, sizeof puresize);
  3677. +     Write(fd, (char *)&malloc_hunk_size, sizeof malloc_hunk_size);
  3678. +     Write(fd, (char *)&first_data, (char *)&last_data - (char *)&first_data);
  3679. +     Write(fd, (char *)&first_bss, (char *)&last_bss - (char *)&first_bss);
  3680. +     Write(fd, (char *)pure, puresize);
  3681. +     Write(fd, (char *)malloc_hunk, malloc_hunk_size);
  3682. +     Write(fd, (char *)&staticidx, sizeof staticidx);
  3683. +     Write(fd, (char *)staticvec, staticidx * sizeof(Lisp_Object *));
  3684. +     size = (char *)last_fn - (char *)first_fn;
  3685. +     Write(fd, (char *)&size, sizeof size);
  3686. +     Close(fd);
  3687. + }
  3688. + static void *make_pointer(void *ptr)
  3689. + {
  3690. +     int hunk = (long)ptr & HUNK_MASK;
  3691. +     int offset = (long)ptr & (VALMASK & ~HUNK_MASK);
  3692. +     if (!ptr) return 0;
  3693. +     if (hunk == HUNK_CODE) return (char *)first_fn + offset;
  3694. +     if (hunk == HUNK_DATA) return (char *)&first_data + offset;
  3695. +     if (hunk == HUNK_BSS) return (char *)&first_bss + offset;
  3696. +     if (hunk == HUNK_PURE) return (char *)pure + offset;
  3697. +     if (hunk == HUNK_MALLOC) return malloc_hunk + offset;
  3698. +     assert(0);
  3699. + }
  3700. + static Lisp_Object make_lispptr(Lisp_Object *objptr, Lisp_Object obj)
  3701. + {
  3702. +     long val = XUINT(obj);
  3703. +     int hunk = val & HUNK_MASK;
  3704. +     int offset = val & ~HUNK_MASK;
  3705. +     char *ptr;
  3706. +     if (hunk == HUNK_CODE) ptr = (char *)first_fn + offset;
  3707. +     else if (hunk == HUNK_DATA) ptr = (char *)&first_data + offset;
  3708. +     else if (hunk == HUNK_BSS) ptr = (char *)&first_bss + offset;
  3709. +     else if (hunk == HUNK_PURE) ptr = (char *)pure + offset;
  3710. +     else if (hunk == HUNK_MALLOC) ptr = malloc_hunk + offset;
  3711. +     else assert(0);
  3712. +     XSETPNTR(obj, (long)ptr);
  3713. +     return obj;
  3714. + }
  3715. + static void unpatch_pointers ();
  3716. + static void unpatch_buffer (buf)
  3717. +      Lisp_Object buf;
  3718. + {
  3719. +   Lisp_Object tem;
  3720. +   register struct buffer *buffer = XBUFFER (buf);
  3721. +   register Lisp_Object *ptr;
  3722. +   buffer->text.beg = make_pointer (buffer->text.beg);
  3723. +   unpatch_pointers (&buffer->markers);
  3724. +   /* This is the buffer's markbit */
  3725. +   XUNMARK (buffer->name);
  3726. +   unpatch_pointers (&buffer->name);
  3727. +   for (ptr = &buffer->name + 1;
  3728. +        (char *)ptr < (char *)buffer + sizeof (struct buffer);
  3729. +        ptr++)
  3730. +     unpatch_pointers (ptr);
  3731. + }
  3732. + static void unpatch_pointers (objptr)
  3733. +      Lisp_Object *objptr;
  3734. + {
  3735. +   register Lisp_Object obj;
  3736. +   obj = *objptr;
  3737. +   XUNMARK (obj);
  3738. +  loop:
  3739. +   switch (XGCTYPE (obj))
  3740. +     {
  3741. +     case Lisp_String:
  3742. +       *objptr = make_lispptr(objptr, *objptr);
  3743. +       break;
  3744. +     case Lisp_Vector:
  3745. +     case Lisp_Window:
  3746. +     case Lisp_Process:
  3747. +     case Lisp_Window_Configuration:
  3748. +       obj = *objptr = make_lispptr(objptr, *objptr);
  3749. +       {
  3750. +     register struct Lisp_Vector *ptr = XVECTOR (obj);
  3751. +     register int size;
  3752. +     register int i;
  3753. +     if (!(ptr->size & ARRAY_MARK_FLAG)) break;   /* Already unmarked */
  3754. +     size = ptr->size &= ~ARRAY_MARK_FLAG; /* Else unmark it */
  3755. +     for (i = 0; i < size; i++)     /* and then unmark its elements */
  3756. +       unpatch_pointers (&ptr->contents[i]);
  3757. +       }
  3758. +       break;
  3759. +     case Lisp_Symbol:
  3760. +       obj = *objptr = make_lispptr(objptr, *objptr);
  3761. +       {
  3762. +     register struct Lisp_Symbol *ptr = XSYMBOL (obj);
  3763. +     struct Lisp_Symbol *ptrx;
  3764. +     if (!XMARKBIT (ptr->plist)) break;
  3765. +     XUNMARK (ptr->plist);
  3766. +     unpatch_pointers (&ptr->name);
  3767. +     ptr->name = XSTRING (*(Lisp_Object *)&ptr->name);
  3768. +     unpatch_pointers ((Lisp_Object *) &ptr->value);
  3769. +     unpatch_pointers (&ptr->function);
  3770. +     unpatch_pointers (&ptr->plist);
  3771. +     objptr = (Lisp_Object *)&ptr->next;
  3772. +     ptr = ptr->next;
  3773. +     if (ptr)
  3774. +       {
  3775. +         ptrx = ptr;        /* Use pf ptrx avoids compiler bug on Sun */
  3776. +         XSET (obj, Lisp_Symbol, ptrx);
  3777. +         goto loop;
  3778. +       }
  3779. +       }
  3780. +       break;
  3781. +     case Lisp_Marker: {
  3782. +     struct Lisp_Marker *ptr;
  3783. +     obj = *objptr = make_lispptr(objptr, *objptr);
  3784. +     ptr = XMARKER (obj);
  3785. +     if (!XMARKBIT (ptr->chain)) break;
  3786. +     XUNMARK (ptr->chain);
  3787. +     ptr->buffer = make_pointer (ptr->buffer);
  3788. +     unpatch_pointers (&ptr->chain);
  3789. +     break;
  3790. +     }
  3791. +     case Lisp_Cons:
  3792. +     case Lisp_Buffer_Local_Value:
  3793. +     case Lisp_Some_Buffer_Local_Value:
  3794. +       obj = *objptr = make_lispptr(objptr, *objptr);
  3795. +       {
  3796. +     register struct Lisp_Cons *ptr = XCONS (obj);
  3797. +     if (!XMARKBIT (ptr->car)) break;
  3798. +     XUNMARK (ptr->car);
  3799. +     unpatch_pointers (&ptr->car);
  3800. +     objptr = &ptr->cdr;
  3801. +     obj = ptr->cdr;
  3802. +     goto loop;
  3803. +       }
  3804. +     case Lisp_Buffer:
  3805. +       obj = *objptr = make_lispptr(objptr, *objptr);
  3806. +       if (XMARKBIT (XBUFFER (obj)->name))
  3807. +     unpatch_buffer (obj);
  3808. +       break;
  3809. +     case Lisp_Subr: {
  3810. +     struct Lisp_Subr *subr;
  3811. +     obj = *objptr = make_lispptr(objptr, *objptr);
  3812. +     subr = XSUBR(obj);
  3813. +     if (!(subr->min_args & 0x8000)) break;
  3814. +     subr->min_args &= ~0x8000;
  3815. +     subr->function = make_pointer(subr->function);
  3816. +     subr->symbol_name = make_pointer(subr->symbol_name);
  3817. +     subr->prompt = make_pointer(subr->prompt);
  3818. +     if ((long)subr->doc >= 0) /* Make sure that not a doc offset */
  3819. +         subr->doc = make_pointer(subr->doc);
  3820. +     break;
  3821. +     }
  3822. +     case Lisp_Int:
  3823. +     case Lisp_Void:
  3824. +     case Lisp_Buffer_Objfwd: break;
  3825. +     case Lisp_Intfwd:
  3826. +     case Lisp_Boolfwd:
  3827. +     case Lisp_Objfwd:
  3828. +     case Lisp_Internal_Stream:
  3829. +       *objptr = make_lispptr(objptr, *objptr);
  3830. +     /* Don't bother with Lisp_Buffer_Objfwd,
  3831. +        since all markable slots in current buffer marked anyway.  */
  3832. +     /* Don't need to do Lisp_Objfwd, since the places they point
  3833. +        are protected with staticpro.  */
  3834. +       break;
  3835. +     default:
  3836. +       abort ();
  3837. +     }
  3838. + }
  3839. + static void unpatch_chain(void **ptr, int offset)
  3840. + {
  3841. +     while (*ptr)
  3842. +     {
  3843. +     *ptr = make_pointer(*ptr);
  3844. +     ptr = (void **)((char *)*ptr + offset);
  3845. +     }
  3846. + }
  3847. + /* Reconstructs the addresses that were patched */
  3848. + static void unpatch(void)
  3849. + {
  3850. +     int fd, i;
  3851. +     struct string_block_head *sptr;
  3852. +     struct buffer *bptr;
  3853. +     struct mem_header *mem;
  3854. +     for (i = 0; i < staticidx; i++)
  3855. +     {
  3856. +     staticvec[i] = make_pointer(staticvec[i]);
  3857. +     if (XMARKBIT(*staticvec[i]))
  3858. +     {
  3859. +         XUNMARK(*staticvec[i]);
  3860. +         unpatch_pointers(staticvec[i]);
  3861. +     }
  3862. +     }
  3863. +     /* Unpatch all the pointers normally used before a dump ! */
  3864. +     unpatch_chain((void **)&cons_block, 0);
  3865. +     unpatch_chain((void **)&cons_free_list, 0);
  3866. +     unpatch_chain((void **)&all_vectors, 4);
  3867. +     unpatch_chain((void **)&symbol_block, 0);
  3868. +     unpatch_chain((void **)&symbol_free_list, 4);
  3869. +     unpatch_chain((void **)&marker_block, 0);
  3870. +     unpatch_chain((void **)&marker_free_list, 4);
  3871. +     /* Strings are lots of fun */
  3872. +     unpatch_chain((void **)&large_string_blocks, 0);
  3873. +     sptr = first_string_block = make_pointer(first_string_block);
  3874. +     current_string_block = make_pointer(current_string_block);
  3875. +     while (sptr)
  3876. +     {
  3877. +     if (sptr->next) sptr->next = make_pointer(sptr->next);
  3878. +     if (sptr->prev) sptr->prev = make_pointer(sptr->prev);
  3879. +     sptr = sptr->next;
  3880. +     }
  3881. +     /* More fun with buffers */
  3882. +     bptr = all_buffers = make_pointer(all_buffers);
  3883. +     if (bptr)
  3884. +     {
  3885. +     while (bptr->next)
  3886. +     {
  3887. +         bptr->next = make_pointer(bptr->next);
  3888. +         bptr = bptr->next;
  3889. +     }
  3890. +     }
  3891. +     current_buffer = make_pointer(current_buffer);
  3892. +     kbd_macro_buffer = make_pointer(kbd_macro_buffer);
  3893. +     minibuf_save_vector = make_pointer(minibuf_save_vector);
  3894. +     searchbuf.buffer = make_pointer(searchbuf.buffer);
  3895. +     searchbuf.fastmap = make_pointer(searchbuf.fastmap);
  3896. +     specpdl = make_pointer(specpdl);
  3897. +     read_buffer = make_pointer(read_buffer);
  3898. +     MouseMap = make_lispptr(&MouseMap, MouseMap);
  3899. +     global_map = make_lispptr(&global_map, global_map);
  3900. +     Vglobal_map = make_lispptr(&Vglobal_map, Vglobal_map);
  3901. +     Vesc_map = make_lispptr(&Vesc_map, Vesc_map);
  3902. +     Vctl_x_map = make_lispptr(&Vctl_x_map, Vctl_x_map);
  3903. +     Qvariable_documentation = make_lispptr(&Qvariable_documentation, Qvariable_documentation);
  3904. +     selected_window = make_lispptr(&selected_window, selected_window);
  3905. +     free_list = make_pointer(free_list);
  3906. +     mem = free_list;
  3907. +     while (mem)
  3908. +     {
  3909. +     mem->prev = make_pointer(mem->prev);
  3910. +     mem->next = make_pointer(mem->next);
  3911. +     mem = mem->next;
  3912. +     }
  3913. +     for (i = 0; i <= 4; i++)
  3914. +       callint_argfuns[i] = make_pointer(callint_argfuns[i]);
  3915. + }
  3916. + static undump(char *fn)
  3917. + {
  3918. +   BPTR fd;
  3919. +   long code_size;
  3920. +   char *_malloc_hunk;
  3921. +   int *_pure;
  3922. +   /*extern struct Library *FifoBase;
  3923. +   struct Library *_FifoBase = FifoBase;*/
  3924. +   fd = Open(fn, MODE_OLDFILE);
  3925. +   if (!fd) return 0;
  3926. +   Read(fd, (char *)&puresize, sizeof puresize);
  3927. +   Read(fd, (char *)&malloc_hunk_size, sizeof malloc_hunk_size);
  3928. +   _pure = dump_malloc(puresize);
  3929. +   _malloc_hunk = dump_malloc(malloc_hunk_size + pre_alloc);
  3930. +   Read(fd, (char *)&first_data, (char *)&last_data - (char *)&first_data);
  3931. +   Read(fd, (char *)&first_bss, (char *)&last_bss - (char *)&first_bss);
  3932. +   Read(fd, (char *)_pure, puresize);
  3933. +   Read(fd, (char *)_malloc_hunk, malloc_hunk_size);
  3934. +   Read(fd, (char *)&staticidx, sizeof staticidx);
  3935. +   Read(fd, (char *)staticvec, staticidx * sizeof(Lisp_Object *));
  3936. +   /*FifoBase = _FifoBase;*/
  3937. +   if (Read(fd, (char *)&code_size, sizeof code_size) != sizeof code_size ||
  3938. +       code_size != (char *)last_fn - (char *)first_fn)
  3939. +     bailout(fn);
  3940. +   Close(fd);
  3941. +   malloc_hunk = _malloc_hunk;
  3942. +   pure = _pure;
  3943. +   return 1;
  3944. + }
  3945. + void map_out_data(char *fn)
  3946. + {
  3947. +     if (amiga_initialized) error("You can only dump once !");
  3948. +     Fgarbage_collect();
  3949. +     patch();
  3950. +     dump(fn);
  3951. +     unpatch();
  3952. +     amiga_initialized = 1;
  3953. + }
  3954. + void map_in_data(int load)
  3955. + {
  3956. +     if (load && undump("GNUEmacs:etc/EMACS-DATA"))
  3957. +     {
  3958. +     unpatch();
  3959. +     current_screen = new_screen = temp_screen = 0;
  3960. +     message_buf = 0;
  3961. +     chars_wasted = copybuf = 0;
  3962. +     DC_ICcost = 0;
  3963. +     ILcost = DLcost = ILncost = DLncost = 0;
  3964. +     initialized = amiga_initialized = 1;
  3965. +     }
  3966. +     else
  3967. +       {
  3968. +     malloc_hunk = dump_malloc(malloc_hunk_size + pre_alloc);
  3969. +     pure = dump_malloc(puresize);
  3970. +       }
  3971. +     amiga_undump_reinit();
  3972. + }
  3973. diff -rcP emacs-18.59-fsf/src/amiga_malloc.c emacs-18.59-amiga/src/amiga_malloc.c
  3974. *** emacs-18.59-fsf/src/amiga_malloc.c    Thu Jan  1 00:00:00 1970
  3975. --- emacs-18.59-amiga/src/amiga_malloc.c    Sat Dec  5 16:36:46 1992
  3976. ***************
  3977. *** 0 ****
  3978. --- 1,321 ----
  3979. + /* Emulation of some unix functions for emacs.
  3980. + Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
  3981. + This file is part of GNU Emacs.
  3982. + GNU Emacs is distributed in the hope that it will be useful,
  3983. + but WITHOUT ANY WARRANTY.  No author or distributor
  3984. + accepts responsibility to anyone for the consequences of using it
  3985. + or for whether it serves any particular purpose or works at all,
  3986. + unless he says so in writing.  Refer to the GNU Emacs General Public
  3987. + License for full details.
  3988. + Everyone is granted permission to copy, modify and redistribute
  3989. + GNU Emacs, but only under the conditions described in the
  3990. + GNU Emacs General Public License.   A copy of this license is
  3991. + supposed to have been given to you along with GNU Emacs so you
  3992. + can know your rights and responsibilities.  It should be in a
  3993. + file named COPYING.  Among other things, the copyright notice
  3994. + and this notice must be preserved on all copies.  */
  3995. + #include <exec/types.h>
  3996. + #include <exec/memory.h>
  3997. + #include <proto/exec.h>
  3998. + #undef LONGBITS
  3999. + #undef NULL
  4000. + #include "config.h"
  4001. + #include "lisp.h"
  4002. + #include "amiga.h"
  4003. + /* Memory stuff */
  4004. + long far DataSegBits;
  4005. + static int DataSegFound;
  4006. + static struct mem_header *far current;
  4007. + struct mem_header *free_list;
  4008. + extern int alloca_calling;
  4009. + extern int *pure;
  4010. + long far pre_alloc;    /* amount of memory to reserve for emacs */
  4011. + char *malloc_hunk;
  4012. + long malloc_hunk_size = MALLOC_HUNK_SIZE; /* Amount of memory malloc'ed by a
  4013. +                          to-be-dumped emacs */
  4014. + long malloc_bytes_used;    /* Amount of this hunk actually used */
  4015. + static int early_malloc = TRUE;    /* Before we undump, we want system allocations */
  4016. + #define ADDR_OK(x) (((long)x & ~VALMASK) == DataSegBits)
  4017. + /* Memory allocation code */
  4018. + /* ---------------------- */
  4019. + static void *alloc_sys(long memsize)
  4020. + /* Effect: Allocate from AmigaOS (via AllocMem). */
  4021. + {
  4022. +   /* Allocation rounded up to multiple of 4 */
  4023. +   long size = ((memsize + 3) & ~3) + sizeof(struct mem_header);
  4024. +   struct mem_header *mem;
  4025. +   if (!DataSegFound)
  4026. +     {
  4027. +       /* Find page containing Pure data. All data used by emacs must be
  4028. +      on the same page (As a page is 2^26 bytes, this shouldn't be too
  4029. +      unlikely). */
  4030. +       DataSegBits = (long)&first_data & ~VALMASK;
  4031. +       if (!(ADDR_OK(first_fn) && ADDR_OK(last_fn) &&
  4032. +         ADDR_OK(&first_data) && ADDR_OK(&last_data) &&
  4033. +         ADDR_OK(&first_bss) && ADDR_OK(&last_bss)))
  4034. +     _fail("I can't handle your memory configuration");
  4035. +       DataSegFound = TRUE;
  4036. +     }
  4037. +   mem = AllocMem(size, 0);
  4038. +   if (!mem) return 0;
  4039. +   /* All memory *must* be allocated on the same page ! */
  4040. +   if (!ADDR_OK(mem))
  4041. +     {
  4042. +       FreeMem(mem, size);
  4043. +       return 0;
  4044. +     }
  4045. +   if (current) current->prev = mem;
  4046. +   mem->next = current;
  4047. +   mem->prev = 0;
  4048. +   current = mem;
  4049. +   mem->size = size;
  4050. +   return mem + 1;
  4051. + }
  4052. + static void free_sys(char *p)
  4053. + {
  4054. +   struct mem_header *old = (struct mem_header *)p - 1;
  4055. +   if (old == current)
  4056. +     {
  4057. +       current = current->next;
  4058. +       if (current) current->prev = 0;
  4059. +     }
  4060. +   else
  4061. +     {
  4062. +       old->prev->next = old->next;
  4063. +       if (old->next) old->next->prev = old->prev;
  4064. +     }
  4065. +   FreeMem(old, old->size);
  4066. + }
  4067. + void _MemCleanup(void)
  4068. + {
  4069. +   struct mem_header *next;
  4070. +   while (current)
  4071. +     {
  4072. +       next = current->next;
  4073. +       FreeMem(current, current->size);
  4074. +       current = next;
  4075. +     }
  4076. + }
  4077. + static void *alloc_hunk(long memsize)
  4078. + /* Effect: Allocates from the malloc hunk (which is dumped to disk).
  4079. + */
  4080. + {
  4081. +   /* Allocation rounded up to multiple of 4 */
  4082. +   long size = ((memsize + 3) & ~3) + sizeof(struct mem_header);
  4083. +   /* Find a free block in the memory list */
  4084. +   struct mem_header *scan = free_list->next;
  4085. +   while (scan->size > 0)
  4086. +     {
  4087. +       if (size < scan->size)    /* Found ! */
  4088. +     {
  4089. +       long end;
  4090. +       /* Split block if big enough */
  4091. +       if (size + sizeof(struct mem_header) + 8 > scan->size)
  4092. +         {
  4093. +           /* Remove block from list */
  4094. +           scan->prev->next = scan->next;
  4095. +           scan->next->prev = scan->prev;
  4096. +         }
  4097. +       else
  4098. +         {
  4099. +           /* Split block */
  4100. +           struct mem_header *new = (struct mem_header *)((char *)scan + size);
  4101. +           new->prev = scan->prev;
  4102. +           new->next = scan->next;
  4103. +           scan->prev->next = new;
  4104. +           scan->next->prev = new;
  4105. +           new->size = scan->size - size;
  4106. +           scan->size = size;
  4107. +         }
  4108. +       if (!amiga_initialized)
  4109. +         {
  4110. +           end = (char *)scan - (char *)free_list + scan->size +
  4111. +         sizeof(long) + sizeof(struct mem_header);
  4112. +           if (end > malloc_bytes_used) malloc_bytes_used = end;
  4113. +         }
  4114. +       return scan + 1;
  4115. +     }
  4116. +       scan = scan->next;
  4117. +     }
  4118. +   return 0;
  4119. + }
  4120. + static void free_hunk(char *p)
  4121. + {
  4122. +   struct mem_header *old = (struct mem_header *)p - 1, *scan = free_list;
  4123. +   do scan = scan->next; while (scan < old);
  4124. +   /* Check for merges (potentially with both sides) */
  4125. +   if ((char *)scan->prev + scan->prev->size == (char *)old)
  4126. +     if ((char *)old + old->size == (char *)scan)
  4127. +       {
  4128. +     /* Merge all 3 blocks together */
  4129. +     scan->prev->size += old->size + scan->size;
  4130. +     scan->next->prev = scan->prev;
  4131. +     scan->prev->next = scan->next;
  4132. +       }
  4133. +     else            /* Merge with previous block */
  4134. +       scan->prev->size += old->size;
  4135. +   else if ((char *)old + old->size == (char *)scan)
  4136. +     {
  4137. +       /* Merge with next block */
  4138. +       old->size += scan->size;
  4139. +       scan->prev->next = old;
  4140. +       scan->next->prev = old;
  4141. +       old->prev = scan->prev;
  4142. +       old->next = scan->next;
  4143. +     }
  4144. +   else                /* Add a new block */
  4145. +     {
  4146. +       old->next = scan;
  4147. +       old->prev = scan->prev;
  4148. +       scan->prev->next = old;
  4149. +       scan->prev = old;
  4150. +     }
  4151. + }
  4152. + char *__halloc(long size)
  4153. + {
  4154. +   if (early_malloc) return alloc_sys(size);
  4155. +   if (!amiga_initialized)
  4156. +     if (alloca_calling)
  4157. +       {
  4158. +     alloca_calling = 0;
  4159. +     return alloc_sys(size);
  4160. +       }
  4161. +     else
  4162. +       {
  4163. +     void *mem = alloc_hunk(size);
  4164. +     if (!mem) 
  4165. +       _fail("Emacs dump: ran out of memory for malloc. \n"
  4166. +         "See the -malloc option for more information.\n");
  4167. +     return mem;
  4168. +       }
  4169. +   else
  4170. +     {
  4171. +       alloca_calling = 0;
  4172. +       if (pre_alloc)
  4173. +     {
  4174. +       void *mem;
  4175. +       if (mem = alloc_hunk(size)) return mem;
  4176. +     }
  4177. +       return alloc_sys(size);
  4178. +     }
  4179. + }
  4180. + char *malloc(int size)
  4181. + {
  4182. +   return __halloc(size);
  4183. + }
  4184. + free(void *p)
  4185. + {
  4186. +   struct mem_header *old = (struct mem_header *)p - 1;
  4187. +   if ((char *)p >= malloc_hunk &&
  4188. +       (char *)p <= malloc_hunk + malloc_hunk_size + pre_alloc)
  4189. +     {
  4190. +       if (!amiga_initialized || pre_alloc) free_hunk(p);
  4191. +     }
  4192. +   else free_sys(p);
  4193. + }
  4194. + char *calloc(long n, long size)
  4195. + {
  4196. +   char *t;
  4197. +   long rsize = n * size;
  4198. +   t = malloc(rsize);
  4199. +   if (t) memset (t, 0, rsize);
  4200. +   return t;
  4201. + }
  4202. + char *realloc(char *p, long size)
  4203. + {
  4204. +   char *new = malloc(size);
  4205. +   struct mem_header *old = (struct mem_header *)p - 1;
  4206. +   if (new)
  4207. +     {
  4208. +       long minsize;
  4209. +       long oldsize = old->size - sizeof(struct mem_header);
  4210. +       if (size < oldsize) minsize = size;
  4211. +       else minsize = oldsize;
  4212. +       memcpy(new, p, minsize);
  4213. +     }
  4214. +   free(p);
  4215. +   return new;
  4216. + }
  4217. + void emacs_malloc_init(void)
  4218. + {
  4219. +   struct mem_header *end_sentinel, *new_end, *new_block;
  4220. +   early_malloc = FALSE;        /* We now have a malloc hunk */
  4221. +   /* Set up the memory allocation in the malloc hunk */
  4222. +   free_list = (struct mem_header *)malloc_hunk;
  4223. +   end_sentinel = (struct mem_header *)((char *)free_list + malloc_hunk_size
  4224. +                        - sizeof(struct mem_header));
  4225. +   if (!amiga_initialized)
  4226. +     {
  4227. +       /* Before dumping */
  4228. +       free_list->next = free_list + 1;
  4229. +       free_list->prev = 0;
  4230. +       free_list->size = 0;    /* Prevents merges with this pseudo-block */
  4231. +       free_list[1].prev = free_list;
  4232. +       free_list[1].next = end_sentinel;
  4233. +       free_list[1].size =
  4234. +     malloc_hunk_size - 2 * sizeof(struct mem_header) - sizeof(long);
  4235. +       /* The - sizeof(long) prevents any merges with end_sentinel */
  4236. +       end_sentinel->size = 0;
  4237. +       end_sentinel->prev = free_list + 1;
  4238. +       end_sentinel->next = 0;
  4239. +       malloc_bytes_used = 0;
  4240. +     }
  4241. +   else if (pre_alloc)
  4242. +     {
  4243. +       /* After having undumped extend malloc block */
  4244. +       /* Move end_sentinel: */
  4245. +       new_end = (struct mem_header *)((char *)free_list + malloc_hunk_size +
  4246. +                       pre_alloc - sizeof(struct mem_header));
  4247. +       new_end->size = 0;
  4248. +       new_end->next = 0;
  4249. +       new_end->prev = end_sentinel->prev;
  4250. +       end_sentinel->prev->next = new_end;
  4251. +       /* Add extra memory (pre_alloc bytes) */
  4252. +       new_block = (struct mem_header *)((char *)end_sentinel - sizeof(long));
  4253. +       new_block->size = pre_alloc;
  4254. +       free_hunk((char *)(new_block + 1));
  4255. +     }
  4256. + }
  4257. diff -rcP emacs-18.59-fsf/src/amiga_menu.c emacs-18.59-amiga/src/amiga_menu.c
  4258. *** emacs-18.59-fsf/src/amiga_menu.c    Thu Jan  1 00:00:00 1970
  4259. --- emacs-18.59-amiga/src/amiga_menu.c    Thu Sep 30 21:27:42 1993
  4260. ***************
  4261. *** 0 ****
  4262. --- 1,309 ----
  4263. + #include <exec/types.h>
  4264. + #include <libraries/gadtools.h>
  4265. + #include <intuition/intuition.h>
  4266. + #include <proto/exec.h>
  4267. + #include <proto/dos.h>
  4268. + #include <proto/gadtools.h>
  4269. + #include <proto/intuition.h>
  4270. + #include "config.h"
  4271. + #undef NULL
  4272. + #include "lisp.h"
  4273. + #include "amiga.h"
  4274. + #ifndef GTMN_NewLookMenus
  4275. + #define GTMN_NewLookMenus    GT_TagBase+67
  4276. + #endif
  4277. + static struct Menu *emacs_menu;
  4278. + static char *emacs_menu_strings;
  4279. + static APTR win_vi;
  4280. + struct Library *GadToolsBase;
  4281. + void suspend_menus(void)
  4282. + {
  4283. +   if (emacs_win)
  4284. +     {
  4285. +       ClearMenuStrip(emacs_win);
  4286. +       if (win_vi)
  4287. +     {
  4288. +       FreeVisualInfo(win_vi);
  4289. +       win_vi = 0;
  4290. +     }
  4291. +     }
  4292. + }
  4293. + int resume_menus(void)
  4294. + {
  4295. +   if (emacs_win && emacs_menu)
  4296. +     {
  4297. +       win_vi = GetVisualInfo(emacs_win->WScreen, TAG_END);
  4298. +       if (!win_vi || !LayoutMenus(emacs_menu, win_vi,
  4299. +                   GTMN_NewLookMenus, 1L,
  4300. +                   TAG_END))
  4301. +     {
  4302. +       if (win_vi) FreeVisualInfo(win_vi);
  4303. +       Famiga_delete_menus();
  4304. +       return FALSE;
  4305. +     }
  4306. +       SetMenuStrip(emacs_win, emacs_menu);
  4307. +     }
  4308. +   return TRUE;
  4309. + }
  4310. + DEFUN ("amiga-menus", Famiga_menus, Samiga_menus, 1, 1, 0,
  4311. +   "Define menus for emacs. The argument is a list structured as follows:\n\
  4312. +    ((menu1-name ((item1-name item1-expr item1-key item1-disabled) ...)\n\
  4313. +      menu1-disabled) ...)\n\
  4314. + menu-name is the name of the menu item header.\n\
  4315. + The menu is disabled if menu-disabled is not nil [optional].\n\
  4316. + item-name is the name of an item.\n\
  4317. + The item-expr fields are ignored.\n\
  4318. + If item-key is nil, no shortcut is allowed.\n\
  4319. + If item-disabled is not nil, the item is disabled.\n\
  4320. + If the item information list is nil, a line is drawn in the menu.\n\
  4321. + item-key & item-disabled are optional.")
  4322. +   (menus)
  4323. +      Lisp_Object menus;
  4324. + {
  4325. +     Lisp_Object s_menus, s_items;
  4326. +     int citems, slen;
  4327. +     char *strdata;
  4328. +     struct NewMenu *menudata, *mkm;
  4329. +     struct Lisp_String *name;
  4330. + /*    int i;
  4331. +     extern int total[], nb[];
  4332. +     for (i = 0; i < 16; i++)
  4333. +     {
  4334. +     printf("%d(%d) ", total[i], nb[i]);
  4335. +     total[i] = nb[i] = 0;
  4336. +     }
  4337. +     printf("\n");
  4338. +     start_count(15);
  4339. +     for (i = 0; i < 100; i++) { suspend_count(15); resume_count(15); }
  4340. +     stop_count(15);
  4341. +     for (i = 0; i < 100; i++) { start_count(14); stop_count(14); }
  4342. +     printf("100 s/r: %d, 100 s/s: %d\n", total[15], total[14]);
  4343. +     return Qnil;
  4344. + */
  4345. +     check_intuition();
  4346. +     /* Check structure of parameter & count # items & menus */
  4347. +     s_menus = menus;
  4348. +     citems = slen = 0;
  4349. +     while (!NULL(s_menus))
  4350. +     {
  4351. +     struct Lisp_Cons *menu, *menu_cell;
  4352. +     CHECK_CONS(s_menus, 0);
  4353. +     menu_cell = XCONS(s_menus);
  4354. +     citems++;
  4355. +     CHECK_CONS(menu_cell->car, 0); /* Each menu is a list */
  4356. +     menu = XCONS(menu_cell->car);
  4357. +     CHECK_STRING(menu->car, 0); /* Check name */
  4358. +     name = XSTRING(menu->car);
  4359. +     slen += name->size + 1;
  4360. +     CHECK_CONS(menu->cdr, 0);
  4361. +     menu = XCONS(menu->cdr); /* Check items */
  4362. +     s_items = menu->car;
  4363. +     while (!NULL(s_items))
  4364. +     {
  4365. +         struct Lisp_Cons *item, *item_cell;
  4366. +         CHECK_CONS(s_items, 0);
  4367. +         item_cell = XCONS(s_items);
  4368. +         citems++;
  4369. +         if (!NULL(item_cell->car))
  4370. +         {
  4371. +         CHECK_CONS(item_cell->car, 0); /* Each item is a list */
  4372. +         item = XCONS(item_cell->car);
  4373. +         CHECK_STRING(item->car, 0);
  4374. +         name = XSTRING(item->car);
  4375. +         slen += name->size + 1;
  4376. +         if (!NULL(item->cdr)) /* Only name is necessary */
  4377. +         {
  4378. +             CHECK_CONS(item->cdr, 0);
  4379. +             item = XCONS(item->cdr);
  4380. +             /* Expr is arbitrary */
  4381. +             if (!NULL(item->cdr))
  4382. +             {
  4383. +             CHECK_CONS(item->cdr, 0);
  4384. +             item = XCONS(item->cdr);
  4385. +             /* Check shortcut */
  4386. +             if (!NULL(item->car))
  4387. +             {
  4388. +                 CHECK_NUMBER(item->car, 0);
  4389. +                 slen += 2;
  4390. +             }
  4391. +             if (!NULL(item->cdr))
  4392. +             {
  4393. +                 CHECK_CONS(item->cdr, 0);
  4394. +                 item = XCONS(item->cdr);
  4395. +                 /* Check that end of list */
  4396. +                 if (!NULL(item->cdr)) error("Badly formed item");
  4397. +             }
  4398. +             }
  4399. +         }
  4400. +         }
  4401. +         s_items = item_cell->cdr;
  4402. +     }
  4403. +     if (!NULL(menu->cdr))
  4404. +     {
  4405. +         CHECK_CONS(menu->cdr, 0);
  4406. +         menu = XCONS(menu->cdr);
  4407. +         if (!NULL(menu->cdr)) error("Badly formed menu");
  4408. +     }
  4409. +     s_menus = menu_cell->cdr;
  4410. +     }
  4411. +     suspend_menus();
  4412. +     if (emacs_menu) Famiga_delete_menus();
  4413. +     /* Now create menu structure */
  4414. +     menudata = (struct NewMenu *)alloca(sizeof(struct NewMenu) * (citems + 1));
  4415. +     emacs_menu_strings = strdata = (char *)xmalloc(slen);
  4416. +     mkm = menudata;
  4417. +     s_menus = menus;
  4418. +     while (!NULL(s_menus))
  4419. +     {
  4420. +     struct Lisp_Cons *menu, *menu_cell;
  4421. +     struct NewMenu *menu1;
  4422. +     menu_cell = XCONS(s_menus);
  4423. +     mkm->nm_Type = NM_TITLE;
  4424. +     menu = XCONS(menu_cell->car);
  4425. +     name = XSTRING(menu->car);
  4426. +     strcpy(strdata, name->data);
  4427. +     mkm->nm_Label = strdata;
  4428. +     strdata += name->size + 1;
  4429. +     mkm->nm_CommKey = 0;
  4430. +     mkm->nm_Flags = 0;
  4431. +     mkm->nm_MutualExclude = 0;
  4432. +     menu1 = mkm++;
  4433. +     menu = XCONS(menu->cdr); /* Check items */
  4434. +     s_items = menu->car;
  4435. +     while (!NULL(s_items))
  4436. +     {
  4437. +         struct Lisp_Cons *item, *item_cell;
  4438. +         item_cell = XCONS(s_items);
  4439. +         mkm->nm_Type = NM_ITEM;
  4440. +         mkm->nm_CommKey = 0;
  4441. +         mkm->nm_Flags = 0;
  4442. +         mkm->nm_MutualExclude = 0;
  4443. +         if (NULL(item_cell->car))
  4444. +         {
  4445. +         mkm->nm_Type = IM_ITEM;
  4446. +         mkm->nm_Label = NM_BARLABEL;
  4447. +         }
  4448. +         else
  4449. +         {
  4450. +         item = XCONS(item_cell->car);
  4451. +         name = XSTRING(item->car);
  4452. +         strcpy(strdata, name->data);
  4453. +         mkm->nm_Label = strdata;
  4454. +         strdata += name->size + 1;
  4455. +         if (!NULL(item->cdr)) /* Only name is necessary */
  4456. +         {
  4457. +             item = XCONS(item->cdr);
  4458. +             /* Expr is ignored */
  4459. +             if (!NULL(item->cdr))
  4460. +             {
  4461. +             item = XCONS(item->cdr);
  4462. +             /* Check shortcut */
  4463. +             if (!NULL(item->car))
  4464. +             {
  4465. +                 mkm->nm_CommKey = strdata;
  4466. +                 strdata[0] = XFASTINT(item->car);
  4467. +                 strdata[1] = '\0';
  4468. +                 strdata += 2;
  4469. +             }
  4470. +             if (!NULL(item->cdr))
  4471. +             {
  4472. +                 item = XCONS(item->cdr);
  4473. +                 if (!NULL(item->car))
  4474. +                 mkm->nm_Flags |= NM_ITEMDISABLED;
  4475. +             }
  4476. +             }
  4477. +         }
  4478. +         }
  4479. +         mkm++;
  4480. +         s_items = item_cell->cdr;
  4481. +     }
  4482. +     if (!NULL(menu->cdr))
  4483. +     {
  4484. +         menu = XCONS(menu->cdr);
  4485. +         if (!NULL(menu->car)) menu1->nm_Flags |= NM_MENUDISABLED;
  4486. +     }
  4487. +     s_menus = menu_cell->cdr;
  4488. +     }
  4489. +     mkm->nm_Type = NM_END;
  4490. +     mkm->nm_Label = 0;
  4491. +     mkm->nm_CommKey = 0;
  4492. +     mkm->nm_Flags = 0;
  4493. +     mkm->nm_MutualExclude = 0;
  4494. +     if (!(emacs_menu = CreateMenus(menudata, TAG_END)))
  4495. +     {
  4496. +     free(emacs_menu_strings);
  4497. +     emacs_menu_strings = 0;
  4498. +     error("Menu couldn't be created");
  4499. +     }
  4500. +     if (!resume_menus()) error("Menu couldn't be layed out");
  4501. +     return Qt;
  4502. + }
  4503. + DEFUN ("amiga-delete-menus", Famiga_delete_menus, Samiga_delete_menus, 0, 0, 0,
  4504. +        "Remove & free menu strip")
  4505. +    ()
  4506. + {
  4507. +     check_intuition();
  4508. +     suspend_menus();
  4509. +     if (emacs_menu) FreeMenus(emacs_menu);
  4510. +     emacs_menu = 0;
  4511. +     if (emacs_menu_strings) free(emacs_menu_strings);
  4512. +     emacs_menu_strings = 0;
  4513. +     return Qt;
  4514. + }
  4515. + void syms_of_amiga_menu(void)
  4516. + {
  4517. +     defsubr(&Samiga_delete_menus);
  4518. +     defsubr(&Samiga_menus);
  4519. + }
  4520. + void init_amiga_menu(void)
  4521. + {
  4522. +     GadToolsBase = OpenLibrary("gadtools.library", 0);
  4523. +     if (!GadToolsBase) _fail("gadtools.library required");
  4524. + }
  4525. + void cleanup_amiga_menu(void)
  4526. + {
  4527. +   suspend_menus();
  4528. +   if (emacs_menu) Famiga_delete_menus();
  4529. +   if (GadToolsBase) CloseLibrary(GadToolsBase);
  4530. + }
  4531. diff -rcP emacs-18.59-fsf/src/amiga_processes.c emacs-18.59-amiga/src/amiga_processes.c
  4532. *** emacs-18.59-fsf/src/amiga_processes.c    Thu Jan  1 00:00:00 1970
  4533. --- emacs-18.59-amiga/src/amiga_processes.c    Sun Nov 22 10:13:02 1992
  4534. ***************
  4535. *** 0 ****
  4536. --- 1,94 ----
  4537. + #include <exec/types.h>
  4538. + #include <exec/execbase.h>
  4539. + #include <exec/memory.h>
  4540. + #include <dos/dos.h>
  4541. + #include <dos/dosextens.h>
  4542. + #include <dos/dostags.h>
  4543. + #include <proto/exec.h>
  4544. + #include <proto/dos.h>
  4545. + #include <clib/alib_protos.h>
  4546. + #include <signal.h>
  4547. + #undef signal
  4548. + #include <ios1.h>
  4549. + #include <string.h>
  4550. + #include <errno.h>
  4551. + #include <stdio.h>
  4552. + #include <internal/vars.h>
  4553. + #include "config.h"
  4554. + #include "lisp.h"
  4555. + #include "amiga.h"
  4556. + #include "emacssignal.h"
  4557. + extern struct ExecBase *SysBase;
  4558. + int amiga_process_stack_size;
  4559. + /* A few emacs support functions */
  4560. + /* ----------------------------- */
  4561. + wait_for_termination (pid)
  4562. +      int pid;
  4563. + {
  4564. +   while (1)
  4565. +     {
  4566. +       sigsetmask (sigmask (SIGCHLD));
  4567. +       if (0 > kill (pid, 0))
  4568. +         {
  4569. +       sigsetmask (SIGEMPTYMASK);
  4570. +       break;
  4571. +     }
  4572. +       sigpause (SIGEMPTYMASK);
  4573. +     }
  4574. + }
  4575. + char *amiga_path(void)
  4576. + {
  4577. +   char *path, *pp, name[128];
  4578. +   int pathsize;
  4579. +   struct CommandLineInterface *cli;
  4580. +   BPTR lock;
  4581. +   long l, *lp, nlen;
  4582. +   pathsize = 128;
  4583. +   path = (char *)xmalloc(pathsize);
  4584. +   strcpy(path, ".");
  4585. +   pp = path + 1;
  4586. +   if (!(cli = (struct CommandLineInterface *)((long)_us->pr_CLI << 2)))
  4587. +     return path;
  4588. +   l = (long)cli->cli_CommandDir;
  4589. +   while (l) {
  4590. +     *pp++ = ',';
  4591. +     l <<= 2;
  4592. +     lp = (long *)l;
  4593. +     lock = (BPTR)*(lp + 1);
  4594. +     NameFromLock(lock, name, 128);
  4595. +     nlen = strlen(name);
  4596. +     if (pp + nlen + 5 >= path + pathsize)
  4597. +       {
  4598. +     char *newpath;
  4599. +     pathsize = 2 * pathsize + nlen;
  4600. +     newpath = (char *)xrealloc(path);
  4601. +     pp = newpath + (pp - path);
  4602. +     path = newpath;
  4603. +       }
  4604. +     memcpy(pp, name, nlen);
  4605. +     pp += nlen;
  4606. +     l = *lp;
  4607. +   }
  4608. +   /* Use of +5 above guarantees that there is enough space for c: */
  4609. +   strcpy(pp, ",c:");
  4610. +   return path;
  4611. + }
  4612. + void syms_of_amiga_processes(void)
  4613. + {
  4614. +   amiga_process_stack_size = 0;
  4615. +   DEFVAR_INT("amiga-process-stack-size", &amiga_process_stack_size,
  4616. +      "Size of stack for called processes. 0 means same size as emacs stack.");
  4617. + }
  4618. diff -rcP emacs-18.59-fsf/src/amiga_rexx.c emacs-18.59-amiga/src/amiga_rexx.c
  4619. *** emacs-18.59-fsf/src/amiga_rexx.c    Thu Jan  1 00:00:00 1970
  4620. --- emacs-18.59-amiga/src/amiga_rexx.c    Sat Jun  5 13:21:16 1993
  4621. ***************
  4622. *** 0 ****
  4623. --- 1,460 ----
  4624. + /* low level ARexx code for use in amiga version of Emacs.
  4625. +    Copyright (C) 1993 Christian E. Hopps.
  4626. + This file is part of GNU Emacs.
  4627. + GNU Emacs is free software; you can redistribute it and/or modify
  4628. + it under the terms of the GNU General Public License as published by
  4629. + the Free Software Foundation; either version 1, or (at your option)
  4630. + any later version.
  4631. + GNU Emacs is distributed in the hope that it will be useful,
  4632. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  4633. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4634. + GNU General Public License for more details.
  4635. + You should have received a copy of the GNU General Public License
  4636. + along with GNU Emacs; see the file COPYING.  If not, write to
  4637. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  4638. + #include "SimpleRexx.h"
  4639. + #include <proto/exec.h>
  4640. + #undef NULL
  4641. + #include "config.h"
  4642. + #include "lisp.h"
  4643. + #include "amiga.h"
  4644. + #define XLRXMSG(x) ((struct LispRexxMsg *) XPNTR((x)))
  4645. + #define XSETLRXMSG(x,v) (XSET((x), Lisp_Int, v))
  4646. + static AREXXCONTEXT far handle;
  4647. + static int amiga_arexx_initialized;
  4648. + /* This structure should be allocated with emacs_malloc() its pointer will be */
  4649. + /* used as an msgid. (emacs XUINT())*/
  4650. + struct LispRexxMsg {
  4651. +   struct MinNode  lrm_Node;              /* A node for tracking messages. */
  4652. +   struct RexxMsg *lrm_Msg;              /* The actual Rexx Msg. */
  4653. +   ULONG  lrm_Flags;
  4654. + };
  4655. + /* Flags for LispRexxMessage indicating what to do with it. */
  4656. + #define LRMF_SENTCMD (1L << 0)              /* this msg originated here. */
  4657. + #define LRMF_DOERRORS (1L << 1)              /* handle error replies */
  4658. + #define LRMF_DORESULTS (1L << 2)          /* handle result strings */
  4659. + struct LispRexxList {
  4660. +     struct MinList lrl_List;
  4661. +     int    lrl_Count;
  4662. + };
  4663. + struct LispRexxList pending;              /* The list of pending */
  4664. +                           /* (outgoing) Rexx Messages. */
  4665. + struct LispRexxList returned;              /* The list of pending */
  4666. +                           /* (outgoing) Rexx Messages */
  4667. +                           /* that have been received. */
  4668. + struct LispRexxList incoming;              /* The message that are */
  4669. +                           /* incoming to Emacs (sent */
  4670. +                           /* from some other rexx host. */
  4671. + /* allocate a rexx message properly */
  4672. + Lisp_Object alloc_rexx_msg(ULONG flags)
  4673. + {
  4674. +     Lisp_Object rm = Qnil;
  4675. +     struct LispRexxMsg *lrm = (struct LispRexxMsg *)malloc(sizeof(*lrm));
  4676. +     if(lrm) {
  4677. +     lrm->lrm_Flags = flags;
  4678. +     XSETLRXMSG(rm,lrm);
  4679. +     return(rm);
  4680. +     }
  4681. +     return(Qnil);
  4682. + }
  4683. + /* free an arexx message allocated with alloc_arexx_msg() */
  4684. + void free_rexx_msg (Lisp_Object rm)
  4685. + {
  4686. +     if(!NULL(rm)) {
  4687. +     void *mem = XLRXMSG(rm);
  4688. +     free(mem);
  4689. +     }
  4690. + }
  4691. + /* The next 2 functions imlement FIFO lists. */
  4692. + /* add LispRexxMsg to a LispRexxLisp Tail. */
  4693. + void add_rexx_msg_to_tail(struct LispRexxList *rl, Lisp_Object rm)
  4694. + {
  4695. +     AddTail((struct List *)rl,(struct Node *)XPNTR(rm));
  4696. +     rl->lrl_Count++;
  4697. + }
  4698. + /* remove LispRexxMsg from head of a LispRexxLisp. */
  4699. + Lisp_Object remove_rexx_msg_from_head(struct LispRexxList *rl)
  4700. + {
  4701. +     Lisp_Object rm = (Lisp_Object)RemHead((struct List *)rl);
  4702. +     if(rm != 0) {
  4703. +     rl->lrl_Count--;
  4704. +     return(rm);
  4705. +     } else {
  4706. +         return Qnil;
  4707. +     }
  4708. + }
  4709. + void remove_rexx_msg(struct LispRexxList *rl, Lisp_Object rm)
  4710. + {
  4711. +     Remove((struct Node *)XPNTR(rm));
  4712. +     rl->lrl_Count--;
  4713. + }
  4714. + /* find a rexx message on a list given an msgid (ptr) */
  4715. + int is_rexx_msgid_on_list(struct LispRexxList *rl,
  4716. +                     Lisp_Object id)
  4717. + {
  4718. +     struct MinNode *mn = rl->lrl_List.mlh_Head;
  4719. +     for(mn; mn->mln_Succ; mn = mn->mln_Succ) {
  4720. +     Lisp_Object cmpid = Qnil;
  4721. +     XSETLRXMSG(cmpid,mn);
  4722. +     if( EQ(cmpid,id)) {
  4723. +         return(1);
  4724. +     }
  4725. +     }
  4726. +     return(0);
  4727. + }
  4728. + Lisp_Object find_rexx_msg_on_list(struct LispRexxList *rl,
  4729. +                   struct RexxMsg *msg)
  4730. + {
  4731. +     Lisp_Object pnt = Qnil;
  4732. +     struct MinNode *mn = rl->lrl_List.mlh_Head;
  4733. +     for(mn; mn->mln_Succ; mn = mn->mln_Succ) {
  4734. +     if( ((struct LispRexxMsg *)mn)->lrm_Msg == msg) {
  4735. +         XSETLRXMSG(pnt,mn);
  4736. +     }
  4737. +     }
  4738. +     return(pnt);
  4739. + }
  4740. + /* This function is given a RexxMsg and it goes and find (or doesn't) the */
  4741. + /* corisponding pending message, removes it from the list and sets up the lisp */
  4742. + /* list for return values.  if it is not found nil is returned. (it deals with */
  4743. + /* the errors for incoming messages properly.  Some thought is needed on how to */
  4744. + /* handle errors from replied sent commands that were not asking for results. */
  4745. + Lisp_Object handle_rexx_msg_replied(struct RexxMsg *msg)
  4746. + {
  4747. +     Lisp_Object rm = find_rexx_msg_on_list(&pending, msg);
  4748. +     if(!NULL(rm)) {
  4749. +     /* Process the command.  If it was requesting results strings handle */
  4750. +     /* them otherwise just delete. */
  4751. +     struct LispRexxMsg *lrm = XLRXMSG(rm);
  4752. +     remove_rexx_msg(&pending, rm);
  4753. +     if(msg->rm_Result1 == 0) {
  4754. +         if(lrm->lrm_Flags & LRMF_DORESULTS) {
  4755. +         /* add to returned so that result can be fetched. */
  4756. +         add_rexx_msg_to_tail(&returned,rm);
  4757. +         } else {
  4758. +         /* simply delete rexx message. */
  4759. +         DeleteARexxMsg(handle,msg);
  4760. +         free_rexx_msg(rm);
  4761. +         }
  4762. +     } else {
  4763. +         /* an error occured with our message. */
  4764. +         if(lrm->lrm_Flags & LRMF_DOERRORS) {
  4765. +         /* add to returned so that error can be fetched. */
  4766. +         add_rexx_msg_to_tail(&returned,rm);
  4767. +         } else {
  4768. +         /* simply delete rexx message. */
  4769. +         DeleteARexxMsg(handle,msg);
  4770. +         free_rexx_msg(rm);
  4771. +         }
  4772. +     }
  4773. +     } else {
  4774. +     /* This should never happen we received a rexx message reply */
  4775. +     /* that we never sent out. */
  4776. +     DeleteARexxMsg(handle,msg);
  4777. +     }
  4778. + }
  4779. + /* This function takes incoming messages and place them on the incoming msg */
  4780. + /* list.  */
  4781. + Lisp_Object handle_rexx_msg_received(struct RexxMsg *msg)
  4782. + {
  4783. +     Lisp_Object rm = alloc_rexx_msg(LRMF_DORESULTS|LRMF_DOERRORS);
  4784. +     if(!NULL(rm)) {
  4785. +     /* Add message to incoming list. */
  4786. +     struct LispRexxMsg *lrm = XLRXMSG(rm);
  4787. +     lrm->lrm_Msg = msg;              /* set msg pointer. */
  4788. +     add_rexx_msg_to_tail(&incoming,rm);
  4789. +     } else {
  4790. +     /* This should never happen we received a rexx message but ran out of */
  4791. +     /* memory.  Set last error msg. and reply with fail. */
  4792. +     SetARexxLastError(handle, msg, "Out of emacs memory.");
  4793. +     ReplyARexxMsg(handle, msg, 0, 20);
  4794. +     }
  4795. + }
  4796. + /* Almost the same as old one, but we now call handle_pending_arexx_reply() for */
  4797. + /* replied messages that we sent, so that we can setup result strings and such. */
  4798. + int check_arexx(int force, int kbd)
  4799. + {
  4800. +     struct RexxMsg *msg;
  4801. +     int msg_received = FALSE;
  4802. +     while (msg = GetARexxMsg(handle)) {
  4803. +     msg_received = TRUE;
  4804. +     if(msg->rm_Node.mn_Node.ln_Type == NT_REPLYMSG)    {
  4805. +         /* This is a reply to a rexx command we send out. */
  4806. +         handle_rexx_msg_replied(msg);
  4807. +     } else {
  4808. +         handle_rexx_msg_received(msg);
  4809. +     }
  4810. +     }
  4811. +     if ((kbd && amiga_arexx_initialized)) {
  4812. +     /* if we got a message or we have some out, or we have some waiting to */
  4813. +     /* be processes then enque the Key sequence that will call the rexx */
  4814. +     /* message handler.  We obviously don't do this for returned commands :^) */
  4815. +     if ((msg_received || force && incoming.lrl_Count > 0) &&
  4816. +         get_ttycount() == 0) {
  4817. +         enque(AMIGASEQ, FALSE); enque('X', FALSE);
  4818. +     }
  4819. +     }
  4820. +     return msg_received;
  4821. + }
  4822. + DEFUN ("amiga-arexx-wait", Famiga_arexx_wait, Samiga_arexx_wait, 0, 0, 0,
  4823. +        "Wait for an ARexx event (command or reply) before proceeding.")
  4824. +     ()
  4825. + {
  4826. +     while (!check_arexx(FALSE, FALSE)) Wait(ARexxSignal(handle));
  4827. + }
  4828. + DEFUN ("amiga-arexx-check-command",
  4829. +        Famiga_arexx_check_command, Samiga_arexx_check_command, 1, 1, 0,
  4830. +        "Return t if command ID has finished, nil otherwise.")
  4831. +     (id)
  4832. + Lisp_Object id;
  4833. + {
  4834. +     CHECK_NUMBER(id,0);
  4835. +     if(is_rexx_msgid_on_list(&pending,id)) {
  4836. +     /* still on pending return false. */
  4837. +     return Qnil;
  4838. +     } else if(is_rexx_msgid_on_list(&returned,id)) {
  4839. +     /* is waiting to be processed return true. */
  4840. +     return Qt;
  4841. +     }
  4842. +     /* is nowhere to be found. error. */
  4843. +     error("id not found.");
  4844. +     return Qnil;
  4845. + }
  4846. + DEFUN ("amiga-arexx-get-next-msg", Famiga_arexx_get_next_msg,
  4847. +        Samiga_get_next_msg, 0, 0, 0,
  4848. + "Returns the oldest arexx msg sent to emacs rexx port.\n\
  4849. + When you are through with this message call (amiga-arexx-reply).\n\
  4850. + if the msg is not replied this function will continue to\n\
  4851. + return that msg until it has been replied to.")
  4852. +   ()
  4853. + {
  4854. +     struct RexxMsg *rmsg;
  4855. +     check_arexx(FALSE, FALSE);
  4856. +     if (incoming.lrl_Count) {
  4857. +     struct RexxMsg *msg = ((struct LispRexxMsg *)
  4858. +                    incoming.lrl_List.mlh_Head)->lrm_Msg;
  4859. +     return build_string(ARG0(msg));
  4860. +     }
  4861. +     /* nothing to be gotten. */
  4862. +     return Qnil;
  4863. + }
  4864. + DEFUN("amiga-arexx-get-msg-results", Famiga_arexx_get_msg_results,
  4865. +       Samiga_arexx_get_msg_results, 1,1,0,
  4866. + "Returns the results from MSGID. will be a list of the form:\n\
  4867. +   (msgid resultcode secondary)\n\n\
  4868. + If resultcode is 0 then secondary will be a string or nil.\n\
  4869. + else resulcode will be greater than 0 and secondary will be\n\
  4870. + an error-code (int).\n\n\
  4871. + If MSGID has not yet completed nil is returned.\n\
  4872. + if MSGID has been dealt with or is invalid and error will occur.")
  4873. +     (msgid)
  4874. + Lisp_Object msgid;
  4875. + {
  4876. +     CHECK_NUMBER(msgid,0);
  4877. +     if(is_rexx_msgid_on_list(&returned,msgid)) {
  4878. +     /* msgid has completed build list and delete LispRexxMsg. */
  4879. +     struct LispRexxMsg *lrm = XLRXMSG(msgid);
  4880. +     Lisp_Object rc, error_or_string, ret;
  4881. +     struct RexxMsg *msg = lrm->lrm_Msg;
  4882. +     remove_rexx_msg(&returned,msgid);
  4883. +     rc = make_number(msg->rm_Result1);
  4884. +     if(msg->rm_Result1 == 0) {
  4885. +         error_or_string = msg->rm_Result2 ? build_string(msg->rm_Result2) : 0;
  4886. +     } else {
  4887. +         /* error occurred */
  4888. +         error_or_string = make_number(msg->rm_Result2); /* save error code. */
  4889. +     }
  4890. +     free_rexx_msg(msgid);              /* free our rexx msg. */
  4891. +     DeleteARexxMsg(handle,msg);          /* free ARexx msg proper */
  4892. +     /* build lisp list. */
  4893. +     ret = Fcons( msgid, Fcons( rc, Fcons(error_or_string, Qnil)));
  4894. +     if(NULL(ret)) {
  4895. +         error("Couldn't get memory.");
  4896. +     }
  4897. +     return(ret);
  4898. +     } else if(is_rexx_msgid_on_list(&pending,msgid)) {
  4899. +     return Qnil;                  /* this msgid has not yet completed. */
  4900. +     } else {
  4901. +     error("Unknown MSGID.");
  4902. +     return Qnil;
  4903. +     }
  4904. + }
  4905. + DEFUN ("amiga-arexx-reply", Famiga_arexx_reply, Samiga_arexx_reply,
  4906. +        2, 2, 0,
  4907. + "Replies to the first arexx message (the one got via amiga-arexx-get-event)\n\
  4908. + with RC as return code.\n\
  4909. + If RC=0, TEXT is the result, otherwise it is the error text. It can be nil.")
  4910. +     (rc, text)
  4911. + Lisp_Object rc, text;
  4912. + {
  4913. +     int retcode, ok = TRUE;
  4914. +     char *result;
  4915. +     struct RexxMsg *rmsg;
  4916. +     Lisp_Object rm = remove_rexx_msg_from_head(&incoming);
  4917. +     struct LispRexxMsg *lrm = XLRXMSG(rm);
  4918. +     if (NULL(rm))
  4919. +     error("No ARexx message to reply to.");
  4920. +     rmsg = lrm->lrm_Msg;
  4921. +     CHECK_NUMBER(rc, 0);
  4922. +     retcode = XINT(rc);
  4923. +     if (!NULL (text)) {
  4924. +     CHECK_STRING(text, 0);
  4925. +     result = XSTRING (text)->data;
  4926. +     } else {
  4927. +     result = 0;
  4928. +     }
  4929. +     if (retcode && result)
  4930. +     ok = SetARexxLastError(handle, rmsg, result);
  4931. +     ReplyARexxMsg(handle, rmsg, result, retcode);
  4932. +     if (!ok)
  4933. +     error("Failed to set ARexx error message.");
  4934. +     return Qnil;
  4935. + }
  4936. + Lisp_Object send_rexx_command(Lisp_Object str, Lisp_Object as_file,
  4937. +                   ULONG flags)
  4938. + {
  4939. +     struct RexxMsg *rmsg;
  4940. +     int i;
  4941. +     Lisp_Object id, rm;
  4942. +     struct LispRexxMsg *lrm;
  4943. +     rm = alloc_rexx_msg(flags);
  4944. +     if(NULL(rm)) {
  4945. +     error("Failed to send command to ARexx.");
  4946. +     return Qnil;
  4947. +     }
  4948. +     CHECK_STRING (str, 0);
  4949. +     if (!(rmsg = SendARexxMsg(handle, XSTRING (str)->data,!NULL (as_file),
  4950. +                   (flags & LRMF_DORESULTS ? 1 : 0)))) {
  4951. +     free_rexx_msg(rm);
  4952. +     error("Failed to send command to ARexx.");
  4953. +     return Qnil;
  4954. +     }
  4955. +     lrm = XLRXMSG(rm);
  4956. +     lrm->lrm_Msg = rmsg;              /* set rexx message pointer. */
  4957. +     add_rexx_msg_to_tail(&pending,rm);          /* add to pending list. */
  4958. +     return(rm);
  4959. + }
  4960. + DEFUN ("amiga-arexx-send-command", Famiga_arexx_send_command,
  4961. +        Samiga_arexx_send_command, 1, 2, 0,
  4962. + "Sends a command to ARexx for execution.\n\
  4963. + If the second arg is non-nil, the command is directly interpreted.\n\
  4964. + Returns an integer that uniquely identifies this message.  This must\n\
  4965. + then be used to get the results from the command.\n\
  4966. + NOTE: this is very different from old way things worked.\n\
  4967. +       earlier versions of emacs discarded successful results\n\
  4968. +       and errors always got replied to becuase they caused failures\n\
  4969. +       Neither of these are true now.\
  4970. + This function is also no longer interactive.\n\
  4971. + Use (amiga-arexx-do-command)\n")
  4972. +     (str, as_file)
  4973. + Lisp_Object str, as_file;
  4974. + {
  4975. +     return(send_rexx_command(str,as_file,
  4976. +                  LRMF_DORESULTS|
  4977. +                  LRMF_DOERRORS|
  4978. +                  LRMF_SENTCMD));
  4979. + }
  4980. + void init_amiga_rexx(void)
  4981. + {
  4982. +     extern ULONG inputsig;
  4983. +     int i;
  4984. +     handle = InitARexx("Emacs", "elx");
  4985. +     inputsig |= ARexxSignal(handle);
  4986. +     /* init exec lists. */
  4987. +     NewList((struct List *)&incoming.lrl_List);
  4988. +     incoming.lrl_Count = 0;
  4989. +     NewList((struct List *)&pending.lrl_List);
  4990. +     pending.lrl_Count = 0;
  4991. +     NewList((struct List *)&returned.lrl_List);
  4992. +     returned.lrl_Count = 0;
  4993. + }
  4994. + void cleanup_amiga_rexx(void)
  4995. + {
  4996. +     /* Delete and reply all rexx messages we have gotten. */
  4997. +     Lisp_Object rm = remove_rexx_msg_from_head(&returned);
  4998. +     while(!NULL(rm)) {
  4999. +     struct LispRexxMsg *lrm = XLRXMSG(rm);
  5000. +     DeleteARexxMsg(handle,lrm->lrm_Msg);
  5001. +     free_rexx_msg(rm);
  5002. +     rm = remove_rexx_msg_from_head(&returned);
  5003. +     }
  5004. +     rm = remove_rexx_msg_from_head(&incoming);
  5005. +     while(!NULL(rm)) {
  5006. +     struct LispRexxMsg *lrm = XLRXMSG(rm);
  5007. +     ReplyARexxMsg(handle, lrm->lrm_Msg, 0, 20);
  5008. +     free_rexx_msg(rm);
  5009. +     rm = remove_rexx_msg_from_head(&incoming);
  5010. +     }
  5011. +     /* Free the rest of rexx, will wait for pending msgs to return */
  5012. +     FreeARexx(handle);
  5013. + }
  5014. + void syms_of_amiga_rexx(void)
  5015. + {
  5016. +     DEFVAR_BOOL ("amiga-arexx-initialized", &amiga_arexx_initialized,
  5017. +          "Set this to t when Emacs is ready to respond to ARexx messages.\n"
  5018. +          "(ie C-\ X causes all pending ARexx messages to be answered)");
  5019. +     amiga_arexx_initialized = 0;
  5020. +     defsubr(&Samiga_arexx_send_command);
  5021. +     defsubr(&Samiga_arexx_reply);
  5022. +     defsubr(&Samiga_get_next_msg);
  5023. +     defsubr(&Samiga_arexx_get_msg_results);
  5024. +     defsubr(&Samiga_arexx_check_command);
  5025. +     defsubr(&Samiga_arexx_wait);
  5026. + }
  5027. diff -rcP emacs-18.59-fsf/src/amiga_screen.c emacs-18.59-amiga/src/amiga_screen.c
  5028. *** emacs-18.59-fsf/src/amiga_screen.c    Thu Jan  1 00:00:00 1970
  5029. --- emacs-18.59-amiga/src/amiga_screen.c    Tue Aug 31 18:16:14 1993
  5030. ***************
  5031. *** 0 ****
  5032. --- 1,1396 ----
  5033. + #include "config.h"
  5034. + #undef NULL
  5035. + #include "lisp.h"
  5036. + #include "termchar.h"
  5037. + #include "dispextern.h"
  5038. + #include <stdio.h>
  5039. + #include <string.h>
  5040. + #include <stddef.h>
  5041. + #include <internal/devices.h>
  5042. + #include <internal/vars.h>
  5043. + #define min(x,y) ((x) > (y) ? (y) : (x))
  5044. + #define max(x,y) ((x) < (y) ? (y) : (x))
  5045. + #undef LONGBITS
  5046. + #include <exec/types.h>
  5047. + #include <exec/interrupts.h>
  5048. + #include <devices/input.h>
  5049. + #include <devices/inputevent.h>
  5050. + #include <intuition/intuitionbase.h>
  5051. + #include <intuition/intuition.h>
  5052. + #include <devices/conunit.h>
  5053. + #include <devices/inputevent.h>
  5054. + #include <graphics/gfxbase.h>
  5055. + #include <graphics/gfxmacros.h>
  5056. + #include <utility/hooks.h>
  5057. + #include <workbench/startup.h>
  5058. + #include <workbench/workbench.h>
  5059. + #include <proto/exec.h>
  5060. + #include <proto/dos.h>
  5061. + #include <proto/intuition.h>
  5062. + #include <proto/graphics.h>
  5063. + #include <proto/console.h>
  5064. + #include <proto/diskfont.h>
  5065. + #include <proto/wb.h>
  5066. + /* this is defined for those unlucky enough
  5067. +  * not to have the 3.0 headers  -ch3/16/93. */
  5068. + #ifndef WA_NewLookMenus
  5069. + #define WA_NewLookMenus (WA_Dummy + 0x30)
  5070. + #endif
  5071. + #include "amiga.h"
  5072. + #define SHIFT_MASK (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  5073. + #define CONTROL_MASK IEQUALIFIER_CONTROL
  5074. + #define META_MASK IEQUALIFIER_LALT
  5075. + struct GfxBase *GfxBase;
  5076. + struct IntuitionBase *IntuitionBase;
  5077. + struct Library *DiskfontBase, *KeymapBase, *WorkbenchBase;
  5078. + static char intkey_code, intkey_qualifier;
  5079. + static struct IOStdReq *input_req;
  5080. + static struct Interrupt int_handler_hook;
  5081. + static int hooked;
  5082. + static struct MsgPort *wbport;
  5083. + static struct AppWindow *emacs_app_win;
  5084. + static struct AppIcon *emacs_icon;
  5085. + struct Library *ConsoleDevice;
  5086. + static struct TextFont *font;
  5087. + static int font_opened;
  5088. + /* The reset string resets the console, turns off scrolling and sets up
  5089. +    the foreground & background colors. */
  5090. + #define CONSOLE_RESET "\x1b""c\x9b>1l\x9b""3%d;4%d;>%dm"
  5091. + static char reset_string[20]; /* Must be big enough for
  5092. +               printf(CONSOLE_RESET, foreground, background, background);
  5093. +               (0 <= foreground, background <= 7) */
  5094. + /* These are the pen numbers for emacs window's base colors */
  5095. + int foreground = 1, background = 0;
  5096. + /* Current window, and its main characteristics */
  5097. + struct Window *emacs_win;
  5098. + WORD emacs_x = 0, emacs_y = 0, emacs_w = 640, emacs_h = 200;
  5099. + char *emacs_screen_name;
  5100. + char emacs_screen_name_storage[MAXPUBSCREENNAME+1];
  5101. + int emacs_backdrop = 0;        /* Use backdrop window ? */
  5102. + /* Current window size: */
  5103. + #define EMACS_X() (emacs_win ? emacs_win->LeftEdge : emacs_x)
  5104. + #define EMACS_Y() (emacs_win ? emacs_win->TopEdge : emacs_y)
  5105. + #define EMACS_W() (emacs_win ? emacs_win->Width : emacs_w)
  5106. + #define EMACS_H() (emacs_win ? emacs_win->Height : emacs_h)
  5107. + /* used for setting the color of standout text  -ch3/16/93. */
  5108. + int inverse_fill_pen = 8, inverse_text_pen = 8;
  5109. + /* IO request for all console io. */
  5110. + static struct IOStdReq *emacs_console;
  5111. + /* a storage area for the name of the screen last opened on */
  5112. + #define emacs_icon_width 57
  5113. + #define emacs_icon_height 55
  5114. + #define emacs_icon_num_planes 1
  5115. + #define emacs_icon_words_per_plane 220
  5116. + UWORD chip emacs_icon_data[1][55][4] = {
  5117. +   {
  5118. +     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  5119. +     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  5120. +     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x6000,
  5121. +     0x0000,0x0000,0x0060,0x6000,0x0000,0x0000,0x0fff,0xe000,
  5122. +     0x0000,0x0000,0x1800,0x2000,0x0000,0x0000,0x13ff,0xa000,
  5123. +     0x0000,0x0000,0x1400,0xa000,0x0000,0x0000,0x3600,0xa000,
  5124. +     0x0000,0x0000,0x0000,0xa000,0x0000,0x0000,0x0c00,0xa000,
  5125. +     0x0000,0x0000,0x1e00,0xa000,0x0000,0x0000,0x0c00,0xa000,
  5126. +     0x0000,0x0000,0x0000,0xa000,0x0000,0x0000,0x2100,0xa000,
  5127. +     0x0000,0x0000,0x3300,0xa000,0x0000,0x0000,0x0c00,0xa000,
  5128. +     0x003f,0xffff,0xffff,0xb000,0x001f,0xffff,0xffff,0x8000,
  5129. +     0x004e,0x0000,0x0001,0xf000,0x00c6,0x00f0,0x0001,0x8000,
  5130. +     0x00c6,0x0100,0x0001,0x8000,0x0006,0x0103,0x9201,0x8000,
  5131. +     0x0006,0x013a,0x5201,0x8000,0x00c6,0x010a,0x5201,0x8000,
  5132. +     0x00c6,0x010a,0x5601,0x8000,0x0086,0x00f2,0x4a01,0x8000,
  5133. +     0x0006,0x0000,0x0001,0x8000,0x0046,0x0000,0x0001,0x8000,
  5134. +     0x00c6,0x7c00,0x0001,0x8000,0x00c6,0x4000,0x0001,0x8000,
  5135. +     0x0006,0x41d8,0xc319,0x8000,0x0006,0x7925,0x24a1,0x8000,
  5136. +     0x00c6,0x4125,0x2419,0x8000,0x01c6,0x4125,0x2485,0x8000,
  5137. +     0x0086,0x7d24,0xd319,0x8000,0x0007,0x0000,0x0003,0x8000,
  5138. +     0x0003,0xffe3,0xffff,0x0000,0x0081,0xfff7,0xfffe,0x0000,
  5139. +     0x01c0,0x0036,0x0000,0x0000,0x0180,0x0014,0x0f80,0x0000,
  5140. +     0x0000,0x0014,0x1040,0x0000,0x0000,0x0014,0x2720,0x0000,
  5141. +     0x0000,0x0012,0x28a0,0x0000,0x0080,0x000a,0x48a0,0x0000,
  5142. +     0x01c0,0x0009,0x90a0,0x0000,0x0180,0x0004,0x20a0,0x0000,
  5143. +     0x0000,0x0003,0xc0a0,0x0000,0x0000,0x0000,0x00a0,0x0000,
  5144. +     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  5145. +     0x0000,0x0000,0x0000,0x0000
  5146. +   },
  5147. + };
  5148. + struct Image far emacs_icon_image = {
  5149. +   0, 0,
  5150. +   emacs_icon_width, emacs_icon_height, emacs_icon_num_planes,
  5151. +   (UWORD *)emacs_icon_data,
  5152. +   3, 0,
  5153. +   0
  5154. + };
  5155. + static struct DiskObject far emacs_icon_object = {
  5156. +   0, 0,
  5157. +   { 0, 0, 0, emacs_icon_width, emacs_icon_height, 0, 0, 0, (APTR)&emacs_icon_image },
  5158. +   0, 0, 0,
  5159. +   NO_ICON_POSITION, NO_ICON_POSITION
  5160. + };
  5161. + static struct Hook background_hook;
  5162. + #define EVENTSIZE 32
  5163. + static struct event {
  5164. +   ULONG class;
  5165. +   UWORD code, qual;
  5166. +   WORD x, y;
  5167. + } events[EVENTSIZE];
  5168. + static int event_num, event_in, event_out;
  5169. + static struct wbevent {
  5170. +   struct wbevent *next;
  5171. +   char file[1];
  5172. + } *wbevents;
  5173. + Lisp_Object Vamiga_mouse_pos;
  5174. + Lisp_Object Vamiga_mouse_item;
  5175. + extern Lisp_Object MouseMap;
  5176. + int amiga_remap_bsdel;
  5177. + int amiga_remap_numeric_keypad;
  5178. + int amiga_mouse_initialized;
  5179. + int amiga_wb_initialized;
  5180. + int emacs_iconified;
  5181. + static int amiga_pos_x(int x)
  5182. + {
  5183. +   return (x - emacs_win->BorderLeft) / emacs_win->RPort->Font->tf_XSize;
  5184. + }
  5185. + static int amiga_pos_y(int y)
  5186. + {
  5187. +   return (y - emacs_win->BorderTop) / emacs_win->RPort->Font->tf_YSize;
  5188. + }
  5189. + static void amiga_change_size(void)
  5190. + {
  5191. +   int new_height = amiga_pos_y(emacs_win->Height - emacs_win->BorderBottom);
  5192. +   int new_width = amiga_pos_x(emacs_win->Width - emacs_win->BorderRight);
  5193. +   /* Hack to force redisplay */
  5194. +   if (screen_height == new_height) screen_height--;
  5195. +   /* I consider that refreshes are possible during a select, which is
  5196. +      true for the current state of emacs */
  5197. +   change_screen_size(new_height, new_width, 0, !selecting && !waiting_for_input, 1);
  5198. + }
  5199. + /* Get terminal size from system.
  5200. +    Store number of lines into *heightp and width into *widthp.
  5201. +    If zero or a negative number is stored, the value is not valid.  */
  5202. + void get_window_size (widthp, heightp)
  5203. +      int *widthp, *heightp;
  5204. + {
  5205. +   if (emacs_win)
  5206. +     {
  5207. +       *heightp = amiga_pos_y(emacs_win->Height - emacs_win->BorderBottom);
  5208. +       *widthp = amiga_pos_x(emacs_win->Width - emacs_win->BorderRight);
  5209. +     }
  5210. +   else
  5211. +     {
  5212. +       *heightp = 0;
  5213. +       *widthp = 0;
  5214. +     }
  5215. + }
  5216. + static int set_min_size(struct Window *win, struct TextFont *font,
  5217. +             WORD *minw, WORD *minh)
  5218. + {
  5219. +   *minw = 11 * font->tf_XSize + win->BorderLeft + win->BorderRight;
  5220. +   *minh = 4 * font->tf_YSize + win->BorderTop + win->BorderBottom;
  5221. +   return (int)WindowLimits(win, *minw, *minh, 0, 0);
  5222. + }
  5223. + struct fill
  5224. + {
  5225. +   struct Layer *layer;
  5226. +   struct Rectangle bounds;
  5227. +   WORD offsetx, offsety;
  5228. + };
  5229. + /* __interrupt disables stack checking.   -ch3/19/93. */
  5230. + static ULONG __asm __saveds __interrupt
  5231. + fill_background(register __a2 struct RastPort *obj,
  5232. +         register __a1 struct fill *msg)
  5233. + {
  5234. +   struct Layer *l;
  5235. +   SetAPen(obj, background);
  5236. +   SetDrMd(obj, JAM1);
  5237. +   SetAfPt(obj, 0, 0);
  5238. +   SetWrMsk(obj, 0xff);
  5239. +   /* Gross hack starts here */
  5240. +   l = obj->Layer;
  5241. +   obj->Layer = 0;
  5242. +   /* Stops */
  5243. +   RectFill(obj, msg->bounds.MinX, msg->bounds.MinY,
  5244. +        msg->bounds.MaxX, msg->bounds.MaxY);
  5245. +   /* Starts again */
  5246. +   obj->Layer = l;
  5247. +   /* And finally dies */
  5248. +   return 0;
  5249. + }
  5250. + static void clear_window(void)
  5251. + {
  5252. +   SetAPen(emacs_win->RPort, background);
  5253. +   RectFill(emacs_win->RPort, emacs_win->BorderLeft, emacs_win->BorderTop,
  5254. +        emacs_win->Width - emacs_win->BorderRight - 1,
  5255. +        emacs_win->Height - emacs_win->BorderBottom - 1);
  5256. + }
  5257. + static int make_reset_string(void)
  5258. + {
  5259. +   sprintf(reset_string, CONSOLE_RESET, foreground, background, background);
  5260. + }
  5261. + void reset_window(void)
  5262. + {
  5263. +   make_reset_string();
  5264. +   if (emacs_win)
  5265. +     {
  5266. +       screen_puts (reset_string, strlen(reset_string));
  5267. +       clear_window();
  5268. +       amiga_change_size ();
  5269. +     }
  5270. + }
  5271. + static void close_app_win(void)
  5272. + {
  5273. +   if (emacs_app_win)
  5274. +     {
  5275. +       struct AppMessage *msg;
  5276. +       RemoveAppWindow(emacs_app_win); /* What can I do if it fails ?! */
  5277. +       while (msg = (struct AppMessage *)GetMsg(wbport)) ReplyMsg(msg);
  5278. +     }
  5279. + }
  5280. + static int close_emacs_window(void)
  5281. + {
  5282. +   close_app_win();
  5283. +   inputsig &= ~(1L << emacs_win->UserPort->mp_SigBit);
  5284. +   _device_close(emacs_console);
  5285. +   if(emacs_win)
  5286. +     {
  5287. +       /* put title back the way it should be   -ch3/19/93. */
  5288. +       ShowTitle(emacs_win->WScreen, !emacs_backdrop);
  5289. +     }
  5290. +   CloseWindow(emacs_win);
  5291. +   emacs_console = 0;
  5292. +   emacs_win = 0;
  5293. +   ConsoleDevice = 0;
  5294. + }
  5295. + /* We need this function becuase we do not always have the string
  5296. +  * for the screen we opened on. for example LockPubScreen(NULL);
  5297. +  * This function will get the name by looping through all public
  5298. +  * screens looking for the one that matches ours. -ch3/20/93 */
  5299. + char *get_screen_name(struct Screen *this, char *namebuf)
  5300. + {
  5301. +   struct PubScreenNode *pubscreens =
  5302. +     (struct PubScreenNode *)LockPubScreenList()->lh_Head;
  5303. +   while (pubscreens->psn_Node.ln_Succ)
  5304. +     {
  5305. +       if (pubscreens->psn_Screen == this)
  5306. +     {
  5307. +       strcpy(namebuf, pubscreens->psn_Node.ln_Name);
  5308. +       UnlockPubScreenList();
  5309. +       return namebuf;
  5310. +     }
  5311. +       pubscreens = (struct PubScreenNode *)pubscreens->psn_Node.ln_Succ;
  5312. +     }
  5313. +   /* Failed to find screen */
  5314. +   namebuf[0] = '\0';
  5315. +   UnlockPubScreenList();
  5316. +   return 0;
  5317. + }
  5318. + /* added two parameters to eliminate the need for the global
  5319. +  * which was causing some unwanted effect (bugs). -ch3/19/93 */
  5320. + static enum { ok, no_screen, no_window }
  5321. + open_emacs_window(UWORD x, UWORD y, UWORD w, UWORD h, int backdrop,
  5322. +           char *pubscreen_name)
  5323. +      /* Open or reopen emacs window */
  5324. + {
  5325. +   WORD minw, minh;
  5326. +   struct Screen *new_screen;
  5327. +   struct Window *new_win;
  5328. +   struct IOStdReq *new_console;
  5329. +   int no_backdrop = !backdrop;
  5330. +   new_screen = LockPubScreen(pubscreen_name);
  5331. +   if (!new_screen)
  5332. +     return no_screen;
  5333. +   /* removed newwindow structure, and added as tag
  5334. +    * items so that we can change them easier. -ch3/16/93. */
  5335. +   new_win = OpenWindowTags(0, WA_Left, x, WA_Top, y,
  5336. +                   WA_Width, w, WA_Height, h,    /* Static items */
  5337. +                   WA_AutoAdjust, 1, WA_NewLookMenus, 1,
  5338. +                   WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_RAWKEY |
  5339. +                             IDCMP_MOUSEBUTTONS| IDCMP_NEWSIZE |
  5340. +                             IDCMP_MENUPICK | IDCMP_MENUHELP,
  5341. +                   WA_PubScreen, new_screen,
  5342. +                   WA_BackFill, &background_hook,
  5343. +                   WA_MenuHelp, 1, WA_Activate, 1,
  5344. +                   WA_SimpleRefresh, 1,
  5345. +                   WA_MaxWidth, -1, WA_MaxHeight, -1,
  5346. +                   WA_Backdrop, backdrop,    /* changing items */
  5347. +                   WA_Borderless, backdrop,
  5348. +                   WA_CloseGadget, no_backdrop,
  5349. +                   WA_SizeGadget, no_backdrop,
  5350. +                   WA_DragBar, no_backdrop,
  5351. +                   WA_DepthGadget, no_backdrop,
  5352. +                   WA_Title, no_backdrop ?
  5353. +                    "GNU Emacs 18.59, Amiga port "VERS : 0,
  5354. +                               TAG_END);
  5355. +   UnlockPubScreen(0L, new_screen);
  5356. +   if (new_win)
  5357. +     {
  5358. +       /* if emacs_backdrop then the screen title will show BEHIND the window
  5359. +      -ch3/16/93. */
  5360. +       ShowTitle(new_screen, !emacs_backdrop);
  5361. +       SetFont(new_win->RPort, font);
  5362. +       if (set_min_size(new_win, font, &minw, &minh) &&
  5363. +       (new_console = (struct IOStdReq *)
  5364. +        _device_open("console.device", CONU_CHARMAP, CONFLAG_NODRAW_ON_NEWSIZE,
  5365. +             (APTR)new_win, sizeof(*new_win),
  5366. +             sizeof(struct IOStdReq))))
  5367. +     {
  5368. +       inputsig |= 1L << new_win->UserPort->mp_SigBit;
  5369. +       ConsoleDevice = (struct Library *)new_console->io_Device;
  5370. +       emacs_app_win = AddAppWindowA(0, 0, new_win, wbport, 0);
  5371. +       /* Copy the info into permanent storage */
  5372. +       emacs_win = new_win;
  5373. +       emacs_console = new_console;
  5374. +       /* fetch the name of the current screen -ch3/19/93 */
  5375. +       emacs_screen_name = get_screen_name(emacs_win->WScreen,
  5376. +                           emacs_screen_name_storage);
  5377. +       emacs_backdrop = backdrop;
  5378. +       reset_window();
  5379. +       return ok;
  5380. +     }
  5381. +       CloseWindow(new_win);
  5382. +     }
  5383. +   return no_window;
  5384. + }
  5385. + void force_window(void)
  5386. + {
  5387. +   if (!emacs_win && !emacs_iconified)
  5388. +     {
  5389. +       if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
  5390. +                 emacs_screen_name) != ok)
  5391. +     {
  5392. +       /* Try to return to defaults (Workbench, etc) */
  5393. +       if (open_emacs_window(0, 0, 640, 200, 0, 0) != ok)
  5394. +           _fail("I've lost my window ! Exiting.");
  5395. +     }
  5396. +       resume_menus();
  5397. +     }
  5398. + }
  5399. + /* returns:
  5400. +  *    -2 if msg is not class RAWKEY
  5401. +  *    same as RawKeyConvert otherwise:
  5402. +  *    buffer length if <= kbsize
  5403. +  *    -1 else
  5404. +  */
  5405. + static DeadKeyConvert(struct IntuiMessage *msg, UBYTE *kbuffer, int kbsize,
  5406. +               struct KeyMap *kmap)
  5407. + {
  5408. +   static struct InputEvent ievent = {0, IECLASS_RAWKEY, 0, 0, 0};
  5409. +   int extra = 0, res;
  5410. +   if (msg->Class != RAWKEY) return (-2);
  5411. +   /* Do some keymapping ourselves to make emacs users happy */
  5412. +   /* Ctrl-space becomes Ctrl-@ */
  5413. +   if (msg->Code == 0x40 && msg->Qualifier & CONTROL_MASK)
  5414. +     {
  5415. +       *kbuffer = 0;
  5416. +       return 1;
  5417. +     }
  5418. +   /* Backspace becomes DEL */
  5419. +   if (msg->Code == 0x41 && amiga_remap_bsdel)
  5420. +     {
  5421. +       *kbuffer = 0177;
  5422. +       return 1;
  5423. +     }
  5424. +   /* And DEL becomes CTRL-D */
  5425. +   if (msg->Code == 0x46 && amiga_remap_bsdel)
  5426. +     {
  5427. +       *kbuffer = 04;
  5428. +       return 1;
  5429. +     }
  5430. +   /* Stick numeric pad prefix in front of numeric keypad chars */
  5431. +   if (msg->Qualifier & IEQUALIFIER_NUMERICPAD && amiga_remap_numeric_keypad)
  5432. +     {
  5433. +       *kbuffer++ = 'x' & 037;
  5434. +       *kbuffer++ = '^' & 037;
  5435. +       *kbuffer++ = 'K';
  5436. +       kbsize -= 3;
  5437. +       extra = 3;
  5438. +     }
  5439. +   /* pack input event */
  5440. +   ievent.ie_Code = msg->Code;
  5441. +   /* Ignore meta in decoding keys */
  5442. +   ievent.ie_Qualifier = msg->Qualifier & ~META_MASK;
  5443. +   /* get previous codes from location pointed to by IAddress
  5444. +    *  this pointer is valid until IntuiMessage is replied.
  5445. +    */
  5446. +   ievent.ie_position.ie_addr = *((APTR *)msg->IAddress);
  5447. +   ievent.ie_position.ie_dead.ie_prev1DownQual &= ~META_MASK;
  5448. +   ievent.ie_position.ie_dead.ie_prev2DownQual &= ~META_MASK;
  5449. +   res = RawKeyConvert(&ievent, kbuffer, kbsize, kmap);
  5450. +   return res ? res + extra : 0;
  5451. + }
  5452. + void add_wbevent(struct WBArg *wbarg)
  5453. + {
  5454. +   char filename[256];
  5455. +   if (wbarg->wa_Lock && NameFromLock(wbarg->wa_Lock, filename, 256))
  5456. +     {
  5457. +       struct wbevent *event;
  5458. +       if (wbarg->wa_Name) AddPart(filename, wbarg->wa_Name, 256);
  5459. +       if (event = (struct wbevent *)malloc(offsetof(struct wbevent, file) +
  5460. +                        strlen(filename) + 1))
  5461. +     {
  5462. +       event->next = wbevents;
  5463. +       strcpy(event->file, filename);
  5464. +       wbevents = event;
  5465. +     }
  5466. +     }
  5467. + }
  5468. + void check_window(int force)
  5469. + {
  5470. +   ULONG class;
  5471. +   USHORT code, qualifier;
  5472. +   UWORD mx, my;
  5473. +   unsigned char buf[32];
  5474. +   int buflen, deiconify, i;
  5475. +   struct IntuiMessage *msg;
  5476. +   int mouse_event = FALSE, wb_event = FALSE;
  5477. +   struct AppMessage *amsg;
  5478. +   force_window();
  5479. +   if (emacs_win)
  5480. +     while (msg = (struct IntuiMessage *)GetMsg(emacs_win->UserPort))
  5481. +       {
  5482. +     class = msg->Class;
  5483. +     code = msg->Code;
  5484. +     qualifier = msg->Qualifier;
  5485. +     mx = msg->MouseX; my = msg->MouseY;
  5486. +     buflen = DeadKeyConvert(msg, buf, 32, 0);
  5487. +     ReplyMsg(msg);
  5488. +     switch (class)
  5489. +       {
  5490. +       case IDCMP_CLOSEWINDOW: {
  5491. +         enque(030, FALSE); enque(03, FALSE); /* ^X^C */
  5492. +         break;
  5493. +       }
  5494. +       case IDCMP_RAWKEY: {
  5495. +         if (buflen > 0)
  5496. +           {
  5497. +         unsigned char *sbuf = buf;
  5498. +         int meta = qualifier & META_MASK;
  5499. +         /* Don't set META on CSI */
  5500. +         do enque(*sbuf++, meta); while (--buflen);
  5501. +           }
  5502. +         break;
  5503. +       }
  5504. +       case IDCMP_NEWSIZE: amiga_change_size(); break;
  5505. +       case IDCMP_MENUPICK: case IDCMP_MENUHELP:
  5506. +         if (code == MENUNULL) break; /* else fall through */
  5507. +       case IDCMP_MOUSEBUTTONS: {
  5508. +         mouse_event = TRUE;
  5509. +         if (event_num == EVENTSIZE) break;
  5510. +         events[event_in].class = class;
  5511. +         events[event_in].code = code;
  5512. +         events[event_in].qual = qualifier;
  5513. +         events[event_in].x = mx;
  5514. +         events[event_in].y = my;
  5515. +         event_num++;
  5516. +         event_in = (event_in + 1) % EVENTSIZE;
  5517. +         break;
  5518. +       }
  5519. +       }
  5520. +       }
  5521. +   /* Handle App requests */
  5522. +   while (amsg = (struct AppMessage *)GetMsg(wbport))
  5523. +       switch (amsg->am_Type)
  5524. +     {
  5525. +     case MTYPE_APPICON: case MTYPE_APPWINDOW:
  5526. +       /* Add an event for all these files */
  5527. +       for (i = 0; i < amsg->am_NumArgs; i++) add_wbevent(amsg->am_ArgList + i);
  5528. +       wb_event = TRUE;
  5529. +       /* Reply to the message, and deiconify if was icon */
  5530. +       deiconify = amsg->am_Type == MTYPE_APPICON;
  5531. +       ReplyMsg(amsg);
  5532. +       if (deiconify && emacs_icon)
  5533. +         /* Reopen window */
  5534. +         if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
  5535. +                   emacs_screen_name) == ok)
  5536. +           {
  5537. +         resume_menus();
  5538. +         RemoveAppIcon(emacs_icon);
  5539. +         emacs_icon = 0;
  5540. +         emacs_iconified = 0;
  5541. +           }
  5542. +       break;
  5543. +     default: ReplyMsg(amsg); break;
  5544. +     }
  5545. +   if (amiga_mouse_initialized && (force && event_num > 0 || mouse_event))
  5546. +     {
  5547. +       enque(AMIGASEQ, FALSE); enque('M', FALSE);
  5548. +     }
  5549. +   if (amiga_wb_initialized && (force && wbevents || wb_event))
  5550. +     {
  5551. +       enque(AMIGASEQ, FALSE); enque('W', FALSE);
  5552. +     }
  5553. + }
  5554. + void setup_intchar(char intchar)
  5555. + {
  5556. +   char cqbuf[2];
  5557. +   if (MapANSI(&intchar, 1, cqbuf, 1, 0) == 1)
  5558. +     {
  5559. +       intkey_code = cqbuf[0];
  5560. +       intkey_qualifier = cqbuf[1];
  5561. +     }
  5562. +   else
  5563. +     {
  5564. +       /* Default is CTRL-G in usa0 keymap */
  5565. +       intkey_code = 0x24;
  5566. +       intkey_qualifier = IEQUALIFIER_CONTROL;
  5567. +     }
  5568. + }
  5569. + /* Hack to detect interrupt char as soon as it is pressed */
  5570. + /* __interrupt disables stack checking.  -ch3/19/93.*/
  5571. + static long __saveds __interrupt __asm
  5572. + int_handler(register __a0 struct InputEvent *ev)
  5573. + {
  5574. +   struct InputEvent *ep, *laste;
  5575. +   static struct InputEvent retkey;
  5576. +   ULONG lock = LockIBase(0);
  5577. +   if (emacs_win && IntuitionBase->ActiveWindow == emacs_win)
  5578. +     {
  5579. +       laste = 0;
  5580. +       /* run down the list of events to see if they pressed the magic key */
  5581. +       for (ep = ev; ep; laste = ep, ep = ep->ie_NextEvent)
  5582. +     if (ep->ie_Class == IECLASS_RAWKEY &&
  5583. +         (ep->ie_Qualifier & 0xff) == intkey_qualifier &&
  5584. +         ep->ie_Code == intkey_code)
  5585. +       {
  5586. +         /* Remove this key from input sequence */
  5587. +         if (laste) laste->ie_NextEvent = ep->ie_NextEvent;
  5588. +         else ev = ep->ie_NextEvent;
  5589. +         Vquit_flag = Qt;
  5590. +         Signal(_us, SIGBREAKF_CTRL_C);
  5591. +       }
  5592. +     }
  5593. +   UnlockIBase(lock);
  5594. +   /* pass on the pointer to the event */
  5595. +   return (long)ev;
  5596. + }
  5597. + DEFUN ("amiga-mouse-events", Famiga_mouse_events, Samiga_mouse_events, 0, 0, 0,
  5598. +        "Return number of pending mouse events from Intuition.")
  5599. +      ()
  5600. + {
  5601. +   register Lisp_Object tem;
  5602. +   check_intuition ();
  5603. +   XSET (tem, Lisp_Int, event_num);
  5604. +   return tem;
  5605. + }
  5606. + DEFUN ("amiga-proc-mouse-event", Famiga_proc_mouse_event, Samiga_proc_mouse_event,
  5607. +        0, 0, 0,
  5608. +        "Pulls a mouse event out of the mouse event buffer and dispatches\n\
  5609. + the appropriate function to act upon this event.")
  5610. + ()
  5611. + {
  5612. +   register Lisp_Object mouse_cmd;
  5613. +   register char com_letter;
  5614. +   register char key_mask;
  5615. +   register Lisp_Object tempx;
  5616. +   register Lisp_Object tempy;
  5617. +   extern Lisp_Object get_keyelt ();
  5618. +   extern int meta_prefix_char;
  5619. +   struct event *ev;
  5620. +   int posx, posy;
  5621. +   check_intuition ();
  5622. +   if (event_num) {
  5623. +     ev = &events[event_out];
  5624. +     event_out = (event_out + 1) % EVENTSIZE;
  5625. +     event_num--;
  5626. +     if (ev->class == MOUSEBUTTONS)
  5627. +       {
  5628. +     switch (ev->code)
  5629. +       {
  5630. +       case SELECTDOWN: com_letter = 2; break;
  5631. +       case SELECTUP: com_letter = 6; break;
  5632. +       case MIDDLEDOWN: com_letter = 1; break;
  5633. +       case MIDDLEUP: com_letter = 5; break;
  5634. +       case MENUDOWN: com_letter = 0; break;
  5635. +       case MENUUP: com_letter = 4; break;
  5636. +       default: com_letter = 3; break;
  5637. +       }
  5638. +     posx = amiga_pos_x(ev->x);
  5639. +     posy = amiga_pos_y(ev->y);
  5640. +     XSET (tempx, Lisp_Int, min (screen_width-1, max (0, posx)));
  5641. +     XSET (tempy, Lisp_Int, min (screen_height-1, max (0, posy)));
  5642. +       }
  5643. +     else
  5644. +       {
  5645. +     /* Must be Menu Pick or Help */
  5646. +     com_letter = ev->class == IDCMP_MENUPICK ? 3 : 7;
  5647. +     /* The parameters passed describe the selected item */
  5648. +     XSET (tempx, Lisp_Int, MENUNUM(ev->code));
  5649. +     XSET (tempy, Lisp_Int, ITEMNUM(ev->code));
  5650. +       }
  5651. +     if (ev->qual & META_MASK) com_letter |= 0x20;
  5652. +     if (ev->qual & SHIFT_MASK) com_letter |= 0x10;
  5653. +     if (ev->qual & CONTROL_MASK) com_letter |= 0x40;
  5654. +     Vamiga_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
  5655. +     Vamiga_mouse_item = make_number (com_letter);
  5656. +     mouse_cmd = get_keyelt (access_keymap (MouseMap, com_letter));
  5657. +     if (NULL (mouse_cmd)) {
  5658. +       bell ();
  5659. +       Vamiga_mouse_pos = Qnil;
  5660. +     }
  5661. +     else return call1 (mouse_cmd, Vamiga_mouse_pos);
  5662. +   }
  5663. +   return Qnil;
  5664. + }
  5665. + DEFUN ("amiga-get-mouse-event", Famiga_get_mouse_event, Samiga_get_mouse_event,
  5666. +        1, 1, 0,
  5667. +        "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\
  5668. + ARG non-nil means return nil immediately if no pending event;\n\
  5669. + otherwise, wait for an event.")
  5670. + (arg)
  5671. + Lisp_Object arg;
  5672. + {
  5673. +   register char com_letter;
  5674. +   register char key_mask;
  5675. +   register Lisp_Object tempx;
  5676. +   register Lisp_Object tempy;
  5677. +   struct event *ev;
  5678. +   int posx, posy;
  5679. +   check_intuition ();
  5680. +   if (NULL (arg))
  5681. +     {
  5682. +       amiga_consume_input();
  5683. +       while (!event_num)
  5684. +     {
  5685. +       int rfds = 1;
  5686. +       select(1, &rfds, 0, 0, 0);
  5687. +       amiga_consume_input();
  5688. +     }
  5689. +     }
  5690. +   /*** ??? Surely you don't mean to busy wait??? */
  5691. +   if (event_num) {
  5692. +     ev = &events[event_out];
  5693. +     event_out = (event_out + 1) % EVENTSIZE;
  5694. +     event_num--;
  5695. +     switch (ev->code)
  5696. +       {
  5697. +       case SELECTDOWN: com_letter = 2; break;
  5698. +       case SELECTUP: com_letter = 6; break;
  5699. +       case MIDDLEDOWN: com_letter = 1; break;
  5700. +       case MIDDLEUP: com_letter = 5; break;
  5701. +       case MENUDOWN: com_letter = 0; break;
  5702. +       case MENUUP: com_letter = 4; break;
  5703. +       default: com_letter = 3; break;
  5704. +       }
  5705. +     if (ev->qual & META_MASK) com_letter |= 0x20;
  5706. +     if (ev->qual & SHIFT_MASK) com_letter |= 0x10;
  5707. +     if (ev->qual & CONTROL_MASK) com_letter |= 0x40;
  5708. +     posx = amiga_pos_x(ev->x);
  5709. +     posy = amiga_pos_y(ev->y);
  5710. +     XSET (tempx, Lisp_Int, min (screen_width-1, max (0, posx)));
  5711. +     XSET (tempy, Lisp_Int, min (screen_height-1, max (0, posy)));
  5712. +     Vamiga_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
  5713. +     Vamiga_mouse_item = make_number (com_letter);
  5714. +     return Fcons (com_letter, Fcons (Vamiga_mouse_pos, Qnil));
  5715. +   }
  5716. +   return Qnil;
  5717. + }
  5718. + DEFUN ("amiga-get-wb-event", Famiga_get_wb_event, Samiga_get_wb_event,
  5719. +        1, 1, 0,
  5720. +        "Get next Workbench event out of workbench event buffer (a file name).\n\
  5721. + ARG non-nil means return nil immediately if no pending event;\n\
  5722. + otherwise, wait for an event.")
  5723. + (arg)
  5724. + Lisp_Object arg;
  5725. + {
  5726. +   Lisp_Object file;
  5727. +   struct wbevent *ev;
  5728. +   check_intuition ();
  5729. +   if (NULL (arg))
  5730. +     {
  5731. +       amiga_consume_input();
  5732. +       while (!wbevents)
  5733. +     {
  5734. +       int rfds = 1;
  5735. +       select(1, &rfds, 0, 0, 0);
  5736. +       amiga_consume_input();
  5737. +     }
  5738. +     }
  5739. +   /*** ??? Surely you don't mean to busy wait??? */
  5740. +   if (wbevents) {
  5741. +     file = build_string(wbevents->file);
  5742. +     ev = wbevents;
  5743. +     wbevents = wbevents->next;
  5744. +     free(ev);
  5745. +     return file;
  5746. +   }
  5747. +   return Qnil;
  5748. + }
  5749. + DEFUN("amiga-set-foreground-color", Famiga_set_foreground_color,
  5750. +       Samiga_set_foreground_color, 1, 1, "nPen number: ",
  5751. +       "Use PEN as foreground color")
  5752. +      (pen)
  5753. + {
  5754. +   int fg;
  5755. +   check_intuition();
  5756. +   CHECK_NUMBER(pen, 0);
  5757. +   fg = XUINT (pen);
  5758. +   if (pen > 7) error("Pen colors must be between 0 & 7");
  5759. +   foreground = fg;
  5760. +   reset_window();
  5761. +   return Qnil;
  5762. + }
  5763. + DEFUN("amiga-set-background-color", Famiga_set_background_color,
  5764. +       Samiga_set_background_color, 1, 1, "nPen number: ",
  5765. +       "Use PEN as background color")
  5766. +      (pen)
  5767. + {
  5768. +   int bg;
  5769. +   check_intuition();
  5770. +   CHECK_NUMBER(pen, 0);
  5771. +   bg = XUINT (pen);
  5772. +   if (pen > 7) error("Pen colors must be between 0 & 7");
  5773. +   background = bg;
  5774. +   reset_window();
  5775. +   return Qnil;
  5776. + }
  5777. + DEFUN("amiga-set-inverse-fill-pen", Famiga_set_inverse_fill_pen,
  5778. +       Samiga_set_inverse_fill_pen, 1, 1, "nPen number: ",
  5779. +       "Use PEN's color for inverse fills (0-7 or 8 for reverse)")
  5780. +      (pen)
  5781. + {
  5782. +   int ifp = 8;
  5783. +   check_intuition();
  5784. +   CHECK_NUMBER(pen, 0);
  5785. +   ifp = XUINT (pen);
  5786. +   if (pen > 8)
  5787. +     error("choices are from 0 to 8");
  5788. +   inverse_fill_pen = ifp;
  5789. +   reset_window();
  5790. +   return Qnil;
  5791. + }
  5792. + DEFUN("amiga-set-inverse-text-pen", Famiga_set_inverse_text_pen,
  5793. +       Samiga_set_inverse_text_pen, 1, 1, "nPen number: ",
  5794. +       "Use PEN's color for inverse fills (0-7 or 8 for reverse)")
  5795. +      (pen)
  5796. + {
  5797. +   int itp = 8;
  5798. +   check_intuition();
  5799. +   CHECK_NUMBER(pen, 0);
  5800. +   itp = XUINT (pen);
  5801. +   if (pen > 8)
  5802. +     error("choices are from 0 to 8");
  5803. +   inverse_text_pen = itp;
  5804. +   reset_window();
  5805. +   return Qnil;
  5806. + }
  5807. + DEFUN("amiga-set-font", Famiga_set_font, Samiga_set_font, 2, 2,
  5808. +       "sFont: \n\
  5809. + nSize: ",
  5810. +       "Set font used for window to FONT with given HEIGHT.\n\
  5811. + The font used must be non-proportional.")
  5812. + (wfont, height)
  5813. + {
  5814. +   struct TextAttr attr;
  5815. +   struct TextFont *newfont;
  5816. +   char *fname;
  5817. +   struct Lisp_String *fstr;
  5818. +   WORD minw, minh, oldmw, oldmh;
  5819. +   CHECK_STRING (wfont, 0);
  5820. +   CHECK_NUMBER (height, 0);
  5821. +   check_intuition();
  5822. +   fstr = XSTRING (wfont);
  5823. +   fname = (char *)alloca (fstr->size + 6);
  5824. +   strcpy (fname, fstr->data);
  5825. +   strcat (fname, ".font");
  5826. +   attr.ta_Name = fname;
  5827. +   attr.ta_YSize = XFASTINT (height);
  5828. +   attr.ta_Style = 0;
  5829. +   attr.ta_Flags = 0;
  5830. +   newfont = OpenDiskFont (&attr);
  5831. +   if (!newfont)
  5832. +     error ("Font %s %d not found", fstr->data, XFASTINT (height));
  5833. +   if (newfont->tf_Flags & FPF_PROPORTIONAL)
  5834. +     {
  5835. +       CloseFont(newfont);
  5836. +       error ("Font %s %d is proportional", fstr->data, XFASTINT (height));
  5837. +     }
  5838. +   if (emacs_win)
  5839. +     {
  5840. +       if (!set_min_size(emacs_win, newfont, &minw, &minh))
  5841. +     {
  5842. +       CloseFont(newfont);
  5843. +       if (!set_min_size(emacs_win, font, &oldmw, &oldmh))
  5844. +         _fail("Failed to restore old font, exiting.");
  5845. +       error("Window is too small for this font, need at least %d(w) by %d(h)",
  5846. +         minw, minh);
  5847. +     }
  5848. +       SetFont(emacs_win->RPort, newfont);
  5849. +     }
  5850. +   if (font_opened) CloseFont(font);
  5851. +   font_opened = TRUE;
  5852. +   font = newfont;
  5853. +   reset_window();
  5854. +   return Qnil;
  5855. + }
  5856. + DEFUN("amiga-set-geometry", Famiga_set_geometry, Samiga_set_geometry, 4, MANY, 0,
  5857. +       "Set Emacs window geometry and screen.\n\
  5858. + First 4 parameters are the (X,Y) position of the top-left corner of the window\n\
  5859. + and its WIDTH and HEIGHT. These must be big enough for an 11x4 characters window.\n\
  5860. + If nil is given for any of these, that means to keep the same value as before.\n\
  5861. + The optional argument SCREEN specifies which screen to use, nil stands for the\n\
  5862. + same screen as the window is on, t stands for the default public screen (normally\n\
  5863. + the Workbench), a string specifies a given public screen.\n\
  5864. + If optional argument BACKDROP is t, a backdrop window is used.")
  5865. +   (nargs, args)
  5866. +     int nargs;
  5867. +     Lisp_Object *args;
  5868. + {
  5869. +   Lisp_Object x, y, w, h, scr = Qnil, backdrop = Qnil;
  5870. +   int opened;
  5871. +   WORD tempx, tempy, tempw, temph;
  5872. +   char *screen_name;
  5873. +   int use_backdrop;
  5874. +   if (nargs > 6) error("Too many arguments to amiga-set-geometry");
  5875. +   x = args[0]; y = args[1]; w = args[2]; h = args[3];
  5876. +   if (nargs > 4)
  5877. +     {
  5878. +       scr = args[4];
  5879. +       if (nargs > 5) backdrop = args[5];
  5880. +     }
  5881. +   check_intuition();
  5882. +   if (!NULL (x))
  5883. +     {
  5884. +       CHECK_NUMBER(x, 0);
  5885. +       tempx = XUINT(x);
  5886. +     }
  5887. +   else tempx = EMACS_X();
  5888. +   if (!NULL (y))
  5889. +     {
  5890. +       CHECK_NUMBER(y, 0);
  5891. +       tempy = XUINT(y);
  5892. +     }
  5893. +   else tempy = EMACS_Y();
  5894. +   if (!NULL (w))
  5895. +     {
  5896. +       CHECK_NUMBER(w, 0);
  5897. +       tempw = XUINT(w);
  5898. +     }
  5899. +   else tempw = EMACS_W();
  5900. +   if (!NULL (h))
  5901. +     {
  5902. +       CHECK_NUMBER(h, 0);
  5903. +       temph = XUINT(h);
  5904. +     }
  5905. +   else temph = EMACS_H();
  5906. +   use_backdrop = !NULL(backdrop);
  5907. +   if (scr == Qt) screen_name = 0; /* set to zero for def. */
  5908. +   else if (!NULL (scr))
  5909. +     {
  5910. +       CHECK_STRING (scr, 0);
  5911. +       screen_name = XSTRING (scr)->data;
  5912. +     }
  5913. +   else screen_name = emacs_screen_name;
  5914. +   if (emacs_win)
  5915. +     {
  5916. +       struct Window *old_win = emacs_win;
  5917. +       struct IOStdReq *old_console = emacs_console;
  5918. +       suspend_menus();
  5919. +       opened = open_emacs_window(tempx, tempy, tempw, temph, use_backdrop,
  5920. +                  screen_name);
  5921. +       if (opened != ok)
  5922. +     {
  5923. +       resume_menus();
  5924. +       if (opened == no_window) error("Failed to open desired window");
  5925. +       else if (screen_name)
  5926. +         error("Unknown public screen %s", screen_name);
  5927. +       else error("The default screen wasn't found !?");
  5928. +     }
  5929. +       _device_close(old_console);
  5930. +       CloseWindow(old_win);
  5931. +       if (!resume_menus()) error("Failed to recover menus (No memory?)");
  5932. +     }
  5933. +   else /* No window, set defaults */
  5934. +     {
  5935. +       emacs_screen_name = screen_name;
  5936. +       if (screen_name)
  5937. +     {
  5938. +       emacs_screen_name_storage[MAXPUBSCREENNAME] = '\0';
  5939. +       strncpy(emacs_screen_name_storage, screen_name, MAXPUBSCREENNAME);
  5940. +     }
  5941. +       emacs_x = tempx;
  5942. +       emacs_y = tempy;
  5943. +       emacs_w = tempw;
  5944. +       emacs_h = temph;
  5945. +       emacs_backdrop = use_backdrop;
  5946. +     }
  5947. +   return Qnil;
  5948. + }
  5949. + /* The next 2 functions are very usefull for writing
  5950. +  * arexx/lisp functions that interact with other programs
  5951. +  * that will be sharing the same screen.  -ch3/19/93. */
  5952. + DEFUN("amiga-get-window-geometry",
  5953. +       Famiga_get_window_geometry, Samiga_get_window_geometry, 0, 0, 0,
  5954. +       "Get Emacs window geometry.\n\
  5955. + a list returned is of the form:  (iconified x y width height backdrop)\n\
  5956. + where x, y, width, height are integers, backdrop is t or nil and iconified\n\
  5957. + is t if the window is iconified and nil otherwise")
  5958. + ()
  5959. + {
  5960. +   Lisp_Object x, y, w, h, b, i;
  5961. +   XSET(x, Lisp_Int, EMACS_X());
  5962. +   XSET(y, Lisp_Int, EMACS_Y());
  5963. +   XSET(w, Lisp_Int, EMACS_W());
  5964. +   XSET(h, Lisp_Int, EMACS_H());
  5965. +   b = emacs_backdrop ? Qt : Qnil;
  5966. +   i = emacs_iconified ? Qt : Qnil;
  5967. +   return Fcons(i, Fcons(x, Fcons(y, Fcons(w, Fcons(h, Fcons(b, Qnil))))));
  5968. + }
  5969. + DEFUN("amiga-get-screen-geometry",
  5970. +       Famiga_get_screen_geometry, Samiga_get_screen_geometry, 0, 0, 0,
  5971. +       "Get geometry of the screen emacs window resides on.\n\
  5972. + a list returned is of the form:  (name x y width height)\n\
  5973. + where name is a string, x, y, width, height are integers.\n\
  5974. + Only the public screen name is returned if the window is not currently open.\n\
  5975. + In this last case, the name may be nil if the window will be opened on the\n\
  5976. + default public screen.")
  5977. + ()
  5978. + {
  5979. +   Lisp_Object name;
  5980. +   if (emacs_screen_name) name = Qnil;
  5981. +   else name = build_string(emacs_screen_name);
  5982. +   if(emacs_win)
  5983. +     {
  5984. +       struct Screen *s = emacs_win->WScreen;
  5985. +       Lisp_Object x, y, w, h;
  5986. +       XSET(x, Lisp_Int, s->LeftEdge);
  5987. +       XSET(y, Lisp_Int, s->TopEdge);
  5988. +       XSET(w, Lisp_Int, s->Width);
  5989. +       XSET(h, Lisp_Int, s->Height);
  5990. +       return Fcons(name, Fcons(x, Fcons(y, Fcons(w, Fcons(h, Qnil)))));
  5991. +     }
  5992. +   return Fcons(name, Qnil);
  5993. + }
  5994. + DEFUN("amiga-iconify", Famiga_iconify, Samiga_iconify, 0, 0, "",
  5995. +       "Toggle the emacs iconification state.")
  5996. + ()
  5997. + {
  5998. +   check_intuition();
  5999. +   if (emacs_iconified)
  6000. +     {
  6001. +       /* Deiconify */
  6002. +       /* Reopen window */
  6003. +       if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
  6004. +                 emacs_screen_name) != ok)
  6005. +     error("Failed to deiconify (No memory?)");
  6006. +       resume_menus();
  6007. +       RemoveAppIcon(emacs_icon);
  6008. +       emacs_icon = 0;
  6009. +       emacs_iconified = 0;
  6010. +     }
  6011. +   else
  6012. +     if (emacs_icon = AddAppIconA(0, 0, "Emacs", wbport, 0, &emacs_icon_object, 0))
  6013. +       {
  6014. +     if (emacs_win)
  6015. +       {
  6016. +         /* Close window */
  6017. +         emacs_x = EMACS_X(); emacs_y = EMACS_Y();
  6018. +         emacs_w = EMACS_W(); emacs_h = EMACS_H();
  6019. +         suspend_menus();
  6020. +         close_emacs_window();
  6021. +       }
  6022. +     emacs_iconified = 1;
  6023. +       }
  6024. +     else error("Iconify attempt failed\n");
  6025. +   return Qnil;
  6026. + }
  6027. + DEFUN("amiga-set-icon-pos", Famiga_set_icon_pos, Samiga_set_icon_pos, 2, 2,
  6028. + "nX position: \n\
  6029. + nY position: ",
  6030. +       "Set the X Y position of the icon for emacs when iconified.")
  6031. +   (Lisp_Object x, Lisp_Object y)
  6032. + {
  6033. +   long xpos, ypos;
  6034. +   if (NULL (x)) emacs_icon_object.do_CurrentX = NO_ICON_POSITION;
  6035. +   else
  6036. +     {
  6037. +       CHECK_NUMBER (x, 0);
  6038. +       emacs_icon_object.do_CurrentX = XINT(x);
  6039. +     }
  6040. +   if (NULL (y)) emacs_icon_object.do_CurrentY = NO_ICON_POSITION;
  6041. +   else
  6042. +     {
  6043. +       CHECK_NUMBER (y, 0);
  6044. +       emacs_icon_object.do_CurrentY = XINT(y);
  6045. +     }
  6046. +   return Qnil;
  6047. + }
  6048. + struct EClockVal scount[16], ecount[16];
  6049. + long total[16], counting[16], nb[16], susp[16];
  6050. + void start_count(int n)
  6051. + {
  6052. +   nb[n]++;
  6053. +   if (counting[n]) printf("Restarted %d\n", n);
  6054. +   counting[n] = 1;
  6055. +   /*ReadEClock(&scount[n]);*/
  6056. + }
  6057. + void stop_count(int n)
  6058. + {
  6059. +   if (counting[n])
  6060. +     {
  6061. +       /*ReadEClock(&ecount[n]);*/
  6062. +       counting[n] = 0;
  6063. +       total[n] += ecount[n].ev_lo - scount[n].ev_lo;
  6064. +     }
  6065. + }
  6066. + void suspend_count(int n)
  6067. + {
  6068. +   if (counting[n] && susp[n]++ == 0)
  6069. +     {
  6070. +       /*ReadEClock(&ecount[n]);*/
  6071. +       total[n] += ecount[n].ev_lo - scount[n].ev_lo;
  6072. +     }
  6073. + }
  6074. + void resume_count(int n)
  6075. + {
  6076. +   if (counting[n] && --susp[n] == 0) /*ReadEClock(&scount[n])*/;
  6077. + }
  6078. + disp_counts(void)
  6079. + {
  6080. +   int i;
  6081. +   for (i = 0; i < 16; i++)
  6082. +     {
  6083. +       printf("%d(%d) ", total[i], nb[i]);
  6084. +       total[i] = nb[i] = 0;
  6085. +     }
  6086. +   printf("\n");
  6087. + }
  6088. + void screen_puts(char *str, unsigned int len)
  6089. + {
  6090. +   if (emacs_win)
  6091. +     {
  6092. +       int i;
  6093. +       emacs_console->io_Command = CMD_WRITE;
  6094. +       emacs_console->io_Data    = (APTR)str;
  6095. +       emacs_console->io_Length  = len;
  6096. +       /*    start_count(0);
  6097. +         for (i = 1; i <= 6; i++) suspend_count(i);*/
  6098. +       DoIO(emacs_console);
  6099. +       /*    for (i = 1; i <= 6; i++) resume_count(i);
  6100. +         stop_count(0);*/
  6101. +     }
  6102. + }
  6103. + DEFUN ("amiga-activate-window", Famiga_activate_window, Samiga_activate_window, 0, 0, 0,
  6104. +        "Makes emacs window the currently active one.")
  6105. +      ()
  6106. + {
  6107. +   if(emacs_win) {
  6108. +     ActivateWindow(emacs_win);
  6109. +     return Qnil;
  6110. +   }
  6111. +   error("No window to make active.");
  6112. +   return Qnil;
  6113. + }
  6114. + DEFUN ("amiga-window-to-front", Famiga_window_to_front, Samiga_window_to_front, 0, 0, 0,
  6115. +        "Pulls the emacs window to the front (including screen)")
  6116. +      ()
  6117. + {
  6118. +   if(emacs_win) {
  6119. +     WindowToFront(emacs_win);
  6120. +     ScreenToFront(emacs_win->WScreen);
  6121. +     return Qnil;
  6122. +   }
  6123. +   error("No window to pull to the front.");
  6124. +   return Qnil;
  6125. + }
  6126. + DEFUN ("amiga-window-to-back", Famiga_window_to_back, Samiga_window_to_back, 0, 0, 0,
  6127. +        "Pushes the emacs window to the back (including screen)")
  6128. +      ()
  6129. + {
  6130. +   if(emacs_win) {
  6131. +     WindowToBack(emacs_win);
  6132. +     ScreenToBack(emacs_win->WScreen);
  6133. +     return Qnil;
  6134. +   }
  6135. +   error("No window to push back.");
  6136. +   return Qnil;
  6137. + }
  6138. + void syms_of_amiga_screen(void)
  6139. + {
  6140. +   DEFVAR_LISP ("amiga-mouse-item", &Vamiga_mouse_item,
  6141. +            "Encoded representation of last mouse click, corresponding to\n\
  6142. + numerical entries in amiga-mouse-map.");
  6143. +   Vamiga_mouse_item = Qnil;
  6144. +   DEFVAR_LISP ("amiga-mouse-pos", &Vamiga_mouse_pos,
  6145. +            "Current x-y position of mouse by row, column as specified by font.");
  6146. +   Vamiga_mouse_pos = Qnil;
  6147. +   DEFVAR_BOOL ("amiga-remap-bsdel", &amiga_remap_bsdel,
  6148. +            "*If true, map DEL to Ctrl-D and Backspace to DEL. \n\
  6149. + This is the most convenient (and default) setting. If nil, don't remap.");
  6150. +   amiga_remap_bsdel = 1;
  6151. +   DEFVAR_BOOL ("amiga-remap-numeric-keypad", &amiga_remap_numeric_keypad,
  6152. +            "*If true, numeric keypad keys are prefixed with C-x C-^ K.\n\
  6153. + This enables you to remap them, but causes problems with functions like\n\
  6154. + isearch-forward-regexp on some keyboards. Default to true.");
  6155. +   amiga_remap_numeric_keypad = 1;
  6156. +   DEFVAR_BOOL ("amiga-mouse-initialized", &amiga_mouse_initialized,
  6157. +            "Set to true once lisp has been setup to process mouse commands.\n\
  6158. + No mouse processing request (C-X C-^ M) will be queued while this is nil.");
  6159. +   amiga_mouse_initialized = 0;
  6160. +   DEFVAR_BOOL ("amiga-wb-initialized", &amiga_wb_initialized,
  6161. +            "Set to true once lisp has been setup to process workbench commands.\n\
  6162. + No workbench processing request (C-X C-^ W) will be queued while this is nil.");
  6163. +   amiga_mouse_initialized = 0;
  6164. +   defsubr (&Samiga_mouse_events);
  6165. +   defsubr (&Samiga_proc_mouse_event);
  6166. +   defsubr (&Samiga_get_mouse_event);
  6167. +   defsubr (&Samiga_get_wb_event);
  6168. +   defsubr (&Samiga_set_font);
  6169. +   defsubr (&Samiga_set_geometry);
  6170. +   defsubr (&Samiga_set_background_color);
  6171. +   defsubr (&Samiga_set_foreground_color);
  6172. +   defsubr (&Samiga_iconify);
  6173. +   defsubr (&Samiga_set_icon_pos);
  6174. +   /* New functions  -ch3/19/93. */
  6175. +   defsubr (&Samiga_set_inverse_text_pen);
  6176. +   defsubr (&Samiga_set_inverse_fill_pen);
  6177. +   defsubr (&Samiga_window_to_front);
  6178. +   defsubr (&Samiga_window_to_back);
  6179. +   defsubr (&Samiga_activate_window);
  6180. +   defsubr (&Samiga_get_window_geometry);
  6181. +   defsubr (&Samiga_get_screen_geometry);
  6182. + }
  6183. + void init_amiga_screen(void)
  6184. + {
  6185. +   event_num = event_in = event_out = 0;
  6186. +   if (!((IntuitionBase = (struct IntuitionBase *)
  6187. +      OpenLibrary("intuition.library", 37L)) &&
  6188. +     (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) &&
  6189. +     (DiskfontBase = OpenLibrary("diskfont.library", 0L)) &&
  6190. +     (WorkbenchBase = OpenLibrary("workbench.library", 37)) &&
  6191. +     (KeymapBase = OpenLibrary("keymap.library", 36)) &&
  6192. +     (input_req = (struct IOStdReq *)_device_open("input.device", 0, 0, 0, 0,
  6193. +                              sizeof(struct IOStdReq)))))
  6194. +     _fail("Need version 2.04 and diskfont.library!");
  6195. +   if (!(wbport = CreateMsgPort())) no_memory();
  6196. +   /* Add Ctrl-G detector */
  6197. +   int_handler_hook.is_Data = 0;
  6198. +   int_handler_hook.is_Code = (void *)int_handler;
  6199. +   int_handler_hook.is_Node.ln_Pri = 100; /* 100 not 127 is the standard value
  6200. +                       * for input stream handlers.  -ch3/19/93. */
  6201. +   /* it is standard for interrupts to have names  -ch3/19/93.*/
  6202. +   int_handler_hook.is_Node.ln_Name = "GNU Emacs CTRL-G handler";
  6203. +   input_req->io_Command = IND_ADDHANDLER;
  6204. +   input_req->io_Data = (APTR)&int_handler_hook;
  6205. +   /* wasn't checking for error. -ch3/19/93. */
  6206. +   if(0 == DoIO(input_req))
  6207. +     hooked = TRUE;
  6208. +   else
  6209. +     {
  6210. +       hooked = FALSE;
  6211. +       _fail("couldn't get input handler hook for CTRL-G");
  6212. +     }
  6213. +   inputsig |= 1L << wbport->mp_SigBit;
  6214. +   background_hook.h_Entry = (ULONG (*)()) fill_background; /* added cast. */
  6215. +   font = GfxBase->DefaultFont;
  6216. +   init_amiga_menu();
  6217. + }
  6218. + void cleanup_amiga_screen(void)
  6219. + {
  6220. +   if (hooked)
  6221. +     {
  6222. +       input_req->io_Command = IND_REMHANDLER;
  6223. +       input_req->io_Data = (APTR)&int_handler_hook;
  6224. +       DoIO(input_req);
  6225. +     }
  6226. +   close_app_win();
  6227. +   if (wbport) DeleteMsgPort(wbport);
  6228. +   cleanup_amiga_menu();
  6229. +   _device_close(emacs_console);
  6230. +   if (emacs_win) CloseWindow(emacs_win);
  6231. +   if (font_opened) CloseFont(font);
  6232. +   if (IntuitionBase) CloseLibrary(IntuitionBase);
  6233. +   if (GfxBase) CloseLibrary(GfxBase);
  6234. +   if (DiskfontBase) CloseLibrary(DiskfontBase);
  6235. +   if (WorkbenchBase) CloseLibrary(WorkbenchBase);
  6236. +   if (KeymapBase) CloseLibrary(KeymapBase);
  6237. +   _device_close(input_req);
  6238. + }
  6239. diff -rcP emacs-18.59-fsf/src/amiga_serial.c emacs-18.59-amiga/src/amiga_serial.c
  6240. *** emacs-18.59-fsf/src/amiga_serial.c    Thu Jan  1 00:00:00 1970
  6241. --- emacs-18.59-amiga/src/amiga_serial.c    Sat Jun  5 11:37:38 1993
  6242. ***************
  6243. *** 0 ****
  6244. --- 1,72 ----
  6245. + #include <exec/types.h>
  6246. + #include <devices/serial.h>
  6247. + #include <stdio.h>
  6248. + #include <internal/devices.h>
  6249. + #include <proto/exec.h>
  6250. + #include <proto/dos.h>
  6251. + #include "amiga.h"
  6252. + static struct MsgPort  *SerReadPort;
  6253. + static struct IOExtSer *SerReadRequest, *SerWriteRequest;
  6254. + static char ser_inbuf[2];
  6255. + char *far serial_device = "serial.device";
  6256. + long far serial_unit;
  6257. + void init_amiga_serial(void)
  6258. + {
  6259. +     if ((SerWriteRequest = (struct IOExtSer *)
  6260. +      _device_open(serial_device, serial_unit, 0L,
  6261. +               0L, 0, sizeof(struct IOExtSer))) &&
  6262. +     (SerReadPort = CreateMsgPort()) &&
  6263. +     (SerReadRequest  = (struct IOExtSer *)CreateIORequest(SerReadPort, sizeof (struct IOExtSer))))
  6264. +     {
  6265. +     SerReadRequest->IOSer.io_Device = SerWriteRequest->IOSer.io_Device;
  6266. +     SerReadRequest->IOSer.io_Unit = SerWriteRequest->IOSer.io_Unit;
  6267. +     ser_inbuf[1]=0;
  6268. +     SerReadRequest->IOSer.io_Command = CMD_READ;
  6269. +     SerWriteRequest->IOSer.io_Command = CMD_WRITE;
  6270. +     SerReadRequest->IOSer.io_Length = 1;
  6271. +     SerReadRequest->IOSer.io_Data = &ser_inbuf[0];
  6272. +     SendIO(SerReadRequest);
  6273. +     inputsig |= 1L << SerReadPort->mp_SigBit;
  6274. +     }
  6275. +     else _fail("No memory or serial.device missing");
  6276. + }
  6277. + void cleanup_amiga_serial(void)
  6278. + {
  6279. +     if (SerReadRequest)
  6280. +     {
  6281. +     AbortIO(SerReadRequest);
  6282. +     WaitIO(SerReadRequest);
  6283. +     DeleteIORequest(SerReadRequest);
  6284. +     }
  6285. +     if (SerReadPort) DeletePort(SerReadPort);
  6286. +     _device_close(SerWriteRequest);
  6287. + }
  6288. + void check_serial(int force)
  6289. + {
  6290. +     while (CheckIO(SerReadRequest))
  6291. +     {
  6292. +     int c = ser_inbuf[0];
  6293. +     SendIO(SerReadRequest);
  6294. +     enque(c, FALSE);
  6295. +     }
  6296. + }
  6297. + void serial_puts(char *str, int len)
  6298. + {
  6299. +     SerWriteRequest->IOSer.io_Length = len;
  6300. +     SerWriteRequest->IOSer.io_Data = str;
  6301. +     DoIO(SerWriteRequest);
  6302. + }
  6303. + unsigned long serial_baud_rate(void)
  6304. + {
  6305. +     return SerWriteRequest->io_Baud;
  6306. + }
  6307. diff -rcP emacs-18.59-fsf/src/amiga_sysdep.c emacs-18.59-amiga/src/amiga_sysdep.c
  6308. *** emacs-18.59-fsf/src/amiga_sysdep.c    Thu Jan  1 00:00:00 1970
  6309. --- emacs-18.59-amiga/src/amiga_sysdep.c    Sat Jun  5 11:39:12 1993
  6310. ***************
  6311. *** 0 ****
  6312. --- 1,375 ----
  6313. + /* Interfaces to system-dependent kernel and library entries.
  6314. + Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
  6315. + This file is part of GNU Emacs.
  6316. + GNU Emacs is distributed in the hope that it will be useful,
  6317. + but WITHOUT ANY WARRANTY.  No author or distributor
  6318. + accepts responsibility to anyone for the consequences of using it
  6319. + or for whether it serves any particular purpose or works at all,
  6320. + unless he says so in writing.  Refer to the GNU Emacs General Public
  6321. + License for full details.
  6322. + Everyone is granted permission to copy, modify and redistribute
  6323. + GNU Emacs, but only under the conditions described in the
  6324. + GNU Emacs General Public License.   A copy of this license is
  6325. + supposed to have been given to you along with GNU Emacs so you
  6326. + can know your rights and responsibilities.  It should be in a
  6327. + file named COPYING.  Among other things, the copyright notice
  6328. + and this notice must be preserved on all copies.  */
  6329. + #include <exec/types.h>
  6330. + #include <dos/dos.h>
  6331. + #include <dos/dosextens.h>
  6332. + #include <dos/var.h>
  6333. + #include <exec/execbase.h>
  6334. + #include <exec/tasks.h>
  6335. + #include <utility/tagitem.h>
  6336. + #include <workbench/startup.h>
  6337. + #include <workbench/workbench.h>
  6338. + #include <proto/exec.h>
  6339. + #include <proto/dos.h>
  6340. + #include <proto/icon.h>
  6341. + #include <string.h>
  6342. + #include <ios1.h>
  6343. + #include <stdio.h>
  6344. + #include <sys/types.h>
  6345. + #include <sys/stat.h>
  6346. + #include <signal.h>
  6347. + #include <setjmp.h>
  6348. + #include <unistd.h>
  6349. + #include <internal/vars.h>
  6350. + #undef LONGBITS
  6351. + #undef NULL
  6352. + #include "config.h"
  6353. + #include "lisp.h"
  6354. + #include "emacssignal.h"
  6355. + #define min(x,y) ((x) > (y) ? (y) : (x))
  6356. + #include "termhooks.h"
  6357. + #include "termchar.h"
  6358. + #include "termopts.h"
  6359. + #include "dispextern.h"
  6360. + #include "amiga.h"
  6361. + #define EMACS_TOOL_SIZE 128    /* Room for path to emacs executable */
  6362. + struct Library *IconBase;
  6363. + extern struct ExecBase *SysBase;
  6364. + /*long __stack = 40000;*/        /* Minimum stack size, used by c.o */
  6365. + int amiga_process_stack_size;
  6366. + int amiga_initialized;
  6367. + int amiga_create_icons;        /* If true, we create icons when saving files */
  6368. + enum exit_method amiga_fail_exit = use_xcexit;
  6369. + int selecting;
  6370. + /* Emacs sysdep routines */
  6371. + /* --------------------- */
  6372. + set_exclusive_use(int fd) {}
  6373. + /* Suspend the Emacs process; give terminal to its superior.  */
  6374. + sys_suspend()
  6375. + {
  6376. +   /* This could have been iconify, but:
  6377. +      a) Not good for serial lines.
  6378. +      b) emacs stays active while iconified */
  6379. + }
  6380. + char *get_system_name()
  6381. + {
  6382. +   static char sysname[32];
  6383. +   gethostname(sysname, sizeof sysname);
  6384. +   return sysname;
  6385. + }
  6386. + /*
  6387. +  *    flush any pending output
  6388. +  *      (may flush input as well; it does not matter the way we use it)
  6389. +  */
  6390. + flush_pending_output (channel)
  6391. +      int channel;
  6392. + {
  6393. + }
  6394. + wait_for_termination (pid)
  6395. +      int pid;
  6396. + {
  6397. +   while (1)
  6398. +     {
  6399. +       sigsetmask (sigmask (SIGCHLD));
  6400. +       if (0 > kill (pid, 0))
  6401. +         {
  6402. +       sigsetmask (SIGEMPTYMASK);
  6403. +       break;
  6404. +     }
  6405. +       sigpause (SIGEMPTYMASK);
  6406. +     }
  6407. + }
  6408. + /* A few general amiga support routines */
  6409. + /* ------------------------------------ */
  6410. + char *expand_path(char *path, char *buf, int len)
  6411. + {
  6412. +   BPTR dirlock;
  6413. +   APTR window;
  6414. +   window = _us->pr_WindowPtr;
  6415. +   _us->pr_WindowPtr = (APTR)-1;
  6416. +   dirlock = Lock(path, ACCESS_READ);
  6417. +   _us->pr_WindowPtr = window;
  6418. +   if (dirlock)            /* Expand lock name */
  6419. +     {
  6420. +       if (!NameFromLock(dirlock, buf, len)) buf = 0;
  6421. +       UnLock(dirlock);
  6422. +       return buf;
  6423. +     }
  6424. +   return 0;
  6425. + }
  6426. + #undef select
  6427. + int emacs_select(int nfds, int *rfds, int *wfds, int *efds, struct timeval *timeout)
  6428. + {
  6429. +   int ret;
  6430. +   selecting = TRUE;
  6431. +   ret = select(nfds, rfds, wfds, efds, timeout);
  6432. +   selecting = FALSE;
  6433. +   return ret;
  6434. + }
  6435. + void no_memory(void)
  6436. + {
  6437. +   _fail("No memory");
  6438. + }
  6439. + char *amiga_path(void)
  6440. + {
  6441. +   char *path, *pp, name[128];
  6442. +   int pathsize;
  6443. +   struct CommandLineInterface *cli;
  6444. +   BPTR lock;
  6445. +   long l, *lp, nlen;
  6446. +   pathsize = 128;
  6447. +   path = (char *)xmalloc(pathsize);
  6448. +   strcpy(path, ".");
  6449. +   pp = path + 1;
  6450. +   if (!(cli = (struct CommandLineInterface *)((long)_us->pr_CLI << 2)))
  6451. +     return path;
  6452. +   l = (long)cli->cli_CommandDir;
  6453. +   while (l) {
  6454. +     *pp++ = ',';
  6455. +     l <<= 2;
  6456. +     lp = (long *)l;
  6457. +     lock = (BPTR)*(lp + 1);
  6458. +     NameFromLock(lock, name, 128);
  6459. +     nlen = strlen(name);
  6460. +     if (pp + nlen + 5 >= path + pathsize)
  6461. +       {
  6462. +     char *newpath;
  6463. +     pathsize = 2 * pathsize + nlen;
  6464. +     newpath = (char *)xrealloc(path, pathsize);
  6465. +     pp = newpath + (pp - path);
  6466. +     path = newpath;
  6467. +       }
  6468. +     memcpy(pp, name, nlen);
  6469. +     pp += nlen;
  6470. +     l = *lp;
  6471. +   }
  6472. +   /* Use of +5 above guarantees that there is enough space for c: */
  6473. +   strcpy(pp, ",c:");
  6474. +   return path;
  6475. + }
  6476. + /* Some general amiga commands */
  6477. + /* --------------------------- */
  6478. + #define emacs_file_icon_width 54
  6479. + #define emacs_file_icon_height 22
  6480. + #define emacs_file_icon_num_planes 2
  6481. + static UWORD chip emacs_file_icon_data[2][22][4] = {
  6482. +     {
  6483. +         0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0c00,
  6484. +         0x0000,0x0000,0x0000,0x0c00,0x07ff,0xffff,0xffe0,0x0c00,
  6485. +         0x0400,0x0000,0x0030,0x0c00,0x0400,0x0000,0x0028,0x0c00,
  6486. +         0x04ff,0xffff,0xfe24,0x0c00,0x0400,0x0000,0x0022,0x0c00,
  6487. +         0x04ff,0xffff,0xfe3f,0x0c00,0x0400,0x0000,0x0000,0x8c00,
  6488. +         0x04ff,0xffc0,0x0000,0x8c00,0x0400,0x0000,0x0000,0x8c00,
  6489. +         0x0400,0x0000,0x0000,0x8c00,0x0400,0x0000,0x0000,0x8c00,
  6490. +         0x04ff,0xffff,0xfe00,0x8c00,0x0400,0x0000,0x0000,0x8c00,
  6491. +         0x04ff,0xffff,0xfe00,0x8c00,0x0400,0x0000,0x0000,0x8c00,
  6492. +         0x07ff,0xffff,0xffff,0x8c00,0x0000,0x0000,0x0000,0x0c00,
  6493. +         0x0000,0x0000,0x0000,0x0c00,0x7fff,0xffff,0xffff,0xfc00
  6494. +     },
  6495. +     {
  6496. +         0xffff,0xffff,0xffff,0xf800,0x8000,0x0000,0x0000,0x0000,
  6497. +         0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,
  6498. +         0x83ff,0xffff,0xffc0,0x0000,0x83ff,0xffff,0xffd0,0x0000,
  6499. +         0x8300,0x0000,0x01d8,0x0000,0x83ff,0xffff,0xffdc,0x0000,
  6500. +         0x8300,0x0000,0x01c0,0x0000,0x83ff,0xffff,0xffff,0x0000,
  6501. +         0x8300,0x003f,0xffff,0x0000,0x83ff,0xffff,0xffff,0x0000,
  6502. +         0x83ff,0xffff,0xffff,0x0000,0x83ff,0xffff,0xffff,0x0000,
  6503. +         0x8300,0x0000,0x01ff,0x0000,0x83ff,0xffff,0xffff,0x0000,
  6504. +         0x8300,0x0000,0x01ff,0x0000,0x83ff,0xffff,0xffff,0x0000,
  6505. +         0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,
  6506. +         0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000
  6507. +     },
  6508. + };
  6509. + struct Image far emacs_file_icon_image = {
  6510. +   0, 0,
  6511. +   emacs_file_icon_width, emacs_file_icon_height, emacs_file_icon_num_planes,
  6512. +   (UWORD *)emacs_file_icon_data,
  6513. +   3, 0,
  6514. +   0
  6515. + };
  6516. + static char *far emacs_file_tooltypes[] = {
  6517. +   "FILETYPE=TEXT",
  6518. +   0
  6519. + };
  6520. + static char far emacs_tool[EMACS_TOOL_SIZE];
  6521. + static struct DiskObject far emacs_file_icon_object = {
  6522. +   WB_DISKMAGIC, WB_DISKVERSION,
  6523. +   { 0, 0, 0, emacs_file_icon_width, emacs_file_icon_height,
  6524. +     GFLG_GADGIMAGE | GADGBACKFILL, GACT_IMMEDIATE | GACT_RELVERIFY, GTYP_BOOLGADGET,
  6525. +     (APTR)&emacs_file_icon_image },
  6526. +   WBPROJECT, emacs_tool, emacs_file_tooltypes,
  6527. +   NO_ICON_POSITION, NO_ICON_POSITION,
  6528. +   0, 0,
  6529. +   40000                /* Stack size for emacs */
  6530. + };
  6531. + DEFUN ("amiga-put-icon", Famiga_put_icon, Samiga_put_icon, 2, 2, 0,
  6532. +        "Create an icon for FILE.\n\
  6533. + If FORCE is non-nil create it unconditionally, otherwise only if one doesn't exist.\n\
  6534. + Returns t if an icon was created, nil otherwise.")
  6535. +      (file, force)
  6536. + Lisp_Object file, force;
  6537. + {
  6538. +   char *fname;
  6539. +   struct DiskObject *obj;
  6540. +   CHECK_STRING(file, 0);
  6541. +   fname = XSTRING(file)->data;
  6542. +   if (NULL (force) && (obj = GetDiskObject(fname)))
  6543. +     {
  6544. +       /* Icon exists, don't overwrite */
  6545. +       FreeDiskObject(obj);
  6546. +       return Qnil;
  6547. +     }
  6548. +   emacs_file_icon_object.do_StackSize = _stack_size;
  6549. +   if (PutDiskObject(fname, &emacs_file_icon_object)) return Qt;
  6550. +   error("Icon for %s couldn't be created", fname);
  6551. + }
  6552. + /* Amiga initialisation routines */
  6553. + /* ----------------------------- */
  6554. + syms_of_amiga ()
  6555. + {
  6556. +   DEFVAR_BOOL("amiga-initialized", &amiga_initialized, "");
  6557. +   DEFVAR_INT("amiga-malloc-bytes-used", &malloc_bytes_used,
  6558. +          "Number of malloc bytes used when emacs was dumped");
  6559. +   DEFVAR_BOOL("amiga-create-icons", &amiga_create_icons,
  6560. +          "If non-nil, create icons when saving files.");
  6561. +   defsubr(&Samiga_put_icon);
  6562. +   amiga_process_stack_size = 0;
  6563. +   DEFVAR_INT("amiga-process-stack-size", &amiga_process_stack_size,
  6564. +      "Size of stack for called processes. 0 means same size as emacs stack.");
  6565. +   syms_of_amiga_tty();
  6566. +   syms_of_amiga_menu();
  6567. +   syms_of_amiga_clipboard();
  6568. + }
  6569. + static void amiga_early_init(int *_argc, char ***_argv)
  6570. + {
  6571. +   int argc = *_argc;
  6572. +   char **argv = *_argv;
  6573. +   if (argc > 2 && !strcmp(argv[1], "-pure"))
  6574. +     {
  6575. +       puresize = atoi(argv[2]);
  6576. +       argc -= 2; argv += 2;
  6577. +     }
  6578. +   if (argc > 2 && !strcmp(argv[1], "-malloc"))
  6579. +     {
  6580. +       malloc_hunk_size = atoi(argv[2]);
  6581. +       argc -= 2; argv += 2;
  6582. +     }
  6583. +   if (argc > 2 && !strcmp(argv[1], "-prealloc"))
  6584. +     {
  6585. +       pre_alloc = atoi(argv[2]);
  6586. +       argc -= 2; argv += 2;
  6587. +     }
  6588. +   /* Handle the -dev switch, which specifies device & unit to use as terminal */
  6589. +   if (argc > 3 && !strcmp (argv[1], "-dev"))
  6590. +     {
  6591. +       extern char *far serial_device;
  6592. +       extern long far serial_unit;
  6593. +       serial_device = argv[2];
  6594. +       serial_unit = atoi(argv[3]);
  6595. +       fprintf (stderr, "Using %s (unit %d)\n", serial_device ,serial_unit);
  6596. +       argc -= 3; argv += 3;
  6597. +     }
  6598. +   /* Patch real argc, argv to hide arguments we used */
  6599. +   argv[0] = (*_argv)[0];
  6600. +   *_argv = argv;
  6601. +   *_argc = argc;
  6602. +   expand_path(argv[0], emacs_tool, EMACS_TOOL_SIZE);
  6603. + }
  6604. + void cleanup_amiga(void)
  6605. + {
  6606. +   cleanup_clipboard();
  6607. +   cleanup_amiga_tty();
  6608. +   if (IconBase) CloseLibrary(IconBase);
  6609. + }
  6610. + void amiga_undump_reinit(void)
  6611. + /* Post-undump initialisation */
  6612. + {
  6613. +   extern struct WBStartup *_WBenchMsg;
  6614. +   emacs_malloc_init();
  6615. +   early_amiga_tty();
  6616. +   early_clipboard();
  6617. +   if (!onexit(cleanup_amiga)) _fail("Internal problem with onexit");
  6618. +   make_environ();
  6619. +   IconBase = OpenLibrary("icon.library", 0);
  6620. +   if (!IconBase) _fail("Need icon.library");
  6621. +   amiga_create_icons = _WBenchMsg != 0;
  6622. +   init_amiga_tty(); init_clipboard();
  6623. + }
  6624. + #undef main
  6625. + main(int argc, char **argv)
  6626. + /* Effect: Call emacs_main after doing some early amiga initialisation for emacs.
  6627. + */
  6628. + {
  6629. +   /* This initialisation may steal some command line options */
  6630. +   amiga_early_init(&argc, &argv);
  6631. +   emacs_main(argc, argv);
  6632. + }
  6633. diff -rcP emacs-18.59-fsf/src/amiga_term.c emacs-18.59-amiga/src/amiga_term.c
  6634. *** emacs-18.59-fsf/src/amiga_term.c    Thu Jan  1 00:00:00 1970
  6635. --- emacs-18.59-amiga/src/amiga_term.c    Tue Mar 23 09:45:12 1993
  6636. ***************
  6637. *** 0 ****
  6638. --- 1,388 ----
  6639. + /* Amiga terminal control routines.
  6640. +    Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  6641. + This file is part of GNU Emacs.
  6642. + GNU Emacs is free software; you can redistribute it and/or modify
  6643. + it under the terms of the GNU General Public License as published by
  6644. + the Free Software Foundation; either version 1, or (at your option)
  6645. + any later version.
  6646. + GNU Emacs is distributed in the hope that it will be useful,
  6647. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  6648. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6649. + GNU General Public License for more details.
  6650. + You should have received a copy of the GNU General Public License
  6651. + along with GNU Emacs; see the file COPYING.  If not, write to
  6652. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  6653. + #include <stdio.h>
  6654. + #include <ctype.h>
  6655. + #include "config.h"
  6656. + #include "termhooks.h"
  6657. + #include "termchar.h"
  6658. + #include "termopts.h"
  6659. + /* internal state */
  6660. + /* nonzero means supposed to write text in standout mode.  */
  6661. + static int standout_requested;
  6662. + static int standout_mode;    /* Nonzero when in standout mode.  */
  6663. + static char tens[100] = {
  6664. +     '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  6665. +     '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
  6666. +     '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
  6667. +     '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
  6668. +     '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
  6669. +     '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
  6670. +     '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
  6671. +     '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
  6672. +     '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
  6673. +     '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
  6674. + };
  6675. + static char ones[100] = {
  6676. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6677. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6678. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6679. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6680. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6681. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6682. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6683. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6684. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6685. +     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  6686. + };
  6687. + #define addnum(str, num) if (num < 100) \
  6688. +                              { *--str = ones[num]; *--str = tens[num]; } \
  6689. +                          else do { *--str = '0' + num % 10; num /= 10; } while (num != 0)
  6690. + static background_highlight ();
  6691. + static turn_off_highlight ();
  6692. + /* Cursor motion stuff (from cm.c) */
  6693. + static int curX, curY;
  6694. + /* Move to absolute position, specified origin 0 */
  6695. + Amove_cursor (row, col)
  6696. + {
  6697. +   char buf[32], *pos = buf + 32;
  6698. +   if (curY == row && curX == col)
  6699. +     return;
  6700. +   curX = col; curY = row;
  6701. +   *--pos = 'H';
  6702. +   col = col + 1; row = row + 1;
  6703. +   addnum(pos, col);
  6704. +   *--pos = ';';
  6705. +   addnum(pos, row);
  6706. +   *--pos = 0x9b;
  6707. +   emacs_output(pos, buf + 32 - pos);
  6708. +   if (pos < buf) abort();
  6709. + }
  6710. + Aring_bell ()
  6711. + {
  6712. +   emacs_output("\07", 1);
  6713. + }
  6714. + Aset_terminal_modes ()
  6715. + {
  6716. + }
  6717. + Areset_terminal_modes ()
  6718. + {
  6719. +   turn_off_highlight ();
  6720. + }
  6721. + Aupdate_begin ()
  6722. + {
  6723. +   /* Hide cursor */
  6724. +   emacs_output("\x9b\x30\x20\x70", 4);
  6725. + }
  6726. + Aupdate_end ()
  6727. + {
  6728. +   background_highlight ();
  6729. +   standout_requested = 0;
  6730. +   emacs_output("\x9b\x20\x70", 3); /* Show cursor */
  6731. + }
  6732. + /* Handle highlighting when TN_standout_width (termcap sg) is not specified.
  6733. +    In these terminals, output is affected by the value of standout
  6734. +    mode when the output is written.
  6735. +    These functions are called on all terminals, but do nothing
  6736. +    on terminals whose standout mode does not work that way.  */
  6737. + static turn_off_highlight ()
  6738. + {
  6739. +   if (standout_mode)
  6740. +     {
  6741. +       extern int background, foreground;      
  6742. +       extern int inverse_fill_pen, inverse_text_pen;
  6743. +       int b = background + 40, f = foreground + 30;
  6744. +       if(inverse_fill_pen < 8 && inverse_text_pen < 8)
  6745. +     {
  6746. +       char buf[32], *pos = buf + 32;
  6747. +       /* UnDo inverse fill */
  6748. +       *--pos = '\0';
  6749. +       *--pos = 'm';
  6750. +       addnum(pos, b);
  6751. +       *--pos = ';';
  6752. +       /* UnDo inverse text */
  6753. +       addnum(pos, f);
  6754. +       *--pos = 0x9b;
  6755. +       emacs_output(pos, buf + 32 - pos);
  6756. +     }
  6757. +       else
  6758. +     {
  6759. +       emacs_output("\x9b""27m", 4);
  6760. +     }
  6761. +     }
  6762. +   standout_mode = 0;
  6763. + }
  6764. + static turn_on_highlight ()
  6765. + {
  6766. +   if (!standout_mode)
  6767. +     {
  6768. +       extern int inverse_fill_pen, inverse_text_pen;
  6769. +       int b = inverse_fill_pen + 40, f = inverse_text_pen + 30;
  6770. +       if(inverse_fill_pen < 8 && inverse_text_pen < 8)
  6771. +     {
  6772. +       char buf[32], *pos = buf + 32;
  6773. +       /* Do inverse fill */
  6774. +       *--pos = '\0';
  6775. +       *--pos = 'm';
  6776. +       addnum(pos, b);
  6777. +       *--pos = ';';
  6778. +       /* Do inverse text */
  6779. +       addnum(pos, f);
  6780. +       *--pos = 0x9b;
  6781. +       emacs_output(pos, buf + 32 - pos);
  6782. +     }
  6783. +       else
  6784. +     {
  6785. +       emacs_output("\x9b\x37m", 3);
  6786. +     }
  6787. +     }
  6788. +   standout_mode = 1;
  6789. + }
  6790. + /* Set standout mode to the state it should be in for
  6791. +    empty space inside windows.  What this is,
  6792. +    depends on the user option inverse-video.  */
  6793. + static background_highlight ()
  6794. + {
  6795. +   if (inverse_video)
  6796. +     turn_on_highlight ();
  6797. +   else
  6798. +     turn_off_highlight ();
  6799. + }
  6800. + /* Set standout mode to the mode specified for the text to be output.  */
  6801. + static
  6802. + highlight_if_desired ()
  6803. + {
  6804. +   if (!inverse_video == !standout_requested)
  6805. +     turn_off_highlight ();
  6806. +   else
  6807. +     turn_on_highlight ();
  6808. + }
  6809. + /* External interface to control of standout mode.
  6810. +    Call this when about to modify line at position VPOS
  6811. +    and not change whether it is highlighted.  */
  6812. + Areassert_line_highlight (highlight, vpos)
  6813. +      int highlight;
  6814. +      int vpos;
  6815. + {
  6816. +   standout_requested = highlight;
  6817. + }
  6818. + /* Call this when about to modify line at position VPOS
  6819. +    and change whether it is highlighted.  */
  6820. + Achange_line_highlight (new_highlight, vpos, first_unused_hpos)
  6821. +      int new_highlight, vpos, first_unused_hpos;
  6822. + {
  6823. +   standout_requested = new_highlight;
  6824. +   move_cursor (vpos, 0);
  6825. +   background_highlight ();
  6826. +   clear_end_of_line (first_unused_hpos);
  6827. +   reassert_line_highlight (new_highlight, curY);
  6828. + }
  6829. + /* Erase operations */
  6830. + /* clear from cursor to end of screen */
  6831. + Aclear_to_end ()
  6832. + {
  6833. +   background_highlight ();
  6834. +   emacs_output("\x9bJ", 2);
  6835. + }
  6836. + /* Clear entire screen */
  6837. + Aclear_screen ()
  6838. + {
  6839. +   background_highlight ();
  6840. +   emacs_output("\f", 1);
  6841. +   curX = curY = 0;
  6842. + }
  6843. + /* Clear to end of line, but do not clear any standout marker.
  6844. +    Assumes that the cursor is positioned at a character of real text,
  6845. +    which implies it cannot be before a standout marker
  6846. +    unless the marker has zero width.
  6847. +    Note that the cursor may be moved.  */
  6848. + Aclear_end_of_line (first_unused_hpos)
  6849. +      int first_unused_hpos;
  6850. + {
  6851. +   if (curX >= first_unused_hpos)
  6852. +     return;
  6853. +   background_highlight ();
  6854. +   emacs_output("\x9bK", 2);
  6855. + }
  6856. + Aoutput_chars (string, len)
  6857. +      register char *string;
  6858. +      int len;
  6859. + {
  6860. +   highlight_if_desired ();
  6861. +   curX += len;
  6862. +   emacs_output(string, len);
  6863. + }
  6864. + /* If start is zero, insert blanks instead of a string at start */
  6865. + Ainsert_chars (start, len)
  6866. +      register char *start;
  6867. +      int len;
  6868. + {
  6869. +   char buf[32], *pos = buf + 32;
  6870. +   highlight_if_desired ();
  6871. +   *--pos = '@';
  6872. +   addnum(pos, len);
  6873. +   *--pos = 0x9b;
  6874. +   emacs_output(pos, buf + 32 - pos);
  6875. +   if (pos < buf) abort();
  6876. +   if (start) emacs_output(start, len);
  6877. + }
  6878. + Adelete_chars (n)
  6879. +      register int n;
  6880. + {
  6881. +   char buf[32], *pos = buf + 32;
  6882. +   *--pos = 'P';
  6883. +   addnum(pos, n);
  6884. +   *--pos = 0x9b;
  6885. +   emacs_output(pos, buf + 32 - pos);
  6886. +   if (pos < buf) abort();
  6887. + }
  6888. + /* Insert N lines at vpos VPOS.  If N is negative, delete -N lines.  */
  6889. + Ains_del_lines (vpos, n)
  6890. +      int vpos, n;
  6891. + {
  6892. +   register int i = n > 0 ? n : -n;
  6893. +   char buf[32], *pos = buf + 32;
  6894. +   if (n > 0)
  6895. +     {
  6896. +       i = n;
  6897. +       *--pos = 'L';
  6898. +     }
  6899. +   else
  6900. +     {
  6901. +       i = -n;
  6902. +       *--pos = 'M';
  6903. +     }
  6904. +   if (vpos + i >= screen_height) return;
  6905. +   move_cursor (vpos, 0);
  6906. +   background_highlight ();
  6907. +   addnum(pos, i);
  6908. +   *--pos = 0x9b;
  6909. +   emacs_output(pos, buf + 32 - pos);
  6910. +   if (pos < buf) abort();
  6911. + }
  6912. + Acalculate_costs (extra, costvec, ncostvec)
  6913. +      int extra;
  6914. +      int *costvec, *ncostvec;
  6915. + {
  6916. +   CalcLID(2, 40, extra, 0, costvec, ncostvec);
  6917. + }
  6918. + Aset_terminal_window (size)
  6919. + int size;
  6920. + {
  6921. + }
  6922. + amiga_term_init ()
  6923. + {
  6924. +   must_write_spaces = FALSE;
  6925. +   min_padding_speed = 0;
  6926. +   memory_below_screen = FALSE;
  6927. +   meta_key = TRUE;
  6928. +   scroll_region_ok = FALSE;
  6929. +   line_ins_del_ok = FALSE;    /* much cleaner display when FALSE  -ch3/19/93. */
  6930. +   char_ins_del_ok = FALSE;
  6931. +   fast_clear_end_of_line = TRUE;
  6932. +   no_redraw_on_reenter = FALSE;
  6933. +   clear_screen_hook = Aclear_screen;
  6934. +   clear_end_of_line_hook = Aclear_end_of_line;
  6935. +   clear_to_end_hook = Aclear_to_end;
  6936. +   ins_del_lines_hook = Ains_del_lines;
  6937. +   change_line_highlight_hook = Achange_line_highlight;
  6938. +   insert_chars_hook = Ainsert_chars;
  6939. +   output_chars_hook = Aoutput_chars;
  6940. +   delete_chars_hook = Adelete_chars;
  6941. +   ring_bell_hook = Aring_bell;
  6942. +   reset_terminal_modes_hook = Areset_terminal_modes;
  6943. +   set_terminal_modes_hook = Aset_terminal_modes;
  6944. +   update_begin_hook = Aupdate_begin;
  6945. +   update_end_hook = Aupdate_end;
  6946. +   set_terminal_window_hook = Aset_terminal_window;
  6947. +   move_cursor_hook = Amove_cursor;
  6948. +   reassert_line_highlight_hook = Areassert_line_highlight;
  6949. +   dont_calculate_costs = 1;
  6950. +   calculate_costs_hook = Acalculate_costs;
  6951. +   /* Get screen size from system, or else from somewhere ...  */
  6952. +   get_screen_size (&screen_width, &screen_height);
  6953. +   /* Random defaults to avoid any problems */
  6954. +   if (screen_width <= 0) screen_width = 80;
  6955. +   if (screen_height <= 0) screen_height = 23;
  6956. +   init_baud_rate ();
  6957. + }
  6958. diff -rcP emacs-18.59-fsf/src/amiga_tty.c emacs-18.59-amiga/src/amiga_tty.c
  6959. *** emacs-18.59-fsf/src/amiga_tty.c    Thu Jan  1 00:00:00 1970
  6960. --- emacs-18.59-amiga/src/amiga_tty.c    Sat Jun  5 13:20:50 1993
  6961. ***************
  6962. *** 0 ****
  6963. --- 1,305 ----
  6964. + #include "config.h"
  6965. + #undef NULL
  6966. + #include "lisp.h"
  6967. + #include "termchar.h"
  6968. + #include <stdio.h>
  6969. + #include <errno.h>
  6970. + #include <internal/files.h>
  6971. + #include <internal/vars.h>
  6972. + #undef LONGBITS
  6973. + #include <exec/types.h>
  6974. + #include <dos/dos.h>
  6975. + #include <proto/exec.h>
  6976. + #include "amiga.h"
  6977. + #include "termhooks.h"
  6978. + static int term_initialised;
  6979. + ULONG inputsig;
  6980. + /* A few tty system dependent routines unused on the Amiga */
  6981. + setpgrp_of_tty(int pid) {}
  6982. + init_sigio() {}
  6983. + reset_sigio() {}
  6984. + request_sigio() {}
  6985. + unrequest_sigio() {}
  6986. + /* Return nonzero if safe to use tabs in output.
  6987. +    At the time this is called, init_sys_modes has not been done yet.  */
  6988. + tabs_safe_p()
  6989. + {
  6990. +   if (noninteractive)
  6991. +     return 1;
  6992. +   return 0;            /* Not safe on Amiga !? */
  6993. + }
  6994. + /* Get terminal size from system.
  6995. +    Store number of lines into *heightp and width into *widthp.
  6996. +    If zero or a negative number is stored, the value is not valid.  */
  6997. + get_screen_size (widthp, heightp)
  6998. +      int *widthp, *heightp;
  6999. + {
  7000. +     if (term_initialised && !inhibit_window_system)
  7001. +     get_window_size(widthp, heightp);
  7002. +     else /* We don't known what size the terminal is */
  7003. +     {
  7004. +     *widthp = 0;
  7005. +     *heightp = 0;
  7006. +     }
  7007. + }
  7008. + init_baud_rate ()
  7009. + {
  7010. +   if (noninteractive || !term_initialised) baud_rate = 1200;
  7011. +   else if (!inhibit_window_system) baud_rate = 38400;
  7012. +   else baud_rate = serial_baud_rate();
  7013. + }
  7014. + void check_intuition ()
  7015. + {
  7016. +     if (noninteractive || inhibit_window_system)
  7017. +         error ("You aren't using a window.");
  7018. + }
  7019. + #define TTYBUFSIZE 256        /* Same size as kbd_buffer */
  7020. + static char ttybuf[TTYBUFSIZE];
  7021. + static int tty_count;
  7022. + #define TTYPUT(c) { if (tty_count < TTYBUFSIZE) ttybuf[tty_count++] = c; }
  7023. + static int interrupt_char;
  7024. + void enque(unsigned int c, int meta)
  7025. + /* place input keys in keyboard buffer
  7026. +    If high bit is set, precede character with ^Q (hack).
  7027. +    If meta is true, set high bit.
  7028. +    If both the high bit & meta are true, we have a problem. Ignore it.
  7029. +    If c == AMIGASEQ (256) enqueue the amiga sequence introducer (C-x C-^)
  7030. + */
  7031. + {
  7032. +   /* Hack CSI to be AMIGASEQ (to allow defining function keys, etc) */
  7033. +   if (c == 0233 || c == AMIGASEQ)
  7034. +     {
  7035. +       TTYPUT('x' & 037);
  7036. +       TTYPUT('^' & 037);
  7037. +     }
  7038. +   else if (c >= 0200)    /* Special character, precede with ^Q */
  7039. +     {
  7040. +       TTYPUT('q' & 037);
  7041. +       TTYPUT(c);
  7042. +     }
  7043. +   else
  7044. +     {
  7045. +       if (meta) c |= 0200;
  7046. +       if (c == interrupt_char) Signal(_us, SIGBREAKF_CTRL_C);
  7047. +       else TTYPUT(c);
  7048. +     }
  7049. + }
  7050. + int get_ttycount(void)
  7051. + {
  7052. +   return tty_count;
  7053. + }
  7054. + init_sys_modes ()
  7055. + {
  7056. +   extern int quit_char;
  7057. +   if (noninteractive)
  7058. +     return;
  7059. +   if (inhibit_window_system) clear_screen();
  7060. +   interrupt_char = quit_char;
  7061. +   if (!inhibit_window_system) setup_intchar(interrupt_char);
  7062. + }
  7063. + reset_sys_modes ()
  7064. + {
  7065. +   if (noninteractive)
  7066. +     {
  7067. +       fflush (stdout);
  7068. +       return;
  7069. +     }
  7070. +   move_cursor (screen_height - 1, 0);
  7071. +   clear_end_of_line (screen_width);
  7072. +   /* clear_end_of_line may move the cursor */
  7073. +   move_cursor (screen_height - 1, 0);
  7074. + }
  7075. + void amiga_consume_input(void)
  7076. + {
  7077. +   extern int this_command_key_count;
  7078. +   int force = this_command_key_count == 0;
  7079. +   /* If force is TRUE & some non-keyboard (eg mouse events) input is pending,
  7080. +      insert the appropriate magic sequence in the input stream */
  7081. +   if (term_initialised)
  7082. +     {
  7083. +       if (!inhibit_window_system) check_window(force);
  7084. +       else check_serial(force);
  7085. +       check_arexx(force, TRUE);
  7086. +     }
  7087. + }
  7088. + discard_tty_input ()
  7089. + {
  7090. +   if (noninteractive)
  7091. +     return;
  7092. +   amiga_consume_input();
  7093. +   tty_count = 0;
  7094. +   chkabort();
  7095. + }
  7096. + /* Code for the fd describing the emacs input (terminal or window) */
  7097. + static ULONG __regargs ttyin_select_start(void *userinfo, int rd, int wr)
  7098. + {
  7099. +   if (!inhibit_window_system) force_window();
  7100. +   return tty_count ? -1 : inputsig;
  7101. + }
  7102. + static void __regargs ttyin_select_poll(void *userinfo, int *rd, int *wr)
  7103. + {
  7104. +   amiga_consume_input();
  7105. +   if (!tty_count) *rd = 0;
  7106. + }
  7107. + static int __regargs ttyin_read(void *userinfo, void *buffer, unsigned int length)
  7108. + {
  7109. +   amiga_consume_input();
  7110. +   if (length > tty_count) length = tty_count;
  7111. +   memcpy(buffer, ttybuf, length);
  7112. +   tty_count -= length;
  7113. +   if (tty_count) memmove(ttybuf, ttybuf + length, tty_count - length);
  7114. +   return (int)length;
  7115. + }
  7116. + static int __regargs ttyin_write(void *userinfo, void *buffer, unsigned int length)
  7117. + {
  7118. +   errno = EACCES;
  7119. +   return -1;
  7120. + }
  7121. + static int __regargs ttyin_lseek(void *userinfo, long rpos, int mode)
  7122. + {
  7123. +   errno = ESPIPE;
  7124. +   return -1;
  7125. + }
  7126. + static int __regargs ttyin_close(void *userinfo, int internal)
  7127. + {
  7128. +   return 0;
  7129. + }
  7130. + static int __regargs ttyin_ioctl(void *userinfo, int request, void *data)
  7131. + {
  7132. +   errno = EINVAL;
  7133. +   return -1;
  7134. + }
  7135. + #define CBUFSIZE 1024
  7136. + #undef fwrite
  7137. + #undef fflush
  7138. + char cbuffer[CBUFSIZE + 16], *cbuffer_pos;
  7139. + int emacs_fflush(FILE *f)
  7140. + {
  7141. +     if (noninteractive || f != stdout) return fflush(f);
  7142. +     else
  7143. +     {
  7144. +     int len;
  7145. +     len = cbuffer_pos - cbuffer;
  7146. +     if (term_initialised)
  7147. +         if (!inhibit_window_system) screen_puts(cbuffer, len);
  7148. +         else serial_puts(cbuffer, len);
  7149. +     if (termscript) fwrite (cbuffer, 1, len, termscript);
  7150. +     cbuffer_pos = cbuffer;
  7151. +     return 0;
  7152. +     }
  7153. + }
  7154. + void emacs_putchar(int c)
  7155. + {
  7156. +     if (cbuffer_pos >= cbuffer + CBUFSIZE) emacs_fflush(stdout);
  7157. +     *cbuffer_pos++ = c;
  7158. + }
  7159. + void emacs_output(char *str, int size)
  7160. + {
  7161. +     if (cbuffer_pos + size > cbuffer + CBUFSIZE) emacs_fflush(stdout);
  7162. +     if (size > CBUFSIZE)
  7163. +     {
  7164. +     if (term_initialised)
  7165. +         if (!inhibit_window_system) screen_puts(str, size);
  7166. +         else serial_puts(str, size);
  7167. +     }
  7168. +     else
  7169. +     {
  7170. +     memcpy(cbuffer_pos, str, size);
  7171. +     cbuffer_pos += size;
  7172. +     }
  7173. + }
  7174. + void emacs_fwrite(char *str, unsigned int nblocks, unsigned int len, FILE *f)
  7175. + {
  7176. +     if (noninteractive || f != stdout) fwrite (str, nblocks, len, f);
  7177. +     else
  7178. +     {
  7179. +     unsigned int size;
  7180. +     if (nblocks == 1) size = len; /* Emacs always uses 1 "block" */
  7181. +     else size = nblocks * len;
  7182. +     emacs_output(str, size);
  7183. +     }
  7184. + }
  7185. + void syms_of_amiga_tty(void)
  7186. + {
  7187. +   syms_of_amiga_screen();
  7188. +   syms_of_amiga_rexx();
  7189. + }
  7190. + void init_amiga_tty()
  7191. + {
  7192. +   inputsig = 0;
  7193. +   term_initialised = FALSE;
  7194. +   init_amiga_rexx();
  7195. + }
  7196. + void cleanup_amiga_tty()
  7197. + {
  7198. +   cleanup_amiga_rexx();
  7199. +   cleanup_amiga_serial();
  7200. +   cleanup_amiga_screen();
  7201. + }
  7202. + void early_amiga_tty()
  7203. + {
  7204. +   cbuffer_pos = cbuffer;
  7205. +   tty_count = 0;
  7206. + }
  7207. + void amiga_term_open(void)
  7208. + {
  7209. +   inhibit_window_system ? init_amiga_serial() : init_amiga_screen();
  7210. +   close(0);
  7211. +   if (_alloc_fd((void *)1, FI_READ, ttyin_select_start, ttyin_select_poll, ttyin_read,
  7212. +         ttyin_write, ttyin_lseek, ttyin_close, ttyin_ioctl) == 0)
  7213. +     term_initialised = TRUE;
  7214. +   else _fail("Failed to initialise I/O, no memory ?");
  7215. + }
  7216. diff -rcP emacs-18.59-fsf/src/buffer.c emacs-18.59-amiga/src/buffer.c
  7217. *** emacs-18.59-fsf/src/buffer.c    Wed May 13 19:39:33 1992
  7218. --- emacs-18.59-amiga/src/buffer.c    Sun Nov 22 10:13:24 1992
  7219. ***************
  7220. *** 1137,1143 ****
  7221.   #ifndef VMS
  7222.     /* Maybe this should really use some standard subroutine
  7223.        whose definition is filename syntax dependent.  */
  7224. !   if (buf[strlen (buf) - 1] != '/')
  7225.       strcat (buf, "/");
  7226.   #endif /* not VMS */
  7227.     current_buffer->directory = build_string (buf);
  7228. --- 1137,1147 ----
  7229.   #ifndef VMS
  7230.     /* Maybe this should really use some standard subroutine
  7231.        whose definition is filename syntax dependent.  */
  7232. !   if (buf[strlen (buf) - 1] != '/'
  7233. ! #ifdef AMIGA
  7234. ! && buf[strlen (buf) -1] != ':'
  7235. ! #endif /*AMIGA  */
  7236. ! )
  7237.       strcat (buf, "/");
  7238.   #endif /* not VMS */
  7239.     current_buffer->directory = build_string (buf);
  7240. diff -rcP emacs-18.59-fsf/src/callproc.c emacs-18.59-amiga/src/callproc.c
  7241. *** emacs-18.59-fsf/src/callproc.c    Sun Jul 12 03:26:01 1992
  7242. --- emacs-18.59-amiga/src/callproc.c    Sun Nov 22 10:13:32 1992
  7243. ***************
  7244. *** 124,134 ****
  7245.     CHECK_STRING (args[0], 0);
  7246.   
  7247.     if (nargs <= 1 || NULL (args[1]))
  7248. ! #ifdef VMS
  7249. !     args[1] = build_string ("NLA0:");
  7250. ! #else
  7251. !     args[1] = build_string ("/dev/null");
  7252. ! #endif /* not VMS */
  7253.     else
  7254.       args[1] = Fexpand_file_name (args[1], current_buffer->directory);
  7255.   
  7256. --- 124,130 ----
  7257.     CHECK_STRING (args[0], 0);
  7258.   
  7259.     if (nargs <= 1 || NULL (args[1]))
  7260. !     args[1] = build_string (PATH_NULL);
  7261.     else
  7262.       args[1] = Fexpand_file_name (args[1], current_buffer->directory);
  7263.   
  7264. ***************
  7265. *** 177,186 ****
  7266.   
  7267.     if (XTYPE (buffer) == Lisp_Int)
  7268.   #ifdef VMS
  7269. !     fd[1] = open ("NLA0:", 0), fd[0] = -1;
  7270.   #else
  7271. !     fd[1] = open ("/dev/null", O_WRONLY), fd[0] = -1;
  7272. ! #endif /* not VMS */
  7273.     else
  7274.       {
  7275.         pipe (fd);
  7276. --- 173,181 ----
  7277.   
  7278.     if (XTYPE (buffer) == Lisp_Int)
  7279.   #ifdef VMS
  7280. !     fd[1] = open (PATH_NULL, 0), fd[0] = -1;
  7281.   #else
  7282. !     fd[1] = open (PATH_NULL, O_WRONLY), fd[0] = -1;
  7283.     else
  7284.       {
  7285.         pipe (fd);
  7286. ***************
  7287. *** 193,198 ****
  7288. --- 188,209 ----
  7289.     synch_process_death = 0;
  7290.     synch_process_retcode = 0;
  7291.   
  7292. + #ifdef AMIGA
  7293. +   {
  7294. +     register unsigned char *temp;
  7295. +     if (XTYPE (current_buffer->directory) == Lisp_String)
  7296. +       {
  7297. +     register int i;
  7298. +     i = XSTRING (current_buffer->directory)->size;
  7299. +     temp = (unsigned char *) alloca (i + 1);
  7300. +     bcopy (XSTRING (current_buffer->directory)->data, temp, i);
  7301. +     temp[i] = 0;
  7302. +       }
  7303. +     pid = exec(new_argv[0], new_argv, filefd, fd[1], temp, amiga_process_stack_size);
  7304. +   }
  7305. + #else  
  7306.     {
  7307.       /* child_setup must clobber environ in systems with true vfork.
  7308.          Protect it from permanent change.  */
  7309. ***************
  7310. *** 230,235 ****
  7311. --- 241,247 ----
  7312.       close (filefd);
  7313.       close (fd1);
  7314.     }
  7315. + #endif /* not AMIGA */
  7316.   
  7317.     if (pid < 0)
  7318.       {
  7319. ***************
  7320. *** 302,308 ****
  7321.     register Lisp_Object filename_string, start, end, status;
  7322.     char tempfile[20];
  7323.   
  7324. !   strcpy (tempfile, "/tmp/emacsXXXXXX");
  7325.     mktemp (tempfile);
  7326.   
  7327.     filename_string = build_string (tempfile);
  7328. --- 314,320 ----
  7329.     register Lisp_Object filename_string, start, end, status;
  7330.     char tempfile[20];
  7331.   
  7332. !   strcpy (tempfile, PATH_TEMP);
  7333.     mktemp (tempfile);
  7334.   
  7335.     filename_string = build_string (tempfile);
  7336. ***************
  7337. *** 318,323 ****
  7338. --- 330,336 ----
  7339.     unlink (tempfile);
  7340.     return status;
  7341.   }
  7342. + #ifndef AMIGA
  7343.   
  7344.   /* This is the last thing run in a newly forked inferior
  7345.      either synchronous or asynchronous.
  7346. ***************
  7347. *** 425,430 ****
  7348. --- 438,444 ----
  7349.     write (1, new_argv[0], strlen (new_argv[0]));
  7350.     _exit (1);
  7351.   }
  7352. + #endif /* not AMIGA */
  7353.   
  7354.   init_callproc ()
  7355.   {
  7356. ***************
  7357. *** 437,442 ****
  7358. --- 451,465 ----
  7359.     Vexec_path = decode_env_path (0, PATH_EXEC);
  7360.     Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
  7361.     Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
  7362. + #ifdef AMIGA
  7363. +   {
  7364. +     char *amiga_path(), *apath = amiga_path();
  7365. +     Vexec_path = nconc2 (decode_env_path (0, apath), Vexec_path);
  7366. +     Vexec_path = nconc2 (decode_env_path (0, "GNUEmacs:c"), Vexec_path);
  7367. +     free(apath);
  7368. +   }
  7369. + #endif  
  7370.   
  7371.     execdir = Fdirectory_file_name (Vexec_directory);
  7372.     if (access (XSTRING (execdir)->data, 0) < 0)
  7373. ***************
  7374. *** 447,453 ****
  7375.       }
  7376.   
  7377.     sh = (char *) egetenv ("SHELL");
  7378. !   Vshell_file_name = build_string (sh ? sh : "/bin/sh");
  7379.   
  7380.   #ifndef MAINTAIN_ENVIRONMENT
  7381.     /* The equivalent of this operation was done
  7382. --- 470,476 ----
  7383.       }
  7384.   
  7385.     sh = (char *) egetenv ("SHELL");
  7386. !   Vshell_file_name = build_string (sh ? sh : PATH_SHELL);
  7387.   
  7388.   #ifndef MAINTAIN_ENVIRONMENT
  7389.     /* The equivalent of this operation was done
  7390. diff -rcP emacs-18.59-fsf/src/dired.c emacs-18.59-amiga/src/dired.c
  7391. *** emacs-18.59-fsf/src/dired.c    Mon Mar 23 04:16:41 1992
  7392. --- emacs-18.59-amiga/src/dired.c    Sun Nov 22 10:13:54 1992
  7393. ***************
  7394. *** 385,391 ****
  7395. --- 385,395 ----
  7396.   
  7397.     bcopy (XSTRING (dirname)->data, fullname, pos);
  7398.   #ifndef VMS
  7399. + #ifdef AMIGA
  7400. +   if ((fullname[pos - 1] != '/')&&(fullname[pos - 1] != ':'))
  7401. + #else
  7402.     if (fullname[pos - 1] != '/')
  7403. + #endif
  7404.       fullname[pos++] = '/';
  7405.   #endif
  7406.   
  7407. diff -rcP emacs-18.59-fsf/src/dispnew.c emacs-18.59-amiga/src/dispnew.c
  7408. *** emacs-18.59-fsf/src/dispnew.c    Fri Jul 24 19:31:36 1992
  7409. --- emacs-18.59-amiga/src/dispnew.c    Sun Nov 22 10:14:00 1992
  7410. ***************
  7411. *** 674,684 ****
  7412. --- 674,700 ----
  7413.     int preempt_count = baud_rate / 2400 + 1;
  7414.     extern input_pending;
  7415.   
  7416. +   start_count(0);
  7417.     if (screen_height == 0) abort (); /* Some bug zeros some core */
  7418.   
  7419.     if (force_redisplay)
  7420.       force = 1;
  7421.   
  7422. + #ifdef FAST_DISPLAY
  7423. +   /* Don't compute for i/d line if just want cursor motion. */
  7424. +   /* Don't allow preemption, etc either */
  7425. +   for (i = 0; i < screen_height; i++)
  7426. +     if (new_screen->enable[i])
  7427. +       break;
  7428. +   if (i >= screen_height)
  7429. +     {
  7430. +       update_begin();
  7431. +       goto update_done;
  7432. +     }
  7433. + #endif
  7434.     if (!force)
  7435.       detect_input_pending ();
  7436.     if (!force
  7437. ***************
  7438. *** 695,704 ****
  7439.     if (!line_ins_del_ok)
  7440.       inhibit_hairy_id = 1;
  7441.   
  7442.     /* Don't compute for i/d line if just want cursor motion. */
  7443.     for (i = 0; i < screen_height; i++)
  7444. !     if (new_screen->enable)
  7445.         break;
  7446.   
  7447.     /* Try doing i/d line, if not yet inhibited.  */
  7448.     if (!inhibit_hairy_id && i < screen_height)
  7449. --- 711,722 ----
  7450.     if (!line_ins_del_ok)
  7451.       inhibit_hairy_id = 1;
  7452.   
  7453. + #ifndef FAST_DISPLAY
  7454.     /* Don't compute for i/d line if just want cursor motion. */
  7455.     for (i = 0; i < screen_height; i++)
  7456. !     if (new_screen->enable[i])
  7457.         break;
  7458. + #endif
  7459.   
  7460.     /* Try doing i/d line, if not yet inhibited.  */
  7461.     if (!inhibit_hairy_id && i < screen_height)
  7462. ***************
  7463. *** 742,747 ****
  7464. --- 760,768 ----
  7465.         update_line (i);
  7466.       }
  7467.       }
  7468. + #ifdef FAST_DISPLAY
  7469. + update_done:
  7470. + #endif
  7471.     pause = (i < screen_height - 1) ? i + 1 : 0;
  7472.   
  7473.     /* Now just clean up termcap drivers and set cursor, etc.  */
  7474. ***************
  7475. *** 781,786 ****
  7476. --- 802,808 ----
  7477.       }
  7478.   
  7479.     bzero (new_screen->enable, screen_height);
  7480. +   stop_count(0);
  7481.     return pause;
  7482.   }
  7483.   
  7484. ***************
  7485. *** 894,899 ****
  7486. --- 916,972 ----
  7487.     else
  7488.       reassert_line_highlight (new_screen->highlight[vpos], vpos);
  7489.   
  7490. + #ifdef FAST_DISPLAY
  7491. +   if (current_screen->enable[vpos])
  7492. +   {
  7493. +       obody = current_screen->contents[vpos];
  7494. +       olen = current_screen->used[vpos];
  7495. +   }
  7496. +   else olen = 0;
  7497. +   nbody = new_screen->contents[vpos];
  7498. +   nlen = new_screen->used[vpos];
  7499. +   
  7500. +   /* Pretend trailing spaces are not there at all,
  7501. +      unless for one reason or another we must write all spaces.  */
  7502. +   /* We know that the previous character byte contains 0.  */
  7503. +   if (! new_screen->highlight[vpos])
  7504. +   {
  7505. +       if (!must_write_spaces)
  7506. +       while (nbody[nlen - 1] == ' ')
  7507. +           nlen--;
  7508. +   }
  7509. +   else
  7510. +   {
  7511. +       /* For an inverse-video line, give it extra trailing spaces
  7512. +      all the way to the screen edge
  7513. +      so that the reverse video extends all the way across.  */
  7514. +       while (nlen < screen_width - 1)
  7515. +       nbody[nlen++] = ' ';
  7516. +   }
  7517. +   
  7518. +   while (olen > 0 && nlen > 0 && *obody == *nbody)
  7519. +   {
  7520. +       olen--; nlen--; obody++; nbody++;
  7521. +   }
  7522. +   if (olen > 0 || nlen > 0)
  7523. +       move_cursor (vpos, nbody - new_screen->contents[vpos]);
  7524. +   if (nlen > 0) output_chars (nbody, nlen);
  7525. +   
  7526. +   if (olen > nlen && new_screen->used[vpos] != screen_width)
  7527. +       clear_end_of_line(current_screen->used[vpos]);
  7528. +   /* Exchange contents between current_screen and new_screen.  */
  7529. +   temp = new_screen->contents[vpos];
  7530. +   new_screen->contents[vpos] = current_screen->contents[vpos];
  7531. +   current_screen->contents[vpos] = temp;
  7532. +   
  7533. +   /* One way or another, this will enable the line being updated.  */
  7534. +   current_screen->enable[vpos] = 1;
  7535. +   current_screen->used[vpos] = new_screen->used[vpos];
  7536. +   current_screen->highlight[vpos] = new_screen->highlight[vpos];
  7537. + #else /* not FAST_DISPLAY */
  7538.     /* ??? */
  7539.     if (! current_screen->enable[vpos])
  7540.       {
  7541. ***************
  7542. *** 1172,1177 ****
  7543. --- 1245,1251 ----
  7544.     temp = new_screen->contents[vpos];
  7545.     new_screen->contents[vpos] = current_screen->contents[vpos];
  7546.     current_screen->contents[vpos] = temp;
  7547. + #endif /* not FAST_DISPLAY */
  7548.   }
  7549.   
  7550.   count_blanks (str)
  7551. ***************
  7552. *** 1577,1584 ****
  7553. --- 1651,1668 ----
  7554.     cursor_in_echo_area = 0;
  7555.     terminal_type = (char *) 0;
  7556.   
  7557. + #ifdef AMIGA
  7558. +   amiga_term_open();
  7559. + #endif
  7560.     if (!inhibit_window_system)
  7561.       {
  7562. + #ifdef AMIGA
  7563. +       amiga_term_init();
  7564. +       /* Using Intuition V2.04 */
  7565. +       Vwindow_system = intern ("intuition");
  7566. +       Vwindow_system_version = make_number (2);
  7567. +       goto term_init_done;
  7568. + #endif /* AMIGA */
  7569.   #ifdef HAVE_X_WINDOWS
  7570.         extern char *alternate_display;
  7571.         char *disp = (char *) egetenv ("DISPLAY");
  7572. diff -rcP emacs-18.59-fsf/src/doc.c emacs-18.59-amiga/src/doc.c
  7573. *** emacs-18.59-fsf/src/doc.c    Tue Jan  8 17:25:38 1991
  7574. --- emacs-18.59-amiga/src/doc.c    Sun Nov 22 10:14:02 1992
  7575. ***************
  7576. *** 21,26 ****
  7577. --- 21,27 ----
  7578.   #include "config.h"
  7579.   #include "lisp.h"
  7580.   #include "buffer.h"
  7581. + #include "paths.h"
  7582.   
  7583.   #include <sys/types.h>
  7584.   #include <sys/file.h>    /* Must be after sys/types.h for USG and BSD4_1*/
  7585. ***************
  7586. *** 188,194 ****
  7587.   
  7588.   #ifndef CANNOT_DUMP
  7589.     name = (char *) alloca (XSTRING (filename)->size + 8);
  7590. !   strcpy (name, "../etc/");
  7591.   #else /* CANNOT_DUMP */
  7592.     CHECK_STRING (Vexec_directory, 0);
  7593.     name = (char *) alloca (XSTRING (filename)->size +
  7594. --- 189,195 ----
  7595.   
  7596.   #ifndef CANNOT_DUMP
  7597.     name = (char *) alloca (XSTRING (filename)->size + 8);
  7598. !   strcpy (name, RELPATH_DOC);
  7599.   #else /* CANNOT_DUMP */
  7600.     CHECK_STRING (Vexec_directory, 0);
  7601.     name = (char *) alloca (XSTRING (filename)->size +
  7602. diff -rcP emacs-18.59-fsf/src/dostrip.c emacs-18.59-amiga/src/dostrip.c
  7603. *** emacs-18.59-fsf/src/dostrip.c    Thu Jan  1 00:00:00 1970
  7604. --- emacs-18.59-amiga/src/dostrip.c    Sun Nov 22 10:14:02 1992
  7605. ***************
  7606. *** 0 ****
  7607. --- 1,23 ----
  7608. + #include <stdio.h>
  7609. + #define SIZE 2048
  7610. + main(int argc, char **argv)
  7611. + {
  7612. +     char buf[SIZE];
  7613. +     buf[SIZE - 1] = 0;
  7614. +     while (fgets(buf, SIZE - 1, stdin))
  7615. +     {
  7616. +     if (buf[0] != '#')
  7617. +     {
  7618. +         char *p = buf, *e;
  7619. +         while (*p && *p == ' ') p++;
  7620. +         e = p + strlen(p);
  7621. +         while (e > p && (e[-1] == ' ' || e[-1] == '\t' || e[-1] == '\n')) e--;
  7622. +         *e = '\0';
  7623. +         if (*p) puts(p);
  7624. +     }
  7625. +     }
  7626. + }
  7627. diff -rcP emacs-18.59-fsf/src/emacs.c emacs-18.59-amiga/src/emacs.c
  7628. *** emacs-18.59-fsf/src/emacs.c    Sat Oct 17 03:51:00 1992
  7629. --- emacs-18.59-amiga/src/emacs.c    Sun Nov 22 10:14:08 1992
  7630. ***************
  7631. *** 78,83 ****
  7632. --- 78,87 ----
  7633.   #endif
  7634.   #endif
  7635.   
  7636. + #ifdef AMIGA_DUMP
  7637. + #define HAVE_SHM        /* Simplifies the ifdefs */
  7638. + #endif
  7639.   #ifndef O_RDWR
  7640.   #define O_RDWR 2
  7641.   #endif
  7642. ***************
  7643. *** 323,328 ****
  7644. --- 327,333 ----
  7645.     xargc = argc;
  7646.   #endif
  7647.   
  7648. + #ifndef AMIGA
  7649.   /* Handle the -t switch, which specifies filename to use as terminal */
  7650.     if (skip_args + 2 < argc && !strcmp (argv[skip_args + 1], "-t"))
  7651.       {
  7652. ***************
  7653. *** 336,341 ****
  7654. --- 341,347 ----
  7655.         inhibit_window_system = 1;    /* -t => -nw */
  7656.   #endif
  7657.       }
  7658. + #endif
  7659.   #ifdef HAVE_X_WINDOWS
  7660.   /* Handle the -d switch, which means use a different display for X */
  7661.     if (skip_args + 2 < argc && (!strcmp (argv[skip_args + 1], "-d") ||
  7662. ***************
  7663. *** 717,723 ****
  7664. --- 723,733 ----
  7665.   #ifdef VMS
  7666.   #define SEPCHAR ','
  7667.   #else
  7668. + #ifdef AMIGA            /* Can't use : on Amiga */
  7669. + #define SEPCHAR ','
  7670. + #else
  7671.   #define SEPCHAR ':'
  7672. + #endif
  7673.   #endif
  7674.   
  7675.   Lisp_Object
  7676. diff -rcP emacs-18.59-fsf/src/exec.c emacs-18.59-amiga/src/exec.c
  7677. *** emacs-18.59-fsf/src/exec.c    Thu Jan  1 00:00:00 1970
  7678. --- emacs-18.59-amiga/src/exec.c    Sat Oct 24 12:59:54 1992
  7679. ***************
  7680. *** 0 ****
  7681. --- 1,138 ----
  7682. + #include "amiga.h"
  7683. + #include "processes.h"
  7684. + #include <amiga/ioctl.h>
  7685. + #include <exec/memory.h>
  7686. + #include <dos/dosextens.h>
  7687. + #include <dos/dostags.h>
  7688. + #include <string.h>
  7689. + int eexec(char *program, char **argv, int input, int output, int error,
  7690. +       char *dir, int stacksize)
  7691. + /* input = -1 -> inherit Input()
  7692. +    output = -1 -> inherit Output()
  7693. +    error = -1 -> inherit pr_CES
  7694. +    error = -2 -> stderr = stdout */
  7695. + {
  7696. +   int index, comsize, close_input, close_output, close_error;
  7697. +   char *combuf, *bp;
  7698. +   BPTR in, out, err, dirlock;
  7699. +   int _pseudo_close(int fd);
  7700. +   comsize = 256;
  7701. +   combuf = malloc(comsize);
  7702. +   if (input == -1)
  7703. +     {
  7704. +       in = Input();
  7705. +       close_input = FALSE;
  7706. +     }
  7707. +   else
  7708. +     {
  7709. +       if (ioctl(input, _AMIGA_GET_FH, &in) == -1) in = 0;
  7710. +       close_input = TRUE;
  7711. +       _pseudo_close(input);
  7712. +     }
  7713. +   if (output == -1)
  7714. +     {
  7715. +       out = Output();
  7716. +       close_output = FALSE;
  7717. +     }
  7718. +   else
  7719. +     {
  7720. +       if (ioctl(output, _AMIGA_GET_FH, &out) == -1) out = 0;
  7721. +       close_output = out != in;
  7722. +       _pseudo_close(output);
  7723. +     }
  7724. +   if (error == -1)
  7725. +     {
  7726. +       err = _us->pr_CES;
  7727. +       close_error = FALSE;
  7728. +     }
  7729. +   else if (error == -2)
  7730. +     {
  7731. +       err = out;
  7732. +       close_error = FALSE;
  7733. +     }
  7734. +   else
  7735. +     {
  7736. +       if (ioctl(error, _AMIGA_GET_FH, &err) == -1) err = 0;
  7737. +       close_error = err != out && err != in;
  7738. +       _pseudo_close(error);
  7739. +     }
  7740. +   /* pr_CES is not always defined */
  7741. +   if (in && out && (err || error == -1))
  7742. +     if (combuf)
  7743. +       {
  7744. +     bp = combuf;
  7745. +     for (index = 0; argv[index] != 0; index++)
  7746. +       {
  7747. +         /* Use program as argv[0]. This loses some information, but ... */
  7748. +         char *arg = index == 0 ? program : argv[index];
  7749. +         char *s;
  7750. +         int len;
  7751. +         len = 3;
  7752. +         s = arg;
  7753. +         while (*s)
  7754. +           {
  7755. +         len++;
  7756. +         if (*s == '*' || *s == '"' || *s == '\n') len++;
  7757. +         s++;
  7758. +           }
  7759. +         if (bp + len + 1 >= combuf + comsize)
  7760. +           {
  7761. +         char *newbuf;
  7762. +         comsize += comsize + len;
  7763. +         newbuf = realloc(combuf, comsize);
  7764. +         if (!newbuf) { errno = ENOMEM; goto error; }
  7765. +         bp = newbuf + (bp - combuf);
  7766. +         combuf = newbuf;
  7767. +           }
  7768. +         *bp++ = ' ';
  7769. +         *bp++ = '"';
  7770. +         s = arg;
  7771. +         while (*s)
  7772. +           {
  7773. +         if (*s == '"' || *s == '*') *bp++ = '*';
  7774. +         else if (*s == '\n') *bp++ = '+';
  7775. +         *bp++ = *s++;
  7776. +           }
  7777. +         *bp++ = '"';
  7778. +       }
  7779. +     *bp = '\0';
  7780. +     if (dir) dirlock = Lock(dir, SHARED_LOCK);
  7781. +     else dirlock = 0;
  7782. +     if (dirlock || !dir)
  7783. +       {
  7784. +         int pid = _start_process(combuf, in, close_input, out, close_output,
  7785. +                      err, close_error, dirlock, stacksize);
  7786. +         if (pid != -1)
  7787. +           {
  7788. +         free(combuf);
  7789. +         return pid;
  7790. +           }
  7791. +       }
  7792. +     else errno = convert_oserr(IoErr());
  7793. +     if (dirlock) UnLock(dirlock);
  7794. +       }
  7795. +     else errno = ENOMEM;
  7796. +  error:
  7797. +   if (in && close_input) Close(in);
  7798. +   if (out && close_output) Close(out);
  7799. +   if (err && close_error) Close(err);
  7800. +   if (combuf) free(combuf);
  7801. +   return -1;
  7802. + }
  7803. + int exec(char *program, char **argv, int input, int output, 
  7804. +       char *dir, int stacksize)
  7805. + {
  7806. +   return eexec(program, argv, input, output, -1, dir, stacksize);
  7807. + }
  7808. diff -rcP emacs-18.59-fsf/src/fileio.c emacs-18.59-amiga/src/fileio.c
  7809. *** emacs-18.59-fsf/src/fileio.c    Tue Oct  6 22:02:20 1992
  7810. --- emacs-18.59-amiga/src/fileio.c    Sun Nov 22 10:14:24 1992
  7811. ***************
  7812. *** 147,152 ****
  7813. --- 147,155 ----
  7814.     p = beg + XSTRING (file)->size;
  7815.   
  7816.     while (p != beg && p[-1] != '/'
  7817. + #ifdef    AMIGA
  7818. +          && p[-1] != ':'
  7819. + #endif    /* AMIGA */
  7820.   #ifdef VMS
  7821.        && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  7822.   #endif /* VMS */
  7823. ***************
  7824. *** 174,179 ****
  7825. --- 177,185 ----
  7826.     end = p = beg + XSTRING (file)->size;
  7827.   
  7828.     while (p != beg && p[-1] != '/'
  7829. + #ifdef    AMIGA
  7830. +          && p[-1] != ':'
  7831. + #endif    /* AMIGA */
  7832.   #ifdef VMS
  7833.        && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  7834.   #endif /* VMS */
  7835. ***************
  7836. *** 248,256 ****
  7837. --- 254,268 ----
  7838.         out[size] = '\0';
  7839.       }
  7840.   #else /* not VMS */
  7841. + #ifdef    AMIGA
  7842. +   /* AmigaDOS syntax, append slash if the last char isn't a ':' or '/' */
  7843. +   if (out[size] != '/' && out[size] != ':' && size != 0)
  7844. +     strcat (out, "/");
  7845. + #else    /* not AMIGA */
  7846.     /* For Unix syntax, Append a slash if necessary */
  7847.     if (out[size] != '/')
  7848.       strcat (out, "/");
  7849. + #endif /* not AMIGA */
  7850.   #endif /* not VMS */
  7851.     return out;
  7852.   }
  7853. ***************
  7854. *** 464,469 ****
  7855. --- 476,585 ----
  7856.        (name, defalt)
  7857.        Lisp_Object name, defalt;
  7858.   {
  7859. + #ifdef AMIGA
  7860. +   unsigned char *nm, *tilde, *newdir, *colon, *t_pos, *target;
  7861. +   CHECK_STRING (name, 0);
  7862. +   nm = XSTRING (name)->data;
  7863. +   /* Find base directory */
  7864. +   if (NULL (defalt))
  7865. +       defalt = current_buffer->directory;
  7866. +   CHECK_STRING (defalt, 1);
  7867. +   newdir = XSTRING (defalt)->data;
  7868. +   /* Concat newdir w/ nm and canonicalize */
  7869. +   /* newdir always contains at least the device name.
  7870. +      It is assumed canonical */
  7871. +   target = (unsigned char *)alloca(strlen(nm) + strlen(newdir) + 2);
  7872. +   file_name_as_directory (target, newdir);
  7873. +   t_pos = target + strlen(target);
  7874. +   while (*nm)
  7875. +   {
  7876. +       unsigned char *comp_end = nm;
  7877. +       int comp_len;
  7878. +       /* Find next component of path (everything upto the next /) */
  7879. +       do comp_end++; while (comp_end[0] && comp_end[-1] != '/' && comp_end[-1] != ':');
  7880. +       comp_len = comp_end - nm;
  7881. +       if (comp_len == 1 && nm[0] == '/' ||
  7882. +       nm[0] == '.' && nm[1] == '.' &&
  7883. +       (comp_len == 2 || comp_len == 3 && nm[2] == '/'))
  7884. +       {
  7885. +       /* Previous directory */
  7886. +       if (t_pos > target && t_pos[-1] != ':')
  7887. +       {
  7888. +           t_pos--; /* Back up over / */
  7889. +           while (t_pos > target &&
  7890. +              t_pos[-1] != ':' && t_pos[-1] != '/') t_pos--;
  7891. +       }
  7892. +       }
  7893. +       else if (comp_len == 2 && nm[0] == '.' && nm[1] == '/' ||
  7894. +            comp_len == 1 && nm[0] == '.') ; /* Ignore . */
  7895. +       else if (nm[0] == ':') /* Just keep disk name */
  7896. +       {
  7897. +       char *new_pos;
  7898. +       *t_pos = 0; /* Limit search for : */
  7899. +       t_pos = index(target, ':');
  7900. +       if (t_pos) t_pos++;
  7901. +       else t_pos = target;
  7902. +       }
  7903. +       else if (nm[0] == '~' || index(nm, ':'))
  7904. +       {
  7905. +       char *exp_name;
  7906. +       if (nm[0] == '~')
  7907. +           if (nm[1] == '/' || nm[1] == 0) /* Home directory */
  7908. +           {
  7909. +           newdir = (unsigned char *) egetenv ("HOME");
  7910. +           if (!newdir) newdir = (unsigned char *) "s:";
  7911. +           }
  7912. +           else
  7913. +           {
  7914. +           /* Handle ~ followed by user name.  */
  7915. +           char lastc = nm[comp_len - 1];
  7916. +           int len = comp_len - 1;
  7917. +           if (lastc == ':' || lastc == '/') len--;
  7918. +           /* ~name becomes name: */
  7919. +           newdir = (unsigned char *) alloca (len + 2);
  7920. +           bcopy((char *) nm + 1, newdir, len);
  7921. +           newdir[len] = ':';
  7922. +           newdir[len + 1] = 0;
  7923. +           }
  7924. +       else /* we have name: */
  7925. +       {
  7926. +           newdir = (char *)alloca(comp_len + 1);
  7927. +           bcopy(nm, newdir, comp_len);
  7928. +           newdir[comp_len] = 0;
  7929. +       }
  7930. +       exp_name = (char *)alloca(1024);
  7931. +       if (expand_path(newdir, exp_name, 1024))
  7932. +       {
  7933. +           char *colon = strchr(exp_name, ':');
  7934. +           /* Detect paths with multiple colons (eg from PATH:) and
  7935. +          leave them alone. They create confusion. */
  7936. +           if (!(colon && strchr(colon + 1, ':'))) newdir = exp_name;
  7937. +       }
  7938. +       target = (unsigned char *)alloca(strlen(nm) + strlen(newdir) + 2);
  7939. +       file_name_as_directory (target, newdir);
  7940. +       t_pos = target + strlen(target);
  7941. +       }
  7942. +       else /* Copy component */
  7943. +       {
  7944. +       bcopy(nm, t_pos, comp_len);
  7945. +       t_pos += comp_len;
  7946. +       }
  7947. +       nm = comp_end;
  7948. +   }
  7949. +   return make_string (target, t_pos - target);
  7950. + #else /* not AMIGA */
  7951.     unsigned char *nm;
  7952.     
  7953.     register unsigned char *newdir, *p, *o;
  7954. ***************
  7955. *** 795,800 ****
  7956. --- 911,917 ----
  7957.       }
  7958.   
  7959.     return make_string (target, o - target);
  7960. + #endif /* not AMIGA */
  7961.   }
  7962.   
  7963.   DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
  7964. ***************
  7965. *** 825,830 ****
  7966. --- 942,964 ----
  7967.   
  7968.     for (p = nm; p != endp; p++)
  7969.       {
  7970. + #ifdef AMIGA
  7971. +       if (p[0] == '~' && p != nm && p[-1] == '/')
  7972. +     {
  7973. +         nm = p;
  7974. +         substituted = 1;
  7975. +     }
  7976. +       else if (p[0] == ':')
  7977. +     {
  7978. +           char *p2 = p;
  7979. +       while (p2 > nm && p2[-1] != ':' && p2[-1] != '/') p2--;
  7980. +       if (p2 != nm)
  7981. +         {
  7982. +           nm = p2;
  7983. +           substituted = 1;
  7984. +         }
  7985. +     }
  7986. + #else /* not AMIGA */
  7987.         if ((p[0] == '~' ||
  7988.   #ifdef APOLLO
  7989.          /* // at start of file name is meaningful in Apollo system */
  7990. ***************
  7991. *** 845,850 ****
  7992. --- 979,985 ----
  7993.         nm = p;
  7994.         substituted = 1;
  7995.       }
  7996. + #endif /* not AMIGA */
  7997.       }
  7998.   
  7999.   #ifdef VMS
  8000. ***************
  8001. *** 1353,1358 ****
  8002. --- 1488,1500 ----
  8003.   
  8004.     CHECK_STRING (filename, 0);
  8005.     ptr = XSTRING (filename)->data;
  8006. + #ifdef    AMIGA
  8007. +   /* An absolute filename has a non-leading ':' in it */
  8008. +   if (*ptr != ':')
  8009. +       while (*ptr)
  8010. +       if (*ptr++ == ':') return Qt;
  8011. +   return Qnil;
  8012. + #else    /* not AMIGA */
  8013.     if (*ptr == '/' || *ptr == '~'
  8014.   #ifdef VMS
  8015.   /* ??? This criterion is probably wrong for '<'.  */
  8016. ***************
  8017. *** 1364,1369 ****
  8018. --- 1506,1512 ----
  8019.       return Qt;
  8020.     else
  8021.       return Qnil;
  8022. + #endif /* not AMIGA */
  8023.   }
  8024.   
  8025.   DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
  8026. diff -rcP emacs-18.59-fsf/src/firstfile.c emacs-18.59-amiga/src/firstfile.c
  8027. *** emacs-18.59-fsf/src/firstfile.c    Thu Jan  1 00:00:00 1970
  8028. --- emacs-18.59-amiga/src/firstfile.c    Sun Nov 22 10:14:28 1992
  8029. ***************
  8030. *** 0 ****
  8031. --- 1,4 ----
  8032. + int first_data = 1;
  8033. + int first_bss;
  8034. + void first_function() { }
  8035. diff -rcP emacs-18.59-fsf/src/indent.c emacs-18.59-amiga/src/indent.c
  8036. *** emacs-18.59-fsf/src/indent.c    Sat Apr 18 16:01:07 1992
  8037. --- emacs-18.59-amiga/src/indent.c    Sun Nov 22 10:14:38 1992
  8038. ***************
  8039. *** 35,40 ****
  8040. --- 35,45 ----
  8041.   #define min(a, b) ((a) < (b) ? (a) : (b))
  8042.   #define max(a, b) ((a) > (b) ? (a) : (b))
  8043.   
  8044. + #ifdef EIGHT_BIT
  8045. + /* Visible characters */
  8046. + extern char visible[];
  8047. + #endif
  8048.   /* These three values memoize the current column to avoid recalculation */
  8049.   /* Some things in set last_known_column_point to -1
  8050.     to mark the memoized value as invalid */
  8051. ***************
  8052. *** 115,121 ****
  8053. --- 120,130 ----
  8054.       }
  8055.   
  8056.         c = *--ptr;
  8057. + #ifdef EIGHT_BIT
  8058. +       if (visible[c])
  8059. + #else
  8060.         if (c >= 040 && c < 0177)
  8061. + #endif
  8062.       {
  8063.         col++;
  8064.       }
  8065. ***************
  8066. *** 326,332 ****
  8067. --- 335,345 ----
  8068.       }
  8069.         else if (ctl_arrow && (c < 040 || c == 0177))
  8070.           col++;
  8071. + #ifdef EIGHT_BIT
  8072. +       else if (!visible[c])
  8073. + #else
  8074.         else if (c < 040 || c >= 0177)
  8075. + #endif
  8076.           col += 3;
  8077.       }
  8078.   
  8079. ***************
  8080. *** 373,381 ****
  8081.         prev_hpos = hpos;
  8082.   
  8083.         c = FETCH_CHAR (pos);
  8084.         if (c >= 040 && c < 0177)
  8085. !     hpos++;
  8086. !       else if (c == '\t')
  8087.       {
  8088.         hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0)
  8089.                   /* Add tab_width here to make sure positive.
  8090. --- 386,442 ----
  8091.         prev_hpos = hpos;
  8092.   
  8093.         c = FETCH_CHAR (pos);
  8094. + #ifdef EIGHT_BIT
  8095. +       if (visible[c])
  8096. + #else
  8097.         if (c >= 040 && c < 0177)
  8098. ! #endif
  8099. !         {
  8100. !       unsigned char *p;
  8101. !       int gap_pos;
  8102. !       int maxhpos;
  8103. !       if (vpos == tovpos)
  8104. !         {
  8105. !           maxhpos = tohpos;
  8106. !           if (maxhpos > width) maxhpos = width;
  8107. !         }
  8108. !       else maxhpos = width;
  8109. !       if (pos < GPT)
  8110. !         {
  8111. !           gap_pos = GPT;
  8112. !           p = BEG_ADDR + pos;
  8113. !         }
  8114. !       else
  8115. !         {
  8116. !           gap_pos = -1;
  8117. !           p = GAP_SIZE + BEG_ADDR + pos;
  8118. !         }
  8119. !       do
  8120. !         {
  8121. !           hpos++;
  8122. !           if (hpos >= maxhpos)
  8123. !           {
  8124. !           prev_hpos = hpos - 1;
  8125. !           if (hpos >= width) goto check_hpos;
  8126. !           /* We've reached the target pos */
  8127. !           pos++;
  8128. !           goto done;
  8129. !           }
  8130. !           pos++;
  8131. !           if (pos >= to)
  8132. !             {
  8133. !           prev_hpos = hpos - 1;
  8134. !           goto done;
  8135. !             }
  8136. !           if (gap_pos == pos) p += GAP_SIZE;
  8137. !           c = *p++;
  8138. !         }
  8139. !       while (visible[c]);
  8140. !       prev_hpos = hpos;
  8141. !         }
  8142. !       if (c == '\t')
  8143.       {
  8144.         hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0)
  8145.                   /* Add tab_width here to make sure positive.
  8146. ***************
  8147. *** 433,438 ****
  8148. --- 494,500 ----
  8149.         else
  8150.       hpos += (ctl_arrow && c < 0200) ? 2 : 4;
  8151.   
  8152. + check_hpos:
  8153.         /* Handle right margin.  */
  8154.         if (hpos >= width
  8155.         && (hpos > width
  8156. ***************
  8157. *** 462,467 ****
  8158. --- 524,530 ----
  8159.   
  8160.       }
  8161.       }
  8162. +   done:
  8163.   
  8164.     val_compute_motion.bufpos = pos;
  8165.     val_compute_motion.hpos = hpos;
  8166. diff -rcP emacs-18.59-fsf/src/keyboard.c emacs-18.59-amiga/src/keyboard.c
  8167. *** emacs-18.59-fsf/src/keyboard.c    Sun May 17 06:57:15 1992
  8168. --- emacs-18.59-amiga/src/keyboard.c    Sun Nov 22 10:14:48 1992
  8169. ***************
  8170. *** 1313,1319 ****
  8171. --- 1313,1325 ----
  8172.   #endif
  8173.       fcntl (fileno (stdin), F_SETFL, 0);
  8174.   #else /* not USG */
  8175. + #ifdef    AMIGA    /* This is where the input work finally gets done */
  8176. +   /* Note, The nread != 0 case isn't handled as it doesn't arise on the Amiga.
  8177. +      (Look carefully at calls to read_avail_input) */
  8178. +   nread = read(0, buf, sizeof buf);
  8179. + #else  /* not AMIGA */
  8180.     you lose
  8181. + #endif /* not AMIGA */
  8182.   #endif /* not USG */
  8183.   #endif /* no FIONREAD */
  8184.   
  8185. diff -rcP emacs-18.59-fsf/src/keymap.c emacs-18.59-amiga/src/keymap.c
  8186. *** emacs-18.59-fsf/src/keymap.c    Sat Jul 27 17:43:27 1991
  8187. --- emacs-18.59-amiga/src/keymap.c    Sun Nov 22 10:14:52 1992
  8188. ***************
  8189. *** 29,34 ****
  8190. --- 29,38 ----
  8191.   
  8192.   /* Actually allocate storage for these variables */
  8193.   
  8194. + #ifdef AMIGA
  8195. + #define HAVE_X_WINDOWS        /* We want the mouse map too */
  8196. + #endif
  8197.   #ifdef HAVE_X_WINDOWS
  8198.   Lisp_Object MouseMap;        /* Keymap for mouse commands */
  8199.   #endif /* HAVE_X_WINDOWS */
  8200. diff -rcP emacs-18.59-fsf/src/lastfile.c emacs-18.59-amiga/src/lastfile.c
  8201. *** emacs-18.59-fsf/src/lastfile.c    Sat Mar 30 23:05:55 1991
  8202. --- emacs-18.59-amiga/src/lastfile.c    Sat Dec  5 18:16:44 1992
  8203. ***************
  8204. *** 35,43 ****
  8205. --- 35,57 ----
  8206.    coming from libraries.
  8207.   */
  8208.   
  8209. + #ifdef AMIGA
  8210. + /* I need to find the end of initialised and unitialised data, as well as of
  8211. +    executable code.
  8212. + */
  8213. + int last_data = 1;
  8214. + int last_bss;
  8215. + void last_function() { }
  8216. + /* Some data that shouldn't be dumped */
  8217. + #include "amiga_data.c" 
  8218. + #else /* not AMIGA */
  8219.   #ifdef VMS
  8220.   /* Prevent the file from being totally empty.  */
  8221.   static dummy () {}
  8222.   #endif
  8223.   
  8224.   char my_edata = 0;
  8225. + #endif /* not AMIGA */
  8226. diff -rcP emacs-18.59-fsf/src/lisp.h emacs-18.59-amiga/src/lisp.h
  8227. *** emacs-18.59-fsf/src/lisp.h    Thu Mar  5 23:11:31 1992
  8228. --- emacs-18.59-amiga/src/lisp.h    Sun Nov 22 10:14:58 1992
  8229. ***************
  8230. *** 287,293 ****
  8231.     (XUINT (a) | (XUINT (a) > PURESIZE ? DATA_SEG_BITS : PURE_SEG_BITS))
  8232.   #else /* not HAVE_SHM */
  8233.   #ifdef DATA_SEG_BITS
  8234. ! /* This case is used for the rt-pc.
  8235.      In the diffs I was given, it checked for ptr = 0
  8236.      and did not adjust it in that case.
  8237.      But I don't think that zero should ever be found
  8238. --- 287,293 ----
  8239.     (XUINT (a) | (XUINT (a) > PURESIZE ? DATA_SEG_BITS : PURE_SEG_BITS))
  8240.   #else /* not HAVE_SHM */
  8241.   #ifdef DATA_SEG_BITS
  8242. ! /* This case is used for the rt-pc and the Amiga.
  8243.      In the diffs I was given, it checked for ptr = 0
  8244.      and did not adjust it in that case.
  8245.      But I don't think that zero should ever be found
  8246. ***************
  8247. *** 520,525 ****
  8248. --- 520,532 ----
  8249.     { if (XTYPE ((x)) == Lisp_Marker) XFASTINT (x) = marker_position (x); \
  8250.       else if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qinteger_or_marker_p, (x)); }
  8251.   
  8252. + #ifdef AMIGA_DUMP
  8253. + #define CHECK_IMPURE(obj) \
  8254. +   { extern int *pure, puresize; \
  8255. +     if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + puresize) \
  8256. +     && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
  8257. +       pure_write_error (); }
  8258. + #else /* not AMIGA_DUMP */
  8259.   #ifdef VIRT_ADDR_VARIES
  8260.   
  8261.   /* For machines like APOLLO where text and data can go anywhere
  8262. ***************
  8263. *** 529,535 ****
  8264.       if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
  8265.       && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
  8266.         pure_write_error (); }
  8267.   #else /* not VIRT_ADDR_VARIES */
  8268.   #ifdef PNTR_COMPARISON_TYPE
  8269.   
  8270. --- 536,541 ----
  8271. ***************
  8272. *** 548,553 ****
  8273. --- 554,560 ----
  8274.   
  8275.   #endif /* PNTR_COMPARISON_TYPE */
  8276.   #endif /* VIRT_ADDRESS_VARIES */
  8277. + #endif /* not AMIGA_DUMP */
  8278.   
  8279.   /* Cast pointers to this type to compare them.  Some machines want int.  */
  8280.   #ifndef PNTR_COMPARISON_TYPE
  8281. diff -rcP emacs-18.59-fsf/src/lread.c emacs-18.59-amiga/src/lread.c
  8282. *** emacs-18.59-fsf/src/lread.c    Mon Mar 23 04:18:17 1992
  8283. --- emacs-18.59-amiga/src/lread.c    Sun Nov 22 10:15:02 1992
  8284. ***************
  8285. *** 240,250 ****
  8286. --- 240,254 ----
  8287.        Lisp_Object pathname;
  8288.   {
  8289.     register unsigned char *s = XSTRING (pathname)->data;
  8290. + #ifdef AMIGA
  8291. +   return (*s && index(s + 1, ':')); /* Non-leading : */
  8292. + #else
  8293.     return (*s == '~' || *s == '/'
  8294.   #ifdef VMS
  8295.         || index (s, ':')
  8296.   #endif /* VMS */
  8297.         );
  8298. + #endif /* not AMIGA */
  8299.   }
  8300.   
  8301.   /* Search for a file whose name is STR, looking in directories
  8302. ***************
  8303. *** 559,565 ****
  8304.   }
  8305.   
  8306.   static int read_buffer_size;
  8307. ! static char *read_buffer;
  8308.   
  8309.   static Lisp_Object
  8310.   read1 (readcharfun)
  8311. --- 563,569 ----
  8312.   }
  8313.   
  8314.   static int read_buffer_size;
  8315. ! char *read_buffer;
  8316.   
  8317.   static Lisp_Object
  8318.   read1 (readcharfun)
  8319. diff -rcP emacs-18.59-fsf/src/m-amiga.h emacs-18.59-amiga/src/m-amiga.h
  8320. *** emacs-18.59-fsf/src/m-amiga.h    Thu Jan  1 00:00:00 1970
  8321. --- emacs-18.59-amiga/src/m-amiga.h    Sun Nov 22 10:20:16 1992
  8322. ***************
  8323. *** 0 ****
  8324. --- 1,129 ----
  8325. + /* m- file for GNU Emacs running on AmigaDOS 2.04, SAS C compiler 5.10b
  8326. +    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  8327. + This file is part of GNU Emacs.
  8328. + GNU Emacs is distributed in the hope that it will be useful,
  8329. + but WITHOUT ANY WARRANTY.  No author or distributor
  8330. + accepts responsibility to anyone for the consequences of using it
  8331. + or for whether it serves any particular purpose or works at all,
  8332. + unless he says so in writing.  Refer to the GNU Emacs General Public
  8333. + License for full details.
  8334. + Everyone is granted permission to copy, modify and redistribute
  8335. + GNU Emacs, but only under the conditions described in the
  8336. + GNU Emacs General Public License.   A copy of this license is
  8337. + supposed to have been given to you along with GNU Emacs so you
  8338. + can know your rights and responsibilities.  It should be in a
  8339. + file named COPYING.  Among other things, the copyright notice
  8340. + and this notice must be preserved on all copies.  */
  8341. + /* The following three symbols give information on
  8342. +  the size of various data types.  */
  8343. + /* lisp.h doesn't make any concessions for INTBITS = 16 and
  8344. +    NO_UNION_TYPE (use int as lisp object) defined.  The following is
  8345. +    assuming that the Manx 32 bit int. math package is faster than
  8346. +    bitfield implementation, overall.  If you want to use INTBITS = 16,
  8347. +    you *cannot* define NO_UNION_TYPE.    */
  8348. + #define SHORTBITS 16        /* Number of bits in a short */
  8349. + #define INTBITS 32        /* Number of bits in an int */
  8350. + #define LONGBITS 32        /* Number of bits in a long */
  8351. + #define VALBITS 26        /* Number of bits in an int or pointer offset */
  8352. + #define GCTYPEBITS 5        /* Number of bits in a type. */
  8353. + /* Define BIG_ENDIAN iff lowest-numbered byte in a word
  8354. +    is the most significant byte.  */
  8355. + #define BIG_ENDIAN
  8356. + /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
  8357. +  * group of arguments and treat it as an array of the arguments.  */
  8358. + /* #define NO_ARG_ARRAY */
  8359. + /* Define WORD_MACHINE if addresses and such have
  8360. +  * to be corrected before they can be used as byte counts.  */
  8361. + #define WORD_MACHINE
  8362. + /* Define how to take a char and sign-extend into an int.
  8363. +    On machines where char is signed, this is a no-op.  */
  8364. + #define SIGN_EXTEND_CHAR(c) (c)
  8365. + /* Now define a symbol for the cpu type, if your compiler
  8366. +    does not define it automatically:
  8367. +    Ones defined so far include vax, m68000, ns16000, pyramid,
  8368. +    orion, tahoe, APOLLO and many others */
  8369. + #ifndef    m68000
  8370. + #define m68000
  8371. + #endif
  8372. + /* Use type int rather than a union, to represent Lisp_Object */
  8373. + /* This is desirable for most machines.  */
  8374. + #define NO_UNION_TYPE
  8375. + /* Use a struct rather than an int. */
  8376. + /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
  8377. +    the 24-bit bit field into an int.  In other words, if bit fields
  8378. +    are always unsigned.
  8379. +    If you use NO_UNION_TYPE, this flag does not matter.  */
  8380. + #define EXPLICIT_SIGN_EXTEND
  8381. + /* We don't have /dev/kmem, so LOAD_AVE_TYPE and LOAD_AVE_CVT are
  8382. +    not defined. */
  8383. + /* Define CANNOT_DUMP on machines where unexec does not work.
  8384. +    Then the function dump-emacs will not be defined
  8385. +    and temacs will do (load "loadup") automatically unless told otherwise.  */
  8386. + /* #define CANNOT_DUMP */
  8387. + /* Define VIRT_ADDR_VARIES if the virtual addresses of
  8388. +    pure and impure space as loaded can vary, and even their
  8389. +    relative order cannot be relied on.
  8390. +    Otherwise Emacs assumes that text space precedes data space,
  8391. +    numerically.  */
  8392. + /* #define VIRT_ADDR_VARIES */
  8393. + /* I now rely on AMIGA_DUMP to make appropriate patches in the source */
  8394. + /* Define C_ALLOCA if this machine does not support a true alloca
  8395. +    and the one written in C should be used instead.
  8396. +    Define HAVE_ALLOCA to say that the system provides a properly
  8397. +    working alloca function and it should be used.
  8398. +    Define neither one if an assembler-language alloca
  8399. +    in the file alloca.s should be used.  */
  8400. + #define C_ALLOCA
  8401. + /* #define HAVE_ALLOCA */
  8402. + /* Define STACK_DIRECTION for alloca.c */
  8403. + #define    STACK_DIRECTION    -1    /* Grows downward */
  8404. + /* Define NO_REMAP if memory segmentation makes it not work well
  8405. +    to change the boundary between the text section and data section
  8406. +    when Emacs is dumped.  If you define this, the preloaded Lisp
  8407. +    code will not be sharable; but that's better than failing completely.  */
  8408. + #define NO_REMAP
  8409. + /* Set high (32 - VALBITS) = 6 bits of every pointer to the same as those of
  8410. +    &pure[0].
  8411. + */
  8412. + #ifdef emacs
  8413. + extern long far DataSegBits;
  8414. + #endif
  8415. + #define DATA_SEG_BITS DataSegBits
  8416. diff -rcP emacs-18.59-fsf/src/paths.h-dist emacs-18.59-amiga/src/paths.h-dist
  8417. *** emacs-18.59-fsf/src/paths.h-dist    Wed Sep 12 00:51:18 1990
  8418. --- emacs-18.59-amiga/src/paths.h-dist    Sun Nov 22 10:16:24 1992
  8419. ***************
  8420. *** 17,19 ****
  8421. --- 17,35 ----
  8422.   /* the name of the file !!!SuperLock!!! in the directory
  8423.    specified by PATH_LOCK.  Yes, this is redundant.  */
  8424.   #define PATH_SUPERLOCK "/usr/local/emacs/lock/!!!SuperLock!!!"
  8425. + /* The path to the file containing the termcap descriptions */
  8426. + #define PATH_TERMCAP "/etc/termcap"
  8427. + /* The relative path (while dumping) to the directory containing 
  8428. +    the DOC file */
  8429. + #define RELPATH_DOC "../etc/"
  8430. + /* The path for a /dev/null-like device */
  8431. + #define PATH_NULL "/dev/null"
  8432. + /* Path for temporary files (for call-process-region) */
  8433. + #define PATH_TEMP "/tmp/emacsXXXXXX"
  8434. + /* Path to the shell (the one in shell-file-name) */
  8435. + #define PATH_SHELL "/bin/sh"
  8436. diff -rcP emacs-18.59-fsf/src/process.c emacs-18.59-amiga/src/process.c
  8437. *** emacs-18.59-fsf/src/process.c    Sun Oct 25 04:42:04 1992
  8438. --- emacs-18.59-amiga/src/process.c    Sun Nov 22 10:16:38 1992
  8439. ***************
  8440. *** 1203,1209 ****
  8441. --- 1203,1226 ----
  8442.        If fork fails, remove_process will clear the bit.  */
  8443.     FD_SET (inchannel, &input_wait_mask);
  8444.   
  8445. + #ifdef AMIGA
  8446.     {
  8447. +     register unsigned char *temp;
  8448. +     if (XTYPE (current_buffer->directory) == Lisp_String)
  8449. +       {
  8450. +     register int i;
  8451. +     i = XSTRING (current_buffer->directory)->size;
  8452. +     temp = (unsigned char *) alloca (i + 1);
  8453. +     bcopy (XSTRING (current_buffer->directory)->data, temp, i);
  8454. +     temp[i] = 0;
  8455. +       }
  8456. +     pid = exec(new_argv[0], new_argv, forkin, forkout, temp,
  8457. +            amiga_process_stack_size);
  8458. +   }
  8459. + #else /* not AMIGA */
  8460. +   {
  8461.       /* child_setup must clobber environ on systems with true vfork.
  8462.          Protect it from permanent change.  */
  8463.       char **save_environ = environ;
  8464. ***************
  8465. *** 1305,1310 ****
  8466. --- 1322,1328 ----
  8467.         }
  8468.       environ = save_environ;
  8469.     }
  8470. + #endif /* not AMIGA */
  8471.   
  8472.     if (pid < 0)
  8473.       {
  8474. ***************
  8475. *** 1314,1319 ****
  8476. --- 1332,1338 ----
  8477.   
  8478.     XFASTINT (XPROCESS (process)->pid) = pid;
  8479.   
  8480. + #ifndef AMIGA
  8481.     /* If the subfork execv fails, and it exits,
  8482.        this close hangs.  I don't know why.
  8483.        So have an interrupt jar it loose.  */
  8484. ***************
  8485. *** 1326,1331 ****
  8486. --- 1345,1351 ----
  8487.     start_polling ();
  8488.     if (forkin != forkout && forkout >= 0)
  8489.       close (forkout);
  8490. + #endif
  8491.   
  8492.   #ifdef SIGCHLD
  8493.   #ifdef BSD4_1
  8494. diff -rcP emacs-18.59-fsf/src/s-amiga.h emacs-18.59-amiga/src/s-amiga.h
  8495. *** emacs-18.59-fsf/src/s-amiga.h    Thu Jan  1 00:00:00 1970
  8496. --- emacs-18.59-amiga/src/s-amiga.h    Sat Oct  2 15:32:32 1993
  8497. ***************
  8498. *** 0 ****
  8499. --- 1,215 ----
  8500. + /* file for GNU Emacs running on AmigaDOS 2.04, SAS C compiler 5.10b
  8501. +    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  8502. + This file is part of GNU Emacs.
  8503. + GNU Emacs is distributed in the hope that it will be useful,
  8504. + but WITHOUT ANY WARRANTY.  No author or distributor
  8505. + accepts responsibility to anyone for the consequences of using it
  8506. + or for whether it serves any particular purpose or works at all,
  8507. + unless he says so in writing.  Refer to the GNU Emacs General Public
  8508. + License for full details.
  8509. + Everyone is granted permission to copy, modify and redistribute
  8510. + GNU Emacs, but only under the conditions described in the
  8511. + GNU Emacs General Public License.   A copy of this license is
  8512. + supposed to have been given to you along with GNU Emacs so you
  8513. + can know your rights and responsibilities.  It should be in a
  8514. + file named COPYING.  Among other things, the copyright notice
  8515. + and this notice must be preserved on all copies.  */
  8516. + /*
  8517. +  *    Define symbols to identify the version of Unix this is.
  8518. +  *    Define all the symbols that apply correctly.
  8519. +  */
  8520. + #ifndef AMIGA
  8521. + #define AMIGA
  8522. + #endif /* AMIGA */
  8523. + /* SYSTEM_TYPE should indicate the kind of system you are using.
  8524. +  It sets the Lisp variable system-type.  */
  8525. + #define SYSTEM_TYPE "amigados"
  8526. + /* Define this if you want a faster redisplay. This saves a lot of CPU
  8527. +    time at the expense of more characters to be redrawn.
  8528. +    On a bitmapped display you win, with a serial line you probably lose.
  8529. + */
  8530. + #define FAST_DISPLAY
  8531. + /* Define this to display eight bit characters. The actual characters
  8532. +    that are visible can be set in init_xdisp ().
  8533. + */
  8534. + #define EIGHT_BIT
  8535. + /* nomultiplejobs should be defined if your system's shell
  8536. +  does not have "job control" (the ability to stop a program,
  8537. +  run some other program, then continue the first one).  */
  8538. + #define NOMULTIPLEJOBS
  8539. + /* Define this to include various patches that allow the Amiga to dump.
  8540. +    This *must* be defined on the Amiga!
  8541. + */
  8542. + #define AMIGA_DUMP
  8543. + /* Do not use interrupt_input = 1 by default, because in 4.3
  8544. +    we can make noninterrupt input work properly.  */
  8545. + /* #undef INTERRUPT_INPUT */    /* This file borrowed from s-bsd4-3.h */
  8546. + /* First pty name is /dev/ptyp0.  */
  8547. + /* #define FIRST_PTY_LETTER 'p' */
  8548. + /*
  8549. +  *    Define HAVE_TIMEVAL if the system supports the BSD style clock values.
  8550. +  *    Look in <sys/time.h> for a timeval structure.
  8551. +  */
  8552. + #define HAVE_TIMEVAL
  8553. + #define USE_UTIME
  8554. + /*
  8555. +  *    Define HAVE_SELECT if the system supports the `select' system call.
  8556. +  */
  8557. + #define HAVE_SELECT
  8558. + /*
  8559. +  *    Define HAVE_PTYS if the system supports pty devices.
  8560. +  */
  8561. + /* #define HAVE_PTYS */
  8562. + /* Define HAVE_SOCKETS if system supports 4.2-compatible sockets.  */
  8563. + /* #define HAVE_SOCKETS */
  8564. + /* But we do have socket pairs for processes ... */
  8565. + #define SKTPAIR
  8566. + /*
  8567. +  *    Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate
  8568. +  *      The 4.2 opendir, etc., library functions.
  8569. +  */
  8570. + /* #define NONSYSTEM_DIR_LIBRARY */
  8571. + #define SYSV_SYSTEM_DIR
  8572. + /* Define this symbol if your system has the functions bcopy, etc. */
  8573. + #define BSTRING        /* #define'ed later on */
  8574. + /* subprocesses should be defined if you want to
  8575. +    have code for asynchronous subprocesses
  8576. +    (as used in M-x compile and M-x shell).
  8577. +    This is generally OS dependent, and not supported
  8578. +    under most USG systems. */
  8579. + #define subprocesses
  8580. + #define DID_REMOTE        /* Use 0 length write to send eof */
  8581. + /* If your system uses COFF (Common Object File Format) then define the
  8582. +    preprocessor symbol "COFF". */
  8583. + /* #define COFF */
  8584. + /* define MAIL_USE_FLOCK if the mailer uses flock
  8585. +    to interlock access to /usr/spool/mail/$USER.
  8586. +    The alternative is that a lock file named
  8587. +    /usr/spool/mail/$USER.lock.  */
  8588. + /* #define MAIL_USE_FLOCK */
  8589. + /* Define CLASH_DETECTION if you want lock files to be written
  8590. +    so that Emacs can tell instantly when you try to modify
  8591. +    a file that someone else has modified in his Emacs.  */
  8592. + /* #define CLASH_DETECTION */
  8593. + /* We use the Berkeley (and usg5.2.2) interface to nlist.  */
  8594. + /* #define NLIST_STRUCT */
  8595. + /* The file containing the kernel's symbol table is called /vmunix.  */
  8596. + /* #define KERNEL_FILE "/vmunix" */
  8597. + /* The symbol in the kernel where the load average is found
  8598. +    is named _avenrun.  */
  8599. + /* #define LDAV_SYMBOL "_avenrun" */
  8600. + /* We use our own malloc for 2 reasons:
  8601. +      - To check that the 6 (INTBITS - VALBITS) of allocated data are
  8602. +        the same as &pure[0].
  8603. +      - To release unused memory to the system (SAS's malloc keeps it
  8604. +        till you quit)
  8605. + */
  8606. + #define SYMS_SYSTEM syms_of_amiga()
  8607. + #define SYSTEM_MALLOC        /* But I have replaced the system malloc ... */
  8608. + #define DEF_PURESIZE 132000        /* Leave space for extra code for Amiga */
  8609. + #ifdef emacs
  8610. + extern int puresize;
  8611. + #endif
  8612. + #define PURESIZE puresize    /* Puresize is variable ... */
  8613. + #ifdef emacs
  8614. + /* Stdio must be included before redefining putchar */
  8615. + #include <stdio.h>
  8616. + extern char cbuffer[], *cbuffer_pos;
  8617. + #define PENDING_OUTPUT_COUNT(x) (cbuffer_pos - cbuffer)
  8618. + #endif
  8619. + /* We divert some calls to our routines */
  8620. + #define putchar(c) do { extern int noninteractive; \
  8621. +              if (noninteractive) putc (c, stdout); \
  8622. +              else emacs_putchar(c); } while(0)
  8623. + #define fwrite emacs_fwrite
  8624. + #define fflush emacs_fflush
  8625. + #define random rand
  8626. + #define srandom srand
  8627. + #define main emacs_main
  8628. + #define select emacs_select
  8629. + #ifdef emacs
  8630. + #include <string.h>
  8631. + #undef index
  8632. + #undef rindex
  8633. + #define index strchr
  8634. + #define rindex strrchr
  8635. + #endif
  8636. + #define fsync(x) 0        /* Emulate fsync ... */
  8637. + #ifdef emacs
  8638. + #include <sys/wait.h>        /* process.c doesn't have appropriate #ifdef's */
  8639. + extern int amiga_process_stack_size;
  8640. + #endif
  8641. + /* Here are some symbols for ymakefile's benefit */
  8642. + #define    LIB_STANDARD        //unix/src/unix.lib lib:sc.lib lib:amiga.lib
  8643. + #define    START_FILES        lib:c.o firstfile.o
  8644. + #define    C_DEBUG_SWITCH        debug s
  8645. + #define    C_OPTIMIZE_SWITCH    opt
  8646. + #define    LD_SWITCH_SYSTEM
  8647. + #define    C_SWITCH_SYSTEM
  8648. + #define    S_SWITCH_MACHINE    /* Nothing! */
  8649. + #define UNEXEC amiga_dump.o
  8650. + #define OBJECTS_SYSTEM        amiga_clipboard.o amiga_tty.o amiga_serial.o \
  8651. +                 amiga_screen.o amiga_menu.o amiga_malloc.o \
  8652. +                                 amiga_rexx.o simplerexx.o amiga_term.o
  8653. + /* Amiga window-specific stuff */
  8654. + #define VERS "1.28DG Beta"
  8655. + #define FALSE 0
  8656. + #define TRUE 1
  8657. diff -rcP emacs-18.59-fsf/src/scroll.c emacs-18.59-amiga/src/scroll.c
  8658. *** emacs-18.59-fsf/src/scroll.c    Tue Jan  8 18:04:52 1991
  8659. --- emacs-18.59-amiga/src/scroll.c    Sun Nov 22 10:17:30 1992
  8660. ***************
  8661. *** 55,60 ****
  8662. --- 55,61 ----
  8663.   int *ILncost;
  8664.   int *DLncost;
  8665.   
  8666. + #ifdef FAST_DISPLAY
  8667.   scrolling_1 (window_size, unchanged_at_top, unchanged_at_bottom,
  8668.            draw_cost, old_hash, new_hash, free_at_end)
  8669.        int window_size, unchanged_at_top, unchanged_at_bottom;
  8670. ***************
  8671. *** 63,68 ****
  8672. --- 64,127 ----
  8673.        int *new_hash;
  8674.        int free_at_end;
  8675.   {
  8676. +   int lines, i;
  8677. +   int window_end = unchanged_at_top + window_size;
  8678. +   /* Rebase arrays at line 0 */
  8679. +   old_hash -= unchanged_at_top - 1;
  8680. +   new_hash -= unchanged_at_top - 1;
  8681. +   draw_cost -= unchanged_at_top - 1;
  8682. +   /* We can't allow un-enabled lines to be scrolled (they are not redrawable). 
  8683. +      Restrict window to the first set of contiguous enabled lines 
  8684. +      (an enabled line has draw_cost[x] != INFINITY) */
  8685. +   for (i = unchanged_at_top; i < window_end && draw_cost[i] != INFINITY; i++) ;
  8686. +   /*unchanged_at_bottom += window_size - i;*/
  8687. +   /*window_size = i - unchanged_at_top;*/
  8688. +   window_end = i;
  8689. +   if (lines = calc_scroll(old_hash, new_hash, unchanged_at_top, window_end))
  8690. +       scroll_screen_lines(unchanged_at_top, window_end - lines, lines);
  8691. +   else if (lines = calc_scroll(new_hash, old_hash, unchanged_at_top, window_end))
  8692. +       scroll_screen_lines(unchanged_at_top + lines, window_end, -lines);
  8693. + }
  8694. + int calc_scroll(int *old_hash, int *new_hash, int from, int to)
  8695. + /* For insert attempt, the parameters are correct.
  8696. +    For delete attempt, swap the old & new hash parameters
  8697. + */
  8698. + {
  8699. +     int try = from + 1, lines, i;
  8700. +     int hash1 = old_hash[from];
  8701. +     do
  8702. +     {
  8703. +     if (hash1 == new_hash[try])
  8704. +     {
  8705. +         /* Check if other lines match too */
  8706. +         lines = try - from; /* Amount to insert */
  8707. +         for (i = try + 1; i < to; i++)
  8708. +         if (old_hash[i - lines] != new_hash[i]) break;
  8709. +         if (i == to) /* It works ! */
  8710. +         return lines;
  8711. +     }
  8712. +     try++;
  8713. +     }
  8714. +     while (try < to);
  8715. +     return 0;
  8716. + }
  8717. + #else /* not FAST_DISPLAY */
  8718. + scrolling_1 (window_size, unchanged_at_top, unchanged_at_bottom,
  8719. +          draw_cost, old_hash, new_hash, free_at_end)
  8720. +      int window_size, unchanged_at_top, unchanged_at_bottom;
  8721. +      int *draw_cost;
  8722. +      int *old_hash;
  8723. +      int *new_hash;
  8724. +      int free_at_end;
  8725. + {
  8726.     struct matrix_elt *matrix;
  8727.     matrix = ((struct matrix_elt *)
  8728.           alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix));
  8729. ***************
  8730. *** 320,325 ****
  8731. --- 379,385 ----
  8732.     if (window)
  8733.       set_terminal_window (0);
  8734.   }
  8735. + #endif /* not FAST_DISPLAY */
  8736.   
  8737.   /* Return number of lines in common between current screen contents
  8738.      and the text to be displayed,
  8739. diff -rcP emacs-18.59-fsf/src/simplerexx.c emacs-18.59-amiga/src/simplerexx.c
  8740. *** emacs-18.59-fsf/src/simplerexx.c    Thu Jan  1 00:00:00 1970
  8741. --- emacs-18.59-amiga/src/simplerexx.c    Mon May 10 14:35:42 1993
  8742. ***************
  8743. *** 0 ****
  8744. --- 1,416 ----
  8745. + /*
  8746. +  * Simple ARexx interface by Michael Sinz
  8747. +  *
  8748. +  * This is a very "Simple" interface to the world of ARexx...
  8749. +  * For more complex interfaces into ARexx, it is best that you
  8750. +  * understand the functions that are provided by ARexx.
  8751. +  * In many cases they are more powerful than what is presented
  8752. +  * here.
  8753. +  *
  8754. +  * This code is fully re-entrant and self-contained other than
  8755. +  * the use of SysBase/AbsExecBase and the ARexx RVI support
  8756. +  * library which is also self-contained...
  8757. +  */
  8758. + #include    <exec/types.h>
  8759. + #include    <exec/nodes.h>
  8760. + #include    <exec/lists.h>
  8761. + #include    <exec/ports.h>
  8762. + #include    <exec/memory.h>
  8763. + #include    <proto/exec.h>
  8764. + #include    <rexx/storage.h>
  8765. + #include    <rexx/rxslib.h>
  8766. + #include    <string.h>
  8767. + #include    <ctype.h>
  8768. + /*
  8769. +  * The prototypes for the few ARexx functions we will call...
  8770. +  */
  8771. + struct RexxMsg *CreateRexxMsg(struct MsgPort *,char *,char *);
  8772. + void *CreateArgstring(char *,long);
  8773. + void DeleteRexxMsg(struct RexxMsg *);
  8774. + void DeleteArgstring(char *);
  8775. + BOOL IsRexxMsg(struct Message *);
  8776. + /*
  8777. +  * Pragmas for the above functions...  (To make this all self-contained...)
  8778. +  * If you use RexxGlue.o, this is not needed...
  8779. +  *
  8780. +  * These are for Lattice C 5.x  (Note the use of RexxContext->RexxSysBase)
  8781. +  */
  8782. + #pragma libcall RexxContext->RexxSysBase CreateRexxMsg 90 09803
  8783. + #pragma libcall RexxContext->RexxSysBase CreateArgstring 7E 0802
  8784. + #pragma libcall RexxContext->RexxSysBase DeleteRexxMsg 96 801
  8785. + #pragma libcall RexxContext->RexxSysBase DeleteArgstring 84 801
  8786. + #pragma libcall RexxContext->RexxSysBase IsRexxMsg A8 801
  8787. + /*
  8788. +  * Now, we have made the pragmas needed, let's get to work...
  8789. +  */
  8790. + /*
  8791. +  * A structure for the ARexx handler context
  8792. +  * This is *VERY* *PRIVATE* and should not be touched...
  8793. +  */
  8794. + struct    ARexxContext
  8795. + {
  8796. + struct    MsgPort    *ARexxPort;    /* The port messages come in at... */
  8797. + struct    Library    *RexxSysBase;    /* We will hide the library pointer here... */
  8798. +     long    Outstanding;    /* The count of outstanding ARexx messages... */
  8799. +     char    PortName[24];    /* The port name goes here... */
  8800. +     char    ErrorName[28];    /* The name of the <base>.LASTERROR... */
  8801. +     char    Extension[8];    /* Default file name extension... */
  8802. + };
  8803. + #define    AREXXCONTEXT    struct ARexxContext *
  8804. + #include    "SimpleRexx.h"
  8805. + /*
  8806. +  * This function returns the port name of your ARexx port.
  8807. +  * It will return NULL if there is no ARexx port...
  8808. +  *
  8809. +  * This string is *READ ONLY*  You *MUST NOT* modify it...
  8810. +  */
  8811. + char *ARexxName(AREXXCONTEXT RexxContext)
  8812. + {
  8813. +     register    char    *tmp=NULL;
  8814. +     if (RexxContext) tmp=RexxContext->PortName;
  8815. +     return(tmp);
  8816. + }
  8817. + /*
  8818. +  * This function returns the signal mask that the Rexx port is
  8819. +  * using.  It returns NULL if there is no signal...
  8820. +  *
  8821. +  * Use this signal bit in your Wait() loop...
  8822. +  */
  8823. + ULONG ARexxSignal(AREXXCONTEXT RexxContext)
  8824. + {
  8825. +     register    ULONG    tmp=NULL;
  8826. +     if (RexxContext) tmp=1L << (RexxContext->ARexxPort->mp_SigBit);
  8827. +     return(tmp);
  8828. + }
  8829. + /*
  8830. +  * This function returns a structure that contains the commands sent from
  8831. +  * ARexx or the results of commands you sent.  You will need to parse it 
  8832. +  * and return the structure back so that the memory can be freed.
  8833. +  *
  8834. +  * This returns NULL if there was no message.
  8835. +  */
  8836. + struct RexxMsg *GetARexxMsg(AREXXCONTEXT RexxContext)
  8837. + {
  8838. +     register    struct    RexxMsg    *tmp=NULL;
  8839. +     register        short    flag;
  8840. +     if (RexxContext) tmp=(struct RexxMsg *)GetMsg(RexxContext->ARexxPort);
  8841. +     return(tmp);
  8842. + }
  8843. + /* Use this to delete a message sent via SendARexxMsg and that has now been
  8844. +    returned to you.
  8845. + */
  8846. + void DeleteARexxMsg(AREXXCONTEXT RexxContext, struct RexxMsg *rmsg)
  8847. + {
  8848. +     /*
  8849. +      * Free the arguments and the message...
  8850. +      */
  8851. +     if(rmsg->rm_Action & RXFF_RESULT) {
  8852. +     if(rmsg->rm_Result1 == 0 && rmsg->rm_Result2) {
  8853. +         DeleteArgstring((STRPTR)rmsg->rm_Result2);
  8854. +     }
  8855. +     }
  8856. +     DeleteArgstring(rmsg->rm_Args[0]);
  8857. +     DeleteRexxMsg(rmsg);
  8858. +     RexxContext->Outstanding-=1;
  8859. + }
  8860. + /*
  8861. +  * Use this to return a ARexx message...
  8862. +  *
  8863. +  * If you wish to return something, it must be in the RString.
  8864. +  * If you wish to return an Error, it must be in the Error.
  8865. +  * If there is an error, the RString is ignored.
  8866. +  */
  8867. + void ReplyARexxMsg(AREXXCONTEXT RexxContext,struct RexxMsg *rmsg,
  8868. +            char *RString,LONG Error)
  8869. + {
  8870. +     if (RexxContext) if (rmsg) if (rmsg!=REXX_RETURN_ERROR)
  8871. +     {
  8872. +     rmsg->rm_Result2=0;
  8873. +     if (!(rmsg->rm_Result1=Error))
  8874. +     {
  8875. +         /*
  8876. +          * if you did not have an error we return the string
  8877. +          */
  8878. +         if (rmsg->rm_Action & (1L << RXFB_RESULT)) if (RString)
  8879. +         {
  8880. +         rmsg->rm_Result2=(LONG)CreateArgstring(RString,
  8881. +                                (LONG)strlen(RString));
  8882. +         }
  8883. +     }
  8884. +     /*
  8885. +      * Reply the message to ARexx...
  8886. +      */
  8887. +     ReplyMsg((struct Message *)rmsg);
  8888. +     }
  8889. + }
  8890. + /*
  8891. +  * This function will set an error string for the ARexx
  8892. +  * application in the variable defined as <appname>.LASTERROR
  8893. +  *
  8894. +  * Note that this can only happen if there is an ARexx message...
  8895. +  *
  8896. +  * This returns TRUE if it worked, FALSE if it did not...
  8897. +  */
  8898. + short SetARexxLastError(AREXXCONTEXT RexxContext,struct RexxMsg *rmsg,
  8899. +             char *ErrorString)
  8900. + {
  8901. +     register    short    OkFlag=FALSE;
  8902. +     if (RexxContext) if (rmsg) if (CheckRexxMsg(rmsg))
  8903. +     {
  8904. +     /*
  8905. +      * Note that SetRexxVar() has more than just a TRUE/FALSE
  8906. +      * return code, but for this "basic" case, we just care if
  8907. +      * it works or not.
  8908. +      */
  8909. +     if (!SetRexxVar(rmsg,RexxContext->ErrorName,ErrorString,
  8910. +             (long)strlen(ErrorString)))
  8911. +     {
  8912. +         OkFlag=TRUE;
  8913. +     }
  8914. +     }
  8915. +     return(OkFlag);
  8916. + }
  8917. + /*
  8918. +  * This function will send a string to ARexx...
  8919. +  *
  8920. +  * The default host port will be that of your task...
  8921. +  *
  8922. +  * If you set StringFile to TRUE, it will set that bit for the message...
  8923. +  *
  8924. +  * Returns the message sent, or NULL in case of error.
  8925. +  */
  8926. + struct RexxMsg *SendARexxMsg(AREXXCONTEXT RexxContext,char *RString,
  8927. +                   short StringFile, short results)
  8928. + {
  8929. +     register    struct    MsgPort    *RexxPort;
  8930. +     register    struct    RexxMsg    *rmsg;
  8931. +     register        short    flag=FALSE;
  8932. +     if (RexxContext) if (RString)
  8933. +     {
  8934. +     if (rmsg=CreateRexxMsg(RexxContext->ARexxPort,
  8935. +                    RexxContext->Extension,
  8936. +                    RexxContext->PortName))
  8937. +     {
  8938. +         rmsg->rm_Action=RXCOMM | (StringFile ?
  8939. +                       (1L << RXFB_STRING):0);
  8940. +         rmsg->rm_Action |= (results ? RXFF_RESULT : 0);
  8941. +         if (rmsg->rm_Args[0]=CreateArgstring(RString,
  8942. +                          (LONG)strlen(RString)))
  8943. +         {
  8944. +         /*
  8945. +          * We need to find the RexxPort and this needs
  8946. +          * to be done in a Forbid()
  8947. +          */
  8948. +         Forbid();
  8949. +         if (RexxPort=FindPort(RXSDIR))
  8950. +         {
  8951. +             /*
  8952. +              * We found the port, so put the
  8953. +              * message to ARexx...
  8954. +              */
  8955. +             PutMsg(RexxPort,(struct Message *)rmsg);
  8956. +             RexxContext->Outstanding+=1;
  8957. +             flag=TRUE;
  8958. +         }
  8959. +         else
  8960. +         {
  8961. +             /*
  8962. +              * No port, so clean up...
  8963. +              */
  8964. +             DeleteArgstring(rmsg->rm_Args[0]);
  8965. +             DeleteRexxMsg(rmsg);
  8966. +         }
  8967. +         Permit();
  8968. +         }
  8969. +         else DeleteRexxMsg(rmsg);
  8970. +     }
  8971. +     }
  8972. +     return flag ? rmsg : NULL;
  8973. + }
  8974. + int PendingCommands(AREXXCONTEXT RexxContext)
  8975. + {
  8976. +     if (RexxContext) return RexxContext->Outstanding;
  8977. +     else return 0;
  8978. + }
  8979. + /*
  8980. +  * This function closes down the ARexx context that was opened
  8981. +  * with InitARexx...
  8982. +  */
  8983. + void FreeARexx(AREXXCONTEXT RexxContext)
  8984. + {
  8985. +     register    struct    RexxMsg    *rmsg;
  8986. +     if (RexxContext)
  8987. +     {
  8988. +     /*
  8989. +      * Clear port name so it can't be found...
  8990. +      */
  8991. +     RexxContext->PortName[0]='\0';
  8992. +     /*
  8993. +      * Clean out any outstanding messages we had sent out...
  8994. +      */
  8995. +     while (RexxContext->Outstanding)
  8996. +     {
  8997. +         WaitPort(RexxContext->ARexxPort);
  8998. +         while (rmsg=GetARexxMsg(RexxContext))
  8999. +         {
  9000. +         if (rmsg!=REXX_RETURN_ERROR)
  9001. +         {
  9002. +             /*
  9003. +              * Any messages that come now are blown
  9004. +              * away...
  9005. +              */
  9006. +             SetARexxLastError(RexxContext,rmsg,
  9007. +                       "99: Port Closed!");
  9008. +             /* removed ReplyARexxMsg() this was a bug that would */
  9009. +             /* obviously cause a loop (we would continue to reply and */
  9010. +             /* then get the message.  It now deletes the message as */
  9011. +             /* should be done.  -ch5/10/93. */
  9012. +             DeleteARexxMsg(RexxContext,rmsg);
  9013. +         }
  9014. +         }
  9015. +     }
  9016. +     /*
  9017. +      * Clean up the port and delete it...
  9018. +      */
  9019. +     if (RexxContext->ARexxPort)
  9020. +     {
  9021. +         while (rmsg=GetARexxMsg(RexxContext))
  9022. +         {
  9023. +         /*
  9024. +          * Any messages that still are coming in are
  9025. +          * "dead"  We just set the LASTERROR and
  9026. +          * reply an error of 100...
  9027. +          */
  9028. +         SetARexxLastError(RexxContext,rmsg,
  9029. +                   "99: Port Closed!");
  9030. +         ReplyARexxMsg(RexxContext,rmsg,NULL,100);
  9031. +         }
  9032. +         RemPort(RexxContext->ARexxPort);
  9033. +         DeleteMsgPort(RexxContext->ARexxPort);
  9034. +     }
  9035. +     /*
  9036. +      * Make sure we close the library...
  9037. +      */
  9038. +     if (RexxContext->RexxSysBase)
  9039. +     {
  9040. +         CloseLibrary(RexxContext->RexxSysBase);
  9041. +     }
  9042. +     /*
  9043. +      * Free the memory of the RexxContext
  9044. +      */
  9045. +     FreeMem(RexxContext,sizeof(struct ARexxContext));
  9046. +     }
  9047. + }
  9048. + /*
  9049. +  * This routine initializes an ARexx port for your process
  9050. +  * This should only be done once per process.  You must call it
  9051. +  * with a valid application name and you must use the handle it
  9052. +  * returns in all other calls...
  9053. +  *
  9054. +  * NOTE:  The AppName should not have spaces in it...
  9055. +  *        Example AppNames:  "MyWord" or "FastCalc" etc...
  9056. +  *        The name *MUST* be less that 16 characters...
  9057. +  *        If it is not, it will be trimmed...
  9058. +  *        The name will also be UPPER-CASED...
  9059. +  *
  9060. +  * NOTE:  The Default file name extension, if NULL will be
  9061. +  *        "rexx"  (the "." is automatic)
  9062. +  */
  9063. + AREXXCONTEXT InitARexx(char *AppName,char *Extension)
  9064. + {
  9065. +     register    AREXXCONTEXT    RexxContext=NULL;
  9066. +     register    short        loop;
  9067. +     register    short        count;
  9068. +     register    char        *tmp;
  9069. +     if (RexxContext=AllocMem(sizeof(struct ARexxContext),
  9070. +                  MEMF_PUBLIC|MEMF_CLEAR))
  9071. +     {
  9072. +     if (RexxContext->RexxSysBase=OpenLibrary("rexxsyslib.library", NULL))
  9073. +     {
  9074. +         /*
  9075. +          * Set up the extension...
  9076. +          */
  9077. +         if (!Extension) Extension="rexx";
  9078. +         tmp=RexxContext->Extension;
  9079. +         for (loop=0;(loop<7)&&(Extension[loop]);loop++)
  9080. +         {
  9081. +         *tmp++=Extension[loop];
  9082. +         }
  9083. +         *tmp='\0';
  9084. +         /*
  9085. +          * Set up a port name...
  9086. +          */
  9087. +         tmp=RexxContext->PortName;
  9088. +         for (loop=0;(loop<16)&&(AppName[loop]);loop++)
  9089. +         {
  9090. +         *tmp++=toupper(AppName[loop]);
  9091. +         }
  9092. +         *tmp='\0';
  9093. +         /*
  9094. +          * Set up the last error RVI name...
  9095. +          *
  9096. +          * This is <appname>.LASTERROR
  9097. +          */
  9098. +         strcpy(RexxContext->ErrorName,RexxContext->PortName);
  9099. +         strcat(RexxContext->ErrorName,".LASTERROR");
  9100. +         /* We need to make a unique port name... */
  9101. +         Forbid();
  9102. +         for (count=1,RexxContext->ARexxPort=(VOID *)1;
  9103. +          RexxContext->ARexxPort;count++)
  9104. +         {
  9105. +         stci_d(tmp,count);
  9106. +         RexxContext->ARexxPort=
  9107. +             FindPort(RexxContext->PortName);
  9108. +         }
  9109. +         /*RexxContext->ARexxPort=CreatePort(RexxContext->PortName,NULL);*/
  9110. +         RexxContext->ARexxPort=CreateMsgPort();
  9111. +         RexxContext->ARexxPort->mp_Node.ln_Name = RexxContext->PortName;
  9112. +         RexxContext->ARexxPort->mp_Node.ln_Pri = 0;
  9113. +         AddPort(RexxContext->ARexxPort);
  9114. +         Permit();
  9115. +     }
  9116. +     if (!RexxContext->RexxSysBase || !RexxContext->ARexxPort)
  9117. +     {
  9118. +         FreeARexx(RexxContext);
  9119. +         RexxContext=NULL;
  9120. +     }
  9121. +     }
  9122. +     return(RexxContext);
  9123. + }
  9124. diff -rcP emacs-18.59-fsf/src/simplerexx.h emacs-18.59-amiga/src/simplerexx.h
  9125. *** emacs-18.59-fsf/src/simplerexx.h    Thu Jan  1 00:00:00 1970
  9126. --- emacs-18.59-amiga/src/simplerexx.h    Mon May 10 14:35:42 1993
  9127. ***************
  9128. *** 0 ****
  9129. --- 1,119 ----
  9130. + /*
  9131. +  * Simple ARexx interface by Michael Sinz
  9132. +  *
  9133. +  * This is a very "Simple" interface...
  9134. +  */
  9135. + #ifndef    SIMPLE_REXX_H
  9136. + #define    SIMPLE_REXX_H
  9137. + #include    <exec/types.h>
  9138. + #include    <exec/nodes.h>
  9139. + #include    <exec/lists.h>
  9140. + #include    <exec/ports.h>
  9141. + #include    <rexx/storage.h>
  9142. + #include    <rexx/rxslib.h>
  9143. + /*
  9144. +  * This is the handle that SimpleRexx will give you
  9145. +  * when you initialize an ARexx port...
  9146. +  *
  9147. +  * The conditional below is used to skip this if we have
  9148. +  * defined it earlier...
  9149. +  */
  9150. + #ifndef    AREXXCONTEXT
  9151. + typedef void *AREXXCONTEXT;
  9152. + #endif    /* AREXXCONTEXT */
  9153. + /*
  9154. +  * The value of RexxMsg (from GetARexxMsg) if there was an error returned
  9155. +  */
  9156. + #define    REXX_RETURN_ERROR    ((struct RexxMsg *)-1L)
  9157. + #define    REXX_RETURN_OK            ((struct RexxMsg *)-3L)
  9158. + /*
  9159. +  * This function closes down the ARexx context that was opened
  9160. +  * with InitARexx...
  9161. +  */
  9162. + void FreeARexx(AREXXCONTEXT);
  9163. + /*
  9164. +  * This routine initializes an ARexx port for your process
  9165. +  * This should only be done once per process.  You must call it
  9166. +  * with a valid application name and you must use the handle it
  9167. +  * returns in all other calls...
  9168. +  *
  9169. +  * NOTE:  The AppName should not have spaces in it...
  9170. +  *        Example AppNames:  "MyWord" or "FastCalc" etc...
  9171. +  *        The name *MUST* be less that 16 characters...
  9172. +  *        If it is not, it will be trimmed...
  9173. +  *        The name will also be UPPER-CASED...
  9174. +  *
  9175. +  * NOTE:  The Default file name extension, if NULL will be
  9176. +  *        "rexx"  (the "." is automatic)
  9177. +  */
  9178. + AREXXCONTEXT InitARexx(char *,char *);
  9179. + /*
  9180. +  * This function returns the port name of your ARexx port.
  9181. +  * It will return NULL if there is no ARexx port...
  9182. +  *
  9183. +  * This string is *READ ONLY*  You *MUST NOT* modify it...
  9184. +  */
  9185. + char *ARexxName(AREXXCONTEXT);
  9186. + /*
  9187. +  * This function returns the signal mask that the Rexx port is
  9188. +  * using.  It returns NULL if there is no signal...
  9189. +  *
  9190. +  * Use this signal bit in your Wait() loop...
  9191. +  */
  9192. + ULONG ARexxSignal(AREXXCONTEXT);
  9193. + /*
  9194. +  * This function returns a structure that contains the commands sent from
  9195. +  * ARexx...  You will need to parse it and return the structure back
  9196. +  * so that the memory can be freed...
  9197. +  *
  9198. +  * This returns NULL if there was no message...
  9199. +  */
  9200. + struct RexxMsg *GetARexxMsg(AREXXCONTEXT);
  9201. + /* Use this to delete a message sent via SendARexxMsg and that has now been
  9202. +    returned to you.
  9203. + */
  9204. + void DeleteARexxMsg(AREXXCONTEXT RexxContext, struct RexxMsg *rmsg);
  9205. + /*
  9206. +  * Use this to return a ARexx message...
  9207. +  *
  9208. +  * If you wish to return something, it must be in the RString.
  9209. +  * If you wish to return an Error, it must be in the Error.
  9210. +  */
  9211. + void ReplyARexxMsg(AREXXCONTEXT,struct RexxMsg *,char *,LONG);
  9212. + /*
  9213. +  * This function will send a string to ARexx...
  9214. +  *
  9215. +  * The default host port will be that of your task...
  9216. +  *
  9217. +  * If you set StringFile to TRUE, it will set that bit for the message...
  9218. +  *
  9219. +  * Returns the message sent, or NULL in case of error.
  9220. +  */
  9221. + struct RexxMsg *SendARexxMsg(AREXXCONTEXT,char *,short,short);
  9222. + /*
  9223. +  * This function will set an error string for the ARexx
  9224. +  * application in the variable defined as <appname>.LASTERROR
  9225. +  *
  9226. +  * Note that this can only happen if there is an ARexx message...
  9227. +  *
  9228. +  * This returns TRUE if it worked, FALSE if it did not...
  9229. +  */
  9230. + short SetARexxLastError(AREXXCONTEXT,struct RexxMsg *,char *);
  9231. + #endif    /* SIMPLE_REXX_H */
  9232. diff -rcP emacs-18.59-fsf/src/smakefile emacs-18.59-amiga/src/smakefile
  9233. *** emacs-18.59-fsf/src/smakefile    Thu Jan  1 00:00:00 1970
  9234. --- emacs-18.59-amiga/src/smakefile    Sat Dec  5 16:43:56 1992
  9235. ***************
  9236. *** 0 ****
  9237. --- 1,45 ----
  9238. + CPP = /cpp/cpp -DAMIGA
  9239. + MAKE = smake  # BSD doesn't have it as a default.
  9240. + #Note: an alternative is  CPP = /lib/cpp
  9241. + all: xmakefile doall
  9242. + doall:
  9243. +     $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} all
  9244. + #This is used in making a distribution.
  9245. + #Do not use it on development directories!
  9246. + distclean:
  9247. +     -delete force paths.h config.h emacs-* temacs xemacs xmakefile \
  9248. +    *! @* *.o
  9249. + clean:
  9250. +     -delete force temacs xemacs xmakefile @* *.o
  9251. + xemacs: xmakefile doxemacs
  9252. + doxemacs:
  9253. +     $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} xemacs
  9254. + temacs: xmakefile dotemacs
  9255. + dotemacs:
  9256. +     $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} temacs
  9257. + demacs: xmakefile dodemacs
  9258. + dodemacs:
  9259. +     $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} demacs
  9260. + # If you have a problem with cc -E here, changing
  9261. + # the definition of CPP above may fix it.
  9262. + xmakefile: ymakefile config.h dostrip
  9263. +     -delete force xmakefile
  9264. +     ${CPP} ymakefile > t:ymkf
  9265. +     dostrip <t:ymkf >xmakefile
  9266. + dostrip: dostrip.c
  9267. +     sc link dostrip
  9268. + tags:
  9269. +     etags [a-z]*.h [a-z]*.c /lisp/[a-z]*.el
  9270. diff -rcP emacs-18.59-fsf/src/term.c emacs-18.59-amiga/src/term.c
  9271. *** emacs-18.59-fsf/src/term.c    Fri Jan  3 07:46:47 1992
  9272. --- emacs-18.59-amiga/src/term.c    Sun Nov 22 10:18:02 1992
  9273. ***************
  9274. *** 161,167 ****
  9275.      or'd with 0100.  Zero if no standout marker at all.  */
  9276.   /* used iff TN_standout_width >= 0. */
  9277.   char *chars_wasted;
  9278. ! static char *copybuf;
  9279.   
  9280.   /* nonzero means supposed to write text in standout mode.  */
  9281.   int standout_requested;
  9282. --- 161,167 ----
  9283.      or'd with 0100.  Zero if no standout marker at all.  */
  9284.   /* used iff TN_standout_width >= 0. */
  9285.   char *chars_wasted;
  9286. ! char *copybuf;
  9287.   
  9288.   /* nonzero means supposed to write text in standout mode.  */
  9289.   int standout_requested;
  9290. diff -rcP emacs-18.59-fsf/src/termcap.c emacs-18.59-amiga/src/termcap.c
  9291. *** emacs-18.59-fsf/src/termcap.c    Tue Jan  8 18:08:50 1991
  9292. --- emacs-18.59-amiga/src/termcap.c    Sun Nov 22 10:18:04 1992
  9293. ***************
  9294. *** 30,35 ****
  9295. --- 30,36 ----
  9296.   
  9297.   #ifdef emacs
  9298.   #include "config.h"
  9299. + #include "paths.h"
  9300.   #endif
  9301.   
  9302.   #ifndef BUFSIZE
  9303. ***************
  9304. *** 344,350 ****
  9305. --- 345,355 ----
  9306.   #ifdef VMS
  9307.     filep = tem && legal_filename_p (tem);
  9308.   #else
  9309. + #ifdef AMIGA
  9310. +   filep = tem != 0;            /* Always assume that it is a file */
  9311. + #else
  9312.     filep = tem && (*tem == '/');
  9313. + #endif
  9314.   #endif /* VMS */
  9315.   
  9316.     /* If tem is non-null and starts with / (in the un*x case, that is),
  9317. ***************
  9318. *** 374,384 ****
  9319.       indirect = (char *) 0;
  9320.   
  9321.     if (!tem)
  9322. ! #ifdef VMS
  9323. !     tem = "emacs_library:[etc]termcap.dat";
  9324. ! #else
  9325. !     tem = "/etc/termcap";
  9326. ! #endif
  9327.   
  9328.     /* Here we know we must search a file and tem has its name.  */
  9329.   
  9330. --- 379,385 ----
  9331.       indirect = (char *) 0;
  9332.   
  9333.     if (!tem)
  9334. !     tem = PATH_TERMCAP;
  9335.   
  9336.     /* Here we know we must search a file and tem has its name.  */
  9337.   
  9338. diff -rcP emacs-18.59-fsf/src/tparam.c emacs-18.59-amiga/src/tparam.c
  9339. *** emacs-18.59-fsf/src/tparam.c    Tue Jan  8 18:09:27 1991
  9340. --- emacs-18.59-amiga/src/tparam.c    Sun Nov 22 10:18:10 1992
  9341. ***************
  9342. *** 258,264 ****
  9343.     return outstring;
  9344.   }
  9345.   
  9346. ! #ifdef DEBUG
  9347.   
  9348.   main (argc, argv)
  9349.        int argc;
  9350. --- 258,264 ----
  9351.     return outstring;
  9352.   }
  9353.   
  9354. ! #ifdef TPARAM_DEBUG
  9355.   
  9356.   main (argc, argv)
  9357.        int argc;
  9358. ***************
  9359. *** 274,277 ****
  9360.     return 0;
  9361.   }
  9362.   
  9363. ! #endif /* DEBUG */
  9364. --- 274,277 ----
  9365.     return 0;
  9366.   }
  9367.   
  9368. ! #endif /* TPARAM_DEBUG */
  9369. diff -rcP emacs-18.59-fsf/src/xdisp.c emacs-18.59-amiga/src/xdisp.c
  9370. *** emacs-18.59-fsf/src/xdisp.c    Fri Jul 24 19:08:13 1992
  9371. --- emacs-18.59-amiga/src/xdisp.c    Sun Nov 22 10:19:14 1992
  9372. ***************
  9373. *** 31,36 ****
  9374. --- 31,47 ----
  9375.   #include "commands.h"
  9376.   #include "macros.h"
  9377.   
  9378. + #define MAX_WIN_LINE 64
  9379. + static int win_line_bufpos[MAX_WIN_LINE];
  9380. + static int win_line_modified;
  9381. + static struct buffer *win_line_buffer;
  9382. + #define CLEAR_WIN_LINE() (win_line_buffer = 0)
  9383. + #ifdef EIGHT_BIT
  9384. + char visible[256];        /* visible[i] is true if character i is
  9385. +                    displayable */
  9386. + #endif
  9387.   extern int interrupt_input;
  9388.   extern int command_loop_level;
  9389.   
  9390. ***************
  9391. *** 275,281 ****
  9392.       windows_or_buffers_changed++;
  9393.   
  9394.     if (EQ (minibuf_window, selected_window))
  9395. !     this_line_bufpos = 0;
  9396.   
  9397.     prev_echo_area_contents = echo_area_contents;
  9398.   }
  9399. --- 286,295 ----
  9400.       windows_or_buffers_changed++;
  9401.   
  9402.     if (EQ (minibuf_window, selected_window))
  9403. !     {
  9404. !       this_line_bufpos = 0;
  9405. !       CLEAR_WIN_LINE();
  9406. !     }
  9407.   
  9408.     prev_echo_area_contents = echo_area_contents;
  9409.   }
  9410. ***************
  9411. *** 327,332 ****
  9412. --- 341,348 ----
  9413.         must_finish = 1;
  9414.       }
  9415.   
  9416. +   if (windows_or_buffers_changed) CLEAR_WIN_LINE();
  9417.     if (clip_changed || windows_or_buffers_changed)
  9418.       update_mode_lines++;
  9419.   
  9420. ***************
  9421. *** 453,458 ****
  9422. --- 469,475 ----
  9423.        Also, don't forget to check every line to update the arrow.  */
  9424.     if (pause)
  9425.       {
  9426. +       CLEAR_WIN_LINE();
  9427.         this_line_bufpos = 0;
  9428.         if (!NULL (last_arrow_position))
  9429.       {
  9430. ***************
  9431. *** 709,717 ****
  9432.         && (just_this_one || XFASTINT (w->width) == screen_width)
  9433.         && !EQ (window, minibuf_window))
  9434.       {
  9435. !       pos = *compute_motion (startp, 0, (hscroll ? 1 - hscroll : 0),
  9436.                   point, height + 1, 10000, width, hscroll,
  9437. !                 pos_tab_offset (w, startp));
  9438.   
  9439.         if (pos.vpos < height)
  9440.       {
  9441. --- 726,754 ----
  9442.         && (just_this_one || XFASTINT (w->width) == screen_width)
  9443.         && !EQ (window, minibuf_window))
  9444.       {
  9445. !       int *wlb;
  9446. !       int line, best_startp, best_vpos;
  9447. !       best_startp = startp; best_vpos = 0;
  9448. !       if (win_line_buffer && BUF_MODIFF(win_line_buffer) > win_line_modified)
  9449. !       CLEAR_WIN_LINE();
  9450. !       if (current_buffer == win_line_buffer && current_buffer == XBUFFER (w->buffer))
  9451. !         {
  9452. !       /* Try & find line to start from */
  9453. !       wlb = win_line_bufpos; line = 0;
  9454. !       while (line < MAX_WIN_LINE)
  9455. !         {
  9456. !           if (*wlb && point > *wlb && *wlb > best_startp)
  9457. !             {
  9458. !           best_startp = *wlb;
  9459. !           best_vpos = line;
  9460. !             }
  9461. !           line++; wlb++;
  9462. !         }
  9463. !         }
  9464. !       pos = *compute_motion (best_startp, best_vpos, (hscroll ? 1 - hscroll : 0),
  9465.                   point, height + 1, 10000, width, hscroll,
  9466. !                 pos_tab_offset (w, best_startp));
  9467.   
  9468.         if (pos.vpos < height)
  9469.       {
  9470. ***************
  9471. *** 843,848 ****
  9472. --- 880,887 ----
  9473.   
  9474.     struct position val;
  9475.   
  9476. +   if (XBUFFER(w->buffer) == win_line_buffer) CLEAR_WIN_LINE();
  9477.     Fset_marker (w->start, make_number (pos), Qnil);
  9478.   
  9479.     point_vpos = -1;
  9480. ***************
  9481. *** 908,913 ****
  9482. --- 947,954 ----
  9483.     int delta;
  9484.     int tab_offset, epto;
  9485.   
  9486. +   if (XBUFFER(w->buffer) == win_line_buffer) CLEAR_WIN_LINE();
  9487.     if (GPT - BEG < beg_unchanged)
  9488.       beg_unchanged = GPT - BEG;
  9489.     if (Z - GPT < end_unchanged)
  9490. ***************
  9491. *** 1334,1339 ****
  9492. --- 1375,1381 ----
  9493.     pause = pos;
  9494.     while (p1 < endp)
  9495.       {
  9496. + restart:
  9497.         p1prev = p1;
  9498.         if (pos == pause)
  9499.       {
  9500. ***************
  9501. *** 1354,1366 ****
  9502.         p = &FETCH_CHAR (pos);
  9503.       }
  9504.         c = *p++;
  9505.         if (c >= 040 && c < 0177)
  9506. !     {
  9507.         if (p1 >= startp)
  9508. !         *p1 = c;
  9509. !       p1++;
  9510. !     }
  9511. !       else if (c == '\n')
  9512.       {
  9513.         invis = 0;
  9514.         while (pos < end
  9515. --- 1396,1439 ----
  9516.         p = &FETCH_CHAR (pos);
  9517.       }
  9518.         c = *p++;
  9519. + #ifdef EIGHT_BIT
  9520. +       if (visible[c])
  9521. + #else
  9522.         if (c >= 040 && c < 0177)
  9523. ! #endif
  9524. !       /* This optimises the frequent part (displayable characters) of
  9525. !      this inner loop. If the conditions aren't met, return to old
  9526. !      inner loop. */
  9527. !         {
  9528.         if (p1 >= startp)
  9529. !         {
  9530. !           do
  9531. !             {
  9532. !           *p1++ = c;
  9533. !           pos++;
  9534. !           if (p1 >= endp)
  9535. !             {
  9536. !               p1prev = p1 - 1;
  9537. !               goto done;
  9538. !             }
  9539. !           if (pos == pause) goto restart;
  9540. !           c = *p++;
  9541. !             }
  9542. ! #ifdef EIGHT_BIT
  9543. !           while (visible[c]);
  9544. ! #else
  9545. !           while (c >= 040 && c < 0177);
  9546. ! #endif
  9547. !           p1prev = p1;
  9548. !         }
  9549. !       else
  9550. !         {
  9551. !           p1++;
  9552. !           pos++;
  9553. !           goto restart;
  9554. !         }
  9555. !         }
  9556. !       if (c == '\n')
  9557.       {
  9558.         invis = 0;
  9559.         while (pos < end
  9560. ***************
  9561. *** 1434,1439 ****
  9562. --- 1507,1513 ----
  9563.       }
  9564.         pos++;
  9565.       }
  9566. + done:
  9567.   
  9568.     val.hpos = - XINT (w->hscroll);
  9569.     if (val.hpos)
  9570. ***************
  9571. *** 1525,1530 ****
  9572. --- 1599,1623 ----
  9573.           this_line_bufpos = 0;
  9574.       }
  9575.       }
  9576. +   /* Save positions of all lines of current window */
  9577. +   if (w == XWINDOW(selected_window) && vpos < MAX_WIN_LINE)
  9578. +   {
  9579. +       /* Line is not continued and did not start in middle of character */
  9580. +       if (hpos == (XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0)
  9581. +       && val.vpos)
  9582. +       {
  9583. +       if (current_buffer != win_line_buffer ||
  9584. +           !(win_line_modified >= MODIFF))
  9585. +       {
  9586. +           win_line_buffer = current_buffer;
  9587. +           win_line_modified = MODIFF;
  9588. +           bzero(win_line_bufpos, sizeof win_line_bufpos);
  9589. +       }
  9590. +       win_line_bufpos[vpos - XINT (w->top)] = start;
  9591. +       }
  9592. +       else
  9593. +       win_line_bufpos[vpos - XINT (w->top)] = 0;
  9594. +   }
  9595.   
  9596.     /* If hscroll and line not empty, insert truncation-at-left marker */
  9597.     if (hscroll && lastpos != start)
  9598. ***************
  9599. *** 1994,2000 ****
  9600. --- 2087,2097 ----
  9601.       {
  9602.         c = *string++;
  9603.         if (!c) break;
  9604. + #ifdef EIGHT_BIT
  9605. +       if (visible[c])
  9606. + #else
  9607.         if (c >= 040 && c < 0177)
  9608. + #endif
  9609.       {
  9610.         if (p1 >= start)
  9611.           *p1 = c;
  9612. ***************
  9613. *** 2109,2115 ****
  9614. --- 2206,2216 ----
  9615.     register
  9616.   #endif COMPILER_REGISTER_BUG
  9617.       struct window *mini_w;
  9618. + #ifdef EIGHT_BIT
  9619. +   int i;
  9620. + #endif
  9621.   
  9622. +   CLEAR_WIN_LINE();
  9623.     this_line_bufpos = 0;
  9624.   
  9625.     mini_w = XWINDOW (minibuf_window);
  9626. ***************
  9627. *** 2128,2131 ****
  9628. --- 2229,2238 ----
  9629.         XFASTINT (XWINDOW (root_window)->width) = screen_width;
  9630.         XFASTINT (mini_w->width) = screen_width;
  9631.       }
  9632. + #ifdef EIGHT_BIT
  9633. +   for (i = 040; i < 0177; i++) visible[i] = 1;
  9634. + #ifdef AMIGA
  9635. +   for (i = 0240; i <= 0377; i++) visible[i] = 1;
  9636. + #endif
  9637. + #endif
  9638.   }
  9639. diff -rcP emacs-18.59-fsf/src/ymakefile emacs-18.59-amiga/src/ymakefile
  9640. *** emacs-18.59-fsf/src/ymakefile    Tue Oct  6 18:44:28 1992
  9641. --- emacs-18.59-amiga/src/ymakefile    Thu Sep 30 20:52:04 1993
  9642. ***************
  9643. *** 18,24 ****
  9644. --- 18,32 ----
  9645.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  9646.   
  9647.   
  9648. + #ifdef amiga
  9649. + #undef amiga
  9650. + #endif
  9651. + #ifdef AMIGA
  9652. + dot =
  9653. + #else
  9654.   dot = .
  9655. + #endif
  9656.   /* on Xenix, replace double-dot below with $(dot)$(dot) */
  9657.   lispdir = $(dot)$(dot)/lisp/
  9658.   etcdir = $(dot)$(dot)/etc/
  9659. ***************
  9660. *** 161,167 ****
  9661.   #define LINKER gcc -nostdlib
  9662.   #else
  9663.   #define LINKER ld
  9664. ! #endif 
  9665.   #endif /* not ORDINARY_LINK */
  9666.   #endif /* no LINKER */
  9667.   
  9668. --- 169,175 ----
  9669.   #define LINKER gcc -nostdlib
  9670.   #else
  9671.   #define LINKER ld
  9672. ! #endif
  9673.   #endif /* not ORDINARY_LINK */
  9674.   #endif /* no LINKER */
  9675.   
  9676. ***************
  9677. *** 191,197 ****
  9678. --- 199,209 ----
  9679.   SHORT= shortnames
  9680.   #endif /* SHORTNAMES */
  9681.   
  9682. + #ifdef AMIGA
  9683. + CFLAGS= C_DEBUG_SWITCH def emacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
  9684. + #else
  9685.   CFLAGS= C_DEBUG_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
  9686. + #endif
  9687.   /* DO NOT use -R.  There is a special hack described in lastfile.c
  9688.      which is used instead.  Some initialized data areas are modified
  9689.      at initial startup, then labeled as part of the text area when
  9690. ***************
  9691. *** 258,264 ****
  9692.   GNULIB_VAR = `if [ -f LIB_GCC ] ; then echo LIB_GCC; else echo; fi`
  9693.   #endif /* __GNUC__ <= 1 */
  9694.   #else
  9695. ! GNULIB_VAR = 
  9696.   #endif
  9697.   
  9698.   #ifdef MAINTAIN_ENVIRONMENT
  9699. --- 270,276 ----
  9700.   GNULIB_VAR = `if [ -f LIB_GCC ] ; then echo LIB_GCC; else echo; fi`
  9701.   #endif /* __GNUC__ <= 1 */
  9702.   #else
  9703. ! GNULIB_VAR =
  9704.   #endif
  9705.   
  9706.   #ifdef MAINTAIN_ENVIRONMENT
  9707. ***************
  9708. *** 270,280 ****
  9709.   #define UNEXEC unexec.o
  9710.   #endif
  9711.   
  9712.   /* lastfile must follow all files
  9713.      whose initialized data areas should be dumped as pure by dump-emacs. */
  9714.   obj=    dispnew.o scroll.o xdisp.o window.o \
  9715. !     term.o cm.o $(XOBJ) \
  9716. !     emacs.o keyboard.o macros.o keymap.o sysdep.o \
  9717.       buffer.o filelock.o insdel.o marker.o \
  9718.       minibuf.o fileio.o dired.o filemode.o \
  9719.       cmds.o casefiddle.o indent.o search.o regex.o undo.o \
  9720. --- 282,300 ----
  9721.   #define UNEXEC unexec.o
  9722.   #endif
  9723.   
  9724. + termobjs= term.o cm.o
  9725. + #ifdef AMIGA
  9726. + SYSDEP= amiga_sysdep.o
  9727. + #else
  9728. + SYSDEP= sysdep.o
  9729. + #endif
  9730.   /* lastfile must follow all files
  9731.      whose initialized data areas should be dumped as pure by dump-emacs. */
  9732.   obj=    dispnew.o scroll.o xdisp.o window.o \
  9733. !     $(termobjs) $(XOBJ) \
  9734. !     emacs.o keyboard.o macros.o keymap.o $(SYSDEP) \
  9735.       buffer.o filelock.o insdel.o marker.o \
  9736.       minibuf.o fileio.o dired.o filemode.o \
  9737.       cmds.o casefiddle.o indent.o search.o regex.o undo.o \
  9738. ***************
  9739. *** 360,376 ****
  9740. --- 380,422 ----
  9741.   #ifdef CANNOT_DUMP
  9742.       mv temacs xemacs
  9743.   #else
  9744. + #ifdef AMIGA
  9745. +     -delete ${etcdir}EMACS-DATA xemacs force
  9746. +     temacs -nl -batch -l inc-vers
  9747. +     temacs -nl -batch -l loadup.el dump
  9748. +     -touch xemacs
  9749. +     -delete /temacs force
  9750. +     makelink from /temacs temacs
  9751. + #else
  9752.       ./temacs -batch -l inc-vers
  9753.       ./temacs -batch -l loadup.el dump
  9754. + #endif /* not AMIGA */
  9755.   #endif /* not CANNOT_DUMP */
  9756.   #endif /* not HAVE_SHM */
  9757.   
  9758.   ${etcdir}DOC: ${etcdir}make-docfile ${obj} ${lisp}
  9759. + #ifdef AMIGA
  9760. + REDIRECT_IN= <
  9761. +     -delete force ${etcdir}DOC
  9762. +     ${etcdir}make-docfile >${etcdir}DOC $(REDIRECT_IN) < <
  9763. + ${obj}
  9764. + ${lisp}
  9765. + ${lispdir}version.el
  9766. + ${lispdir}amiga-menu.elc ${lispdir}amiga-init.elc ${lispdir}amiga-mouse.elc
  9767. + OBJECTS_SYSTEM
  9768. + <
  9769. + #else
  9770.       rm -f ${etcdir}DOC
  9771.       ${etcdir}make-docfile ${obj} ${lisp} ${lispdir}version.el > ${etcdir}DOC
  9772. + #endif
  9773.   
  9774. + #ifdef AMIGA
  9775. + ${etcdir}make-docfile: ${etcdir}make-docfile.c
  9776. +     sc link /etc/make-docfile
  9777. + #else
  9778.   ${etcdir}make-docfile:
  9779.       cd ${etcdir}; ${MAKE} ${MFLAGS} make-docfile
  9780. + #endif
  9781.   
  9782.   /* Some systems define this to cause parallel Make-ing.  */
  9783.   #ifndef MAKE_PARALLEL
  9784. ***************
  9785. *** 378,384 ****
  9786. --- 424,453 ----
  9787.   #endif
  9788.   
  9789.   temacs: MAKE_PARALLEL $(LOCALCPP) $(SHORT) $(STARTFILES) $(OLDXMENU) ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE
  9790. + #ifdef AMIGA
  9791. +     slink <with <
  9792. + from ${STARTFILES} $(obj) OBJECTS_SYSTEM OBJECTS_MACHINE $(otherobj)
  9793. + to temacs
  9794. + lib LIB_STANDARD
  9795. + nodebug
  9796. + batch
  9797. + <
  9798. + #endif
  9799. + demacs: MAKE_PARALLEL $(LOCALCPP) $(SHORT) $(STARTFILES) $(OLDXMENU) ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE
  9800. + #ifdef AMIGA
  9801. +     slink <with <
  9802. + from ${STARTFILES} $(obj) OBJECTS_SYSTEM OBJECTS_MACHINE $(otherobj)
  9803. + to demacs
  9804. + lib LIB_STANDARD
  9805. + map ram:emacs.map,h,x
  9806. + addsym
  9807. + swidth 16
  9808. + batch
  9809. + <
  9810. + #else
  9811.       $(LD) ${STARTFLAGS} ${LDFLAGS} -o temacs ${STARTFILES} ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE ${LIBES}
  9812. + #endif
  9813.   
  9814.   /* These are needed for C compilation, on the systems that need them */
  9815.   #ifdef NEED_CPP
  9816. ***************
  9817. *** 460,510 ****
  9818.      it is so often changed in ways that do not require any recompilation
  9819.      and so rarely changed in ways that do require any.  */
  9820.   
  9821. ! abbrev.o : abbrev.c buffer.h commands.h config.h 
  9822. ! buffer.o : buffer.c syntax.h buffer.h commands.h window.h config.h 
  9823. ! callint.o : callint.c window.h commands.h buffer.h config.h 
  9824. ! callproc.o : callproc.c paths.h buffer.h commands.h config.h 
  9825. ! casefiddle.o : casefiddle.c syntax.h commands.h buffer.h config.h 
  9826.   cm.o : cm.c cm.h termhooks.h config.h
  9827. ! cmds.o : cmds.c syntax.h buffer.h commands.h config.h 
  9828.   crt0.o : crt0.c config.h
  9829.       $(CC) -c $(CFLAGS) C_SWITCH_ASM crt0.c
  9830.   dired.o : dired.c commands.h buffer.h config.h regex.h
  9831.   dispnew.o : dispnew.c commands.h window.h buffer.h dispextern.h termchar.h termopts.h cm.h config.h lisp.h
  9832.   doc.o : doc.c buffer.h config.h paths.h
  9833.   doprnt.o : doprnt.c
  9834. ! editfns.o : editfns.c window.h buffer.h config.h 
  9835. ! emacs.o : emacs.c commands.h config.h 
  9836.   #ifdef MAINTAIN_ENVIRONMENT
  9837.   environ.o : environ.c buffer.h commands.h config.h
  9838.   #endif /* MAINTAIN_ENVIRONMENT */
  9839. ! fileio.o : fileio.c window.h buffer.h config.h 
  9840.   filelock.o : filelock.c buffer.h paths.h config.h
  9841. ! filemode.o : filemode.c 
  9842.   indent.o : indent.c window.h indent.h buffer.h config.h termchar.h termopts.h
  9843. ! insdel.o : insdel.c window.h buffer.h config.h 
  9844. ! keyboard.o : keyboard.c termchar.h termhooks.h termopts.h buffer.h commands.h window.h macros.h config.h 
  9845. ! keymap.o : keymap.c buffer.h commands.h config.h 
  9846. ! lastfile.o : lastfile.c 
  9847.   macros.o : macros.c window.h buffer.h commands.h macros.h config.h
  9848.   malloc.o : malloc.c config.h
  9849. ! marker.o : marker.c buffer.h config.h 
  9850. ! minibuf.o : minibuf.c syntax.h window.h buffer.h commands.h config.h 
  9851.   mocklisp.o : mocklisp.c buffer.h config.h
  9852. ! process.o : process.c process.h buffer.h window.h termhooks.h termopts.h commands.h dispextern.h config.h 
  9853. ! regex.o : regex.c syntax.h buffer.h config.h regex.h 
  9854.   scroll.o : scroll.c termchar.h config.h dispextern.h termhooks.h
  9855. ! search.o : search.c regex.h commands.h buffer.h syntax.h config.h 
  9856. ! syntax.o : syntax.c syntax.h buffer.h commands.h config.h 
  9857.   sysdep.o : sysdep.c config.h dispextern.h termhooks.h termchar.h termopts.h window.h
  9858.   term.o : term.c termchar.h termhooks.h termopts.h config.h cm.h
  9859.   termcap.o : termcap.c config.h
  9860.   terminfo.o : terminfo.c config.h
  9861.   tparam.o : tparam.c config.h
  9862. ! undo.o : undo.c buffer.h commands.h config.h 
  9863.   UNEXEC : config.h getpagesize.h
  9864.   window.o : window.c indent.h commands.h window.h buffer.h config.h termchar.h
  9865. ! xdisp.o : xdisp.c macros.h commands.h indent.h buffer.h dispextern.h termchar.h window.h config.h 
  9866.   xfns.o : xfns.c xterm.h window.h config.h
  9867.   xmenu.o : xmenu.c xterm.h window.h config.h
  9868.   xterm.o : xterm.c xterm.h termhooks.h termopts.h termchar.h \
  9869. --- 529,579 ----
  9870.      it is so often changed in ways that do not require any recompilation
  9871.      and so rarely changed in ways that do require any.  */
  9872.   
  9873. ! abbrev.o : abbrev.c buffer.h commands.h config.h
  9874. ! buffer.o : buffer.c syntax.h buffer.h commands.h window.h config.h
  9875. ! callint.o : callint.c window.h commands.h buffer.h config.h
  9876. ! callproc.o : callproc.c paths.h buffer.h commands.h config.h
  9877. ! casefiddle.o : casefiddle.c syntax.h commands.h buffer.h config.h
  9878.   cm.o : cm.c cm.h termhooks.h config.h
  9879. ! cmds.o : cmds.c syntax.h buffer.h commands.h config.h
  9880.   crt0.o : crt0.c config.h
  9881.       $(CC) -c $(CFLAGS) C_SWITCH_ASM crt0.c
  9882.   dired.o : dired.c commands.h buffer.h config.h regex.h
  9883.   dispnew.o : dispnew.c commands.h window.h buffer.h dispextern.h termchar.h termopts.h cm.h config.h lisp.h
  9884.   doc.o : doc.c buffer.h config.h paths.h
  9885.   doprnt.o : doprnt.c
  9886. ! editfns.o : editfns.c window.h buffer.h config.h
  9887. ! emacs.o : emacs.c commands.h config.h
  9888.   #ifdef MAINTAIN_ENVIRONMENT
  9889.   environ.o : environ.c buffer.h commands.h config.h
  9890.   #endif /* MAINTAIN_ENVIRONMENT */
  9891. ! fileio.o : fileio.c window.h buffer.h config.h
  9892.   filelock.o : filelock.c buffer.h paths.h config.h
  9893. ! filemode.o : filemode.c
  9894.   indent.o : indent.c window.h indent.h buffer.h config.h termchar.h termopts.h
  9895. ! insdel.o : insdel.c window.h buffer.h config.h
  9896. ! keyboard.o : keyboard.c termchar.h termhooks.h termopts.h buffer.h commands.h window.h macros.h config.h
  9897. ! keymap.o : keymap.c buffer.h commands.h config.h
  9898. ! lastfile.o : lastfile.c
  9899.   macros.o : macros.c window.h buffer.h commands.h macros.h config.h
  9900.   malloc.o : malloc.c config.h
  9901. ! marker.o : marker.c buffer.h config.h
  9902. ! minibuf.o : minibuf.c syntax.h window.h buffer.h commands.h config.h
  9903.   mocklisp.o : mocklisp.c buffer.h config.h
  9904. ! process.o : process.c process.h buffer.h window.h termhooks.h termopts.h commands.h dispextern.h config.h
  9905. ! regex.o : regex.c syntax.h buffer.h config.h regex.h
  9906.   scroll.o : scroll.c termchar.h config.h dispextern.h termhooks.h
  9907. ! search.o : search.c regex.h commands.h buffer.h syntax.h config.h
  9908. ! syntax.o : syntax.c syntax.h buffer.h commands.h config.h
  9909.   sysdep.o : sysdep.c config.h dispextern.h termhooks.h termchar.h termopts.h window.h
  9910.   term.o : term.c termchar.h termhooks.h termopts.h config.h cm.h
  9911.   termcap.o : termcap.c config.h
  9912.   terminfo.o : terminfo.c config.h
  9913.   tparam.o : tparam.c config.h
  9914. ! undo.o : undo.c buffer.h commands.h config.h
  9915.   UNEXEC : config.h getpagesize.h
  9916.   window.o : window.c indent.h commands.h window.h buffer.h config.h termchar.h
  9917. ! xdisp.o : xdisp.c macros.h commands.h indent.h buffer.h dispextern.h termchar.h window.h config.h
  9918.   xfns.o : xfns.c xterm.h window.h config.h
  9919.   xmenu.o : xmenu.c xterm.h window.h config.h
  9920.   xterm.o : xterm.c xterm.h termhooks.h termopts.h termchar.h \
  9921. ***************
  9922. *** 517,529 ****
  9923.   
  9924.   /* The files of Lisp proper */
  9925.   
  9926. ! alloc.o : alloc.c window.h buffer.h config.h 
  9927. ! bytecode.o : bytecode.c buffer.h config.h 
  9928. ! data.o : data.c buffer.h config.h 
  9929.   eval.o : eval.c commands.h config.h
  9930.   fns.o : fns.c buffer.h commands.h config.h
  9931. ! print.o : print.c process.h window.h buffer.h dispextern.h termchar.h config.h 
  9932. ! lread.o : lread.c buffer.h paths.h config.h 
  9933.   
  9934.   /* System-specific programs to be made.
  9935.      OTHER_FILES, OBJECTS_SYSTEM and OBJECTS_MACHINE
  9936. --- 586,598 ----
  9937.   
  9938.   /* The files of Lisp proper */
  9939.   
  9940. ! alloc.o : alloc.c window.h buffer.h config.h
  9941. ! bytecode.o : bytecode.c buffer.h config.h
  9942. ! data.o : data.c buffer.h config.h
  9943.   eval.o : eval.c commands.h config.h
  9944.   fns.o : fns.c buffer.h commands.h config.h
  9945. ! print.o : print.c process.h window.h buffer.h dispextern.h termchar.h config.h
  9946. ! lread.o : lread.c buffer.h paths.h config.h
  9947.   
  9948.   /* System-specific programs to be made.
  9949.      OTHER_FILES, OBJECTS_SYSTEM and OBJECTS_MACHINE
  9950. ***************
  9951. *** 533,535 ****
  9952. --- 602,619 ----
  9953.   
  9954.   ${etcdir}emacstool: ${etcdir}emacstool.c
  9955.       cd ${etcdir}; ${MAKE} ${MFLAGS} emacstool
  9956. + SimpleRexx.o: SimpleRexx.c SimpleRexx.h
  9957. + amiga_clipboard.o: amiga_clipboard.c termchar.h amiga.h config.h
  9958. + amiga_dump.o: amiga_dump.c termchar.h buffer.h dispextern.h regex.h amiga.h config.h
  9959. + amiga_menu.o: amiga_menu.c amiga.h config.h
  9960. + amiga_processes.o: amiga_processes.c amiga.h config.h
  9961. + amiga_rexx.o: amiga_rexx.c SimpleRexx.h amiga.h config.h
  9962. + amiga_screen.o: amiga_screen.c termchar.h dispextern.h amiga.h config.h
  9963. + amiga_serial.o: amiga_serial.c amiga.h config.h
  9964. + amiga_sysdep.o: amiga_sysdep.c termopts.h termhooks.h termchar.h dispextern.h \
  9965. +         amiga.h config.h
  9966. + amiga_term.o: amiga_term.c termopts.h termhooks.h  termchar.h config.h
  9967. + amiga_tty.o: amiga_tty.c termhooks.h termchar.h amiga.h config.h
  9968. + amiga_malloc.o: amiga_malloc.c amiga.h config.h
  9969. +     $(CC) $(CFLAGS) parms=both amiga_malloc.c
  9970.