home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-10-03 | 317.2 KB | 11,140 lines |
- diff -rcP emacs-18.59-fsf/cpp/SCOPTIONS emacs-18.59-amiga/cpp/SCOPTIONS
- *** emacs-18.59-fsf/cpp/SCOPTIONS Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/cpp/SCOPTIONS Sat Jun 5 12:01:06 1993
- ***************
- *** 0 ****
- --- 1,7 ----
- + IGNORE=161
- + IGNORE=154
- + IGNORE=100
- + IGNORE=181
- + IGNORE=84
- + IGNORE=93
- + IGNORE=72
- \ No newline at end of file
- diff -rcP emacs-18.59-fsf/cpp/cccp.c emacs-18.59-amiga/cpp/cccp.c
- *** emacs-18.59-fsf/cpp/cccp.c Fri Sep 28 20:17:57 1990
- --- emacs-18.59-amiga/cpp/cccp.c Sat Jun 5 12:07:16 1993
- ***************
- *** 97,103 ****
- --- 97,113 ----
-
- #ifdef EMACS
- #define NO_SHORTNAMES
- + #ifdef AMIGA
- + #include "/src/config.h"
- + #undef fflush
- + #undef fwrite
- + #undef main
- + #undef putchar
- + #undef AMIGA_DUMP
- + #include <string.h>
- + #else
- #include "../src/config.h"
- + #endif
- #ifdef static
- #undef static
- #endif
- ***************
- *** 115,121 ****
- --- 125,135 ----
- #include <ctype.h>
- #include <stdio.h>
- #ifndef USG
- + #ifdef AMIGA
- + #include <time.h>
- + #else
- #include <sys/time.h> /* for __DATE__ and __TIME__ */
- + #endif
- #else
- #define index strchr
- #define rindex strrchr
- ***************
- *** 123,130 ****
- --- 137,146 ----
- #include <fcntl.h>
- #endif /* USG */
-
- + #ifndef AMIGA
- void bcopy (), bzero ();
- int bcmp ();
- + #endif
-
- char *xmalloc (), *xrealloc (), *xcalloc ();
- void fatal (), pfatal_with_name (), perror_with_name ();
- ***************
- *** 142,156 ****
- --- 158,186 ----
- /* #include "file" starts with the first entry in the stack */
- /* #include <file> starts with the second. */
- /* -I directories are added after the first */
- + #ifdef AMIGA
- + struct directory_stack default_includes[2] =
- + {
- + { &default_includes[1], "" },
- + { 0, "include:" }
- + };
- + #else
- struct directory_stack default_includes[2] =
- {
- { &default_includes[1], "." },
- { 0, "/usr/include" }
- };
- + #endif
- +
- struct directory_stack *include = &default_includes[0];
-
- + #ifdef AMIGA
- int max_include_len = 14; /* strlen (default_include) + 2
- (for / and null) */
- + #else
- + int max_include_len = 9; /* strlen (default_include) + 1
- + (for null) */
- + #endif
-
- char STDIN_FILE[] = ""; /* Empty, like real cpp */
- int put_out_comments = 0; /* JF non-zero means leave comments in the
- ***************
- *** 379,385 ****
- dirtmp->next = include->next;
- include->next = dirtmp;
- dirtmp->fname = argv[i]+2;
- - include = dirtmp;
- if (strlen (argv[i]) > max_include_len)
- max_include_len = strlen (argv[i]);
- break;
- --- 409,414 ----
- ***************
- *** 405,415 ****
- else if ((f = open (in_fname, O_RDONLY)) < 0)
- goto perror;
-
- ! fstat (f, &sbuf);
- fp->fname = in_fname;
- fp->lineno = 1;
- /* JF all this is mine about reading pipes and ttys */
- ! if ((sbuf.st_mode & S_IFMT) != S_IFREG) {
- int size;
- int bsize;
- int cnt;
- --- 434,444 ----
- else if ((f = open (in_fname, O_RDONLY)) < 0)
- goto perror;
-
- ! if (f) fstat (f, &sbuf);
- fp->fname = in_fname;
- fp->lineno = 1;
- /* JF all this is mine about reading pipes and ttys */
- ! if (!f || (sbuf.st_mode & S_IFMT) != S_IFREG) {
- int size;
- int bsize;
- int cnt;
- ***************
- *** 478,488 ****
- struct keyword_table *handle_directive ();
- int excess_newlines = 0;
- int escaped = 0;
- !
- U_CHAR *bp;
- !
- check_expand(op, ip->length);
- !
- ip->bufp = ip->buf;
- limit = ip->buf + ip->length;
- while (1) {
- --- 507,517 ----
- struct keyword_table *handle_directive ();
- int excess_newlines = 0;
- int escaped = 0;
- !
- U_CHAR *bp;
- !
- check_expand(op, ip->length);
- !
- ip->bufp = ip->buf;
- limit = ip->buf + ip->length;
- while (1) {
- ***************
- *** 615,639 ****
- *op->bufp++ = '/';
- ip->bufp = bp + 1;
- break;
- !
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- /* if digit is not part of identifier, it is random */
- if (ident_length == 0)
- goto randomchar;
- /* fall through */
- !
- case '_':
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
- case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
- case 's': case 't': case 'u': case 'v': case 'w': case 'x':
- ! case 'y': case 'z':
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
- case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
- case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
- ! case 'Y': case 'Z':
- ident_length++;
- /* compute step of hash function, to avoid a proc call on every token */
- hash = HASHSTEP(hash, c);
- --- 644,668 ----
- *op->bufp++ = '/';
- ip->bufp = bp + 1;
- break;
- !
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- /* if digit is not part of identifier, it is random */
- if (ident_length == 0)
- goto randomchar;
- /* fall through */
- !
- case '_':
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
- case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
- case 's': case 't': case 'u': case 'v': case 'w': case 'x':
- ! case 'y': case 'z':
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
- case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
- case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
- ! case 'Y': case 'Z':
- ident_length++;
- /* compute step of hash function, to avoid a proc call on every token */
- hash = HASHSTEP(hash, c);
- ***************
- *** 646,676 ****
- for (hp = hashtab[MAKE_POS(hash) % HASHSIZE]; hp != NULL;
- hp = hp->next) {
- U_CHAR *save_ibufp; /* kludge, see below */
- !
- if (hp->length == ident_length) {
- register int i = ident_length;
- register U_CHAR *p = hp->name;
- register U_CHAR *q = op->bufp - i;
-
- ! if (c != (U_CHAR) -1)
- q--;
-
- do { /* all this to avoid a strncmp() */
- if (*p++ != *q++)
- goto hashcollision;
- } while (--i);
- !
- save_ibufp = ip->bufp;
- /* back up over identifier, then expand token */
- op->bufp -= ident_length;
- ! if (c != (U_CHAR) -1) op->bufp--;
- macroexpand (hp, ip, op, &excess_newlines);
-
- check_expand(op, ip->length - (ip->bufp - ip->buf));
- !
- /* If we just processed an identifier at end of input,
- return right away. */
- ! if (c == (U_CHAR) -1)
- return;
-
- /* if the expansion routine has not moved the input
- --- 675,705 ----
- for (hp = hashtab[MAKE_POS(hash) % HASHSIZE]; hp != NULL;
- hp = hp->next) {
- U_CHAR *save_ibufp; /* kludge, see below */
- !
- if (hp->length == ident_length) {
- register int i = ident_length;
- register U_CHAR *p = hp->name;
- register U_CHAR *q = op->bufp - i;
-
- ! if (c != -1)
- q--;
-
- do { /* all this to avoid a strncmp() */
- if (*p++ != *q++)
- goto hashcollision;
- } while (--i);
- !
- save_ibufp = ip->bufp;
- /* back up over identifier, then expand token */
- op->bufp -= ident_length;
- ! if (c != -1) op->bufp--;
- macroexpand (hp, ip, op, &excess_newlines);
-
- check_expand(op, ip->length - (ip->bufp - ip->buf));
- !
- /* If we just processed an identifier at end of input,
- return right away. */
- ! if (c == -1)
- return;
-
- /* if the expansion routine has not moved the input
- ***************
- *** 679,685 ****
- reason to put it back or not put it back. */
- if (ip->bufp == save_ibufp)
- *op->bufp++ = c;
- !
- break; /* out of for loop */
- }
- hashcollision:
- --- 708,714 ----
- reason to put it back or not put it back. */
- if (ip->bufp == save_ibufp)
- *op->bufp++ = c;
- !
- break; /* out of for loop */
- }
- hashcollision:
- ***************
- *** 687,693 ****
- } /* end for loop */
- ident_length = hash = 0; /* stop collecting identifier */
- }
- !
- /* If we just processed an identifier at end of input,
- return right away. */
- if (c == -1)
- --- 716,722 ----
- } /* end for loop */
- ident_length = hash = 0; /* stop collecting identifier */
- }
- !
- /* If we just processed an identifier at end of input,
- return right away. */
- if (c == -1)
- ***************
- *** 746,752 ****
- while (is_idchar[*cp])
- cp++;
- ident_length = cp - bp;
- !
- /*
- * Decode the keyword and call the appropriate expansion
- * routine, after moving the input pointer up to the next line.
- --- 775,781 ----
- while (is_idchar[*cp])
- cp++;
- ident_length = cp - bp;
- !
- /*
- * Decode the keyword and call the appropriate expansion
- * routine, after moving the input pointer up to the next line.
- ***************
- *** 758,770 ****
- register U_CHAR *buf;
- register U_CHAR *limit = ip->buf + ip->length;
- U_CHAR *skip_to_end_of_comment();
- !
- buf = bp = bp + ident_length;
- while (bp < limit) {
- if (*bp == '\'' || *bp == '\"') { /* JF handle quotes right */
- U_CHAR quotec;
-
- ! for (quotec = *bp++; bp < limit && *bp != quotec; bp++) {
- if (*bp == '\\') bp++;
- if (*bp == '\n') {
- if (bp[-1] == '\\')
- --- 787,804 ----
- register U_CHAR *buf;
- register U_CHAR *limit = ip->buf + ip->length;
- U_CHAR *skip_to_end_of_comment();
- !
- buf = bp = bp + ident_length;
- while (bp < limit) {
- if (*bp == '\'' || *bp == '\"') { /* JF handle quotes right */
- U_CHAR quotec;
-
- ! for (quotec = *bp++; bp < limit; bp++) {
- ! if (*bp == quotec)
- ! {
- ! bp++;
- ! break;
- ! }
- if (*bp == '\\') bp++;
- if (*bp == '\n') {
- if (bp[-1] == '\\')
- ***************
- *** 801,813 ****
- some slop */
- bp = buf;
- buf = cp;
- !
- while (bp < limit) {
- if (*bp == '\'' || *bp == '\"') { /* JF handle quotes right */
- U_CHAR quotec;
-
- *cp++ = *bp;
- ! for (quotec = *bp++; bp < limit && *bp != quotec; *cp++ = *bp++) {
- if (*bp == '\\')
- *cp++ = *bp++;
- if (*bp == '\n') {
- --- 835,852 ----
- some slop */
- bp = buf;
- buf = cp;
- !
- while (bp < limit) {
- if (*bp == '\'' || *bp == '\"') { /* JF handle quotes right */
- U_CHAR quotec;
-
- *cp++ = *bp;
- ! for (quotec = *bp++; bp < limit; *cp++ = *bp++) {
- ! if (*bp == quotec)
- ! {
- ! *cp++ = *bp++;
- ! break;
- ! }
- if (*bp == '\\')
- *cp++ = *bp++;
- if (*bp == '\n') {
- ***************
- *** 939,950 ****
- ++ip->bufp;
- }
- break;
- !
- oops:
- !
- error ("`defined' must be followed by IDENT or (IDENT)");
- break;
- !
- default:
- error("CCCP error: illegal special hash type"); /* time for gdb */
- abort ();
- --- 978,989 ----
- ++ip->bufp;
- }
- break;
- !
- oops:
- !
- error ("`defined' must be followed by IDENT or (IDENT)");
- break;
- !
- default:
- error("CCCP error: illegal special hash type"); /* time for gdb */
- abort ();
- ***************
- *** 953,959 ****
- check_expand(op, len);
- bcopy (buf, op->bufp, len);
- op->bufp += len;
- !
- return;
- }
-
- --- 992,998 ----
- check_expand(op, len);
- bcopy (buf, op->bufp, len);
- op->bufp += len;
- !
- return;
- }
-
- ***************
- *** 978,984 ****
- struct stat sbuf; /* to stat the include file */
- FILE_BUF *fp; /* for input stack frame */
- struct directory_stack *stackp;
- ! int flen;
-
- int save_indepth = indepth;
- /* in case of errors */
- --- 1017,1023 ----
- struct stat sbuf; /* to stat the include file */
- FILE_BUF *fp; /* for input stack frame */
- struct directory_stack *stackp;
- ! int flen, maxlen;
-
- int save_indepth = indepth;
- /* in case of errors */
- ***************
- *** 1019,1025 ****
- --- 1058,1068 ----
- if (err)
- goto nope;
-
- + /* DG: This doesn't handle includes of aa:... on the Amiga */
- + /* It doesn't seem worth it. */
- other_dir = NULL;
- + maxlen = max_include_len;
- + #if 0
- if (stackp == include)
- {
- fp = &instack[indepth];
- ***************
- *** 1037,1049 ****
- other_dir = (char *) alloca (n + 1);
- strncpy (other_dir, nam, n);
- other_dir[n] = '\0';
- }
- break;
- }
- }
- }
- /* JF search directory path */
- ! fname = (char *) alloca (max_include_len + flen);
- for (; stackp; stackp = stackp->next)
- {
- if (other_dir)
- --- 1080,1094 ----
- other_dir = (char *) alloca (n + 1);
- strncpy (other_dir, nam, n);
- other_dir[n] = '\0';
- + if (n + 4 > maxlen) maxlen = n + 4;
- }
- break;
- }
- }
- }
- + #endif
- /* JF search directory path */
- ! fname = (char *) alloca (maxlen + flen);
- for (; stackp; stackp = stackp->next)
- {
- if (other_dir)
- ***************
- *** 1053,1058 ****
- --- 1098,1107 ----
- }
- else
- strcpy (fname, stackp->fname);
- + #ifdef AMIGA
- + if (fname[0] != 0 && fname[strlen(fname) - 1] != ':')
- + /* Don't add / after : or empty strings */
- + #endif
- strcat (fname, "/");
- strncat (fname, fbeg, flen);
- if ((f = open (fname, O_RDONLY)) >= 0)
- ***************
- *** 1064,1070 ****
- --- 1113,1123 ----
- goto nope;
- }
-
- + #ifdef AMIGA
- + if (stat(fname, &sbuf) < 0)
- + #else
- if (fstat(f, &sbuf) < 0)
- + #endif
- {
- perror_with_name (fname);
- goto nope; /* impossible? */
- ***************
- *** 1202,1208 ****
- ++bp; /* skip paren */
- /* Skip exactly one space or tab if any. */
- if (bp < limit && (*bp == ' ' || *bp == '\t')) ++bp;
- !
- /* now everything from bp before limit is the definition. */
- defn = collect_expansion(bp, limit - bp, arg_ptrs);
- } else {
- --- 1255,1261 ----
- ++bp; /* skip paren */
- /* Skip exactly one space or tab if any. */
- if (bp < limit && (*bp == ' ' || *bp == '\t')) ++bp;
- !
- /* now everything from bp before limit is the definition. */
- defn = collect_expansion(bp, limit - bp, arg_ptrs);
- } else {
- ***************
- *** 1226,1235 ****
- }
- }
- }
- !
- install (symname, T_MACRO, defn);
- return 0;
- !
- nope:
-
- return 1;
- --- 1279,1288 ----
- }
- }
- }
- !
- install (symname, T_MACRO, defn);
- return 0;
- !
- nope:
-
- return 1;
- ***************
- *** 1308,1314 ****
-
- if (is_idstart[*p] && (p==buf || !is_idchar[*(p-1)])) {
-
- ! for (id_len = 0; is_idchar[p[id_len]]; id_len++)
- ;
- for (arg = arglist; arg != NULL; arg = arg->next) {
- struct reflist *tpat;
- --- 1361,1367 ----
-
- if (is_idstart[*p] && (p==buf || !is_idchar[*(p-1)])) {
-
- ! for (id_len = 0; p+id_len < buf+size && is_idchar[p[id_len]]; id_len++)
- ;
- for (arg = arglist; arg != NULL; arg = arg->next) {
- struct reflist *tpat;
- ***************
- *** 1341,1347 ****
- *exp_p++ = '\0';
-
- defn->length = exp_p - defn->expansion - 1;
- !
- /* give back excess storage */
- defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
-
- --- 1394,1400 ----
- *exp_p++ = '\0';
-
- defn->length = exp_p - defn->expansion - 1;
- !
- /* give back excess storage */
- defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
-
- ***************
- *** 1456,1462 ****
- delete (hp);
- }
-
- ! /* handle #error command later */
- do_error()
- {
- }
- --- 1509,1515 ----
- delete (hp);
- }
-
- ! /* handle #error command later */
- do_error()
- {
- }
- ***************
- *** 1465,1470 ****
- --- 1518,1538 ----
- * the behavior of the #pragma directive is implementation defined.
- * this implementation defines it as follows.
- */
- + #ifdef AMIGA
- + do_pragma(buf, limit, op, keyword)
- + U_CHAR *buf, *limit;
- + FILE_BUF *op;
- + struct keyword_table *keyword;
- + {
- + /* Just copy the pragma directibe back out */
- + int len2 = limit - buf, len1 = sizeof("#pragma") - 1;
- +
- + check_expand(op, len1 + len2);
- + bcopy("#pragma", op->bufp, len1);
- + bcopy(buf, op->bufp + len1, len2);
- + op->bufp += len1 + len2;
- + }
- + #else
- do_pragma()
- {
- close (0);
- ***************
- *** 1479,1484 ****
- --- 1547,1553 ----
- nope:
- fatal ("You are in a maze of twisty compiler features, all different");
- }
- + #endif
-
- typedef struct if_stack {
- struct if_stack *next; /* for chaining to the next stack frame */
- ***************
- *** 1541,1547 ****
- }
- if_stack->type = T_ELIF;
- }
- !
- value = eval_if_expression (buf, limit - buf);
- conditional_skip (ip, value == 0, T_ELIF);
- }
- --- 1610,1616 ----
- }
- if_stack->type = T_ELIF;
- }
- !
- value = eval_if_expression (buf, limit - buf);
- conditional_skip (ip, value == 0, T_ELIF);
- }
- ***************
- *** 1574,1580 ****
-
- delete (save_defined); /* clean up special symbol */
- free (temp_obuf.buf);
- !
- return value;
- }
-
- --- 1643,1649 ----
-
- delete (save_defined); /* clean up special symbol */
- free (temp_obuf.buf);
- !
- return value;
- }
-
- ***************
- *** 1614,1620 ****
- if_stack = temp;
-
- if_stack->type = type;
- !
- if (skip != 0) {
- skip_if_group(ip);
- return;
- --- 1683,1689 ----
- if_stack = temp;
-
- if_stack->type = type;
- !
- if (skip != 0) {
- skip_if_group(ip);
- return;
- ***************
- *** 1724,1730 ****
- * without changing if_stack ; this is so that the error message
- * for missing #endif's etc. will point to the original #if. It
- * is possible that something different would be better.
- ! */
- do_else(buf, limit, op, keyword)
- U_CHAR *buf, *limit;
- FILE_BUF *op;
- --- 1793,1799 ----
- * without changing if_stack ; this is so that the error message
- * for missing #endif's etc. will point to the original #if. It
- * is possible that something different would be better.
- ! */
- do_else(buf, limit, op, keyword)
- U_CHAR *buf, *limit;
- FILE_BUF *op;
- ***************
- *** 1915,1921 ****
- int totlen; /* total amount of exp buffer filled so far */
-
- register struct reflist *ap;
- ! struct argptrs {
- U_CHAR *argstart;
- int length;
- } *args;
- --- 1984,1990 ----
- int totlen; /* total amount of exp buffer filled so far */
-
- register struct reflist *ap;
- ! struct argptrs {
- U_CHAR *argstart;
- int length;
- } *args;
- ***************
- *** 1999,2005 ****
- ip2->buf = ip2->bufp = defn->expansion;
- ip2->length = defn->length;
- }
- !
- rescan (ip2, op);
- --indepth;
- *excess_newlines_ptr += newlines_found;
- --- 2068,2074 ----
- ip2->buf = ip2->bufp = defn->expansion;
- ip2->length = defn->length;
- }
- !
- rescan (ip2, op);
- --indepth;
- *excess_newlines_ptr += newlines_found;
- ***************
- *** 2024,2030 ****
- {
- int paren = 0;
- int quotec = 0;
- !
- while (bp < ip->buf + ip->length) {
- switch (*bp) {
- case '(':
- --- 2093,2099 ----
- {
- int paren = 0;
- int quotec = 0;
- !
- while (bp < ip->buf + ip->length) {
- switch (*bp) {
- case '(':
- ***************
- *** 2084,2092 ****
- }
-
- if (ip != NULL)
- ! fprintf(stdout, "file %s, offset %d (line %d): ",
- ip->fname, ip->bufp - ip->buf, ip->lineno);
- ! fprintf(stdout, "%s\n", msg);
- return 0;
- }
-
- --- 2153,2161 ----
- }
-
- if (ip != NULL)
- ! fprintf(stderr, "file %s, offset %d (line %d): ",
- ip->fname, ip->bufp - ip->buf, ip->lineno);
- ! fprintf(stderr, "%s\n", msg);
- return 0;
- }
-
- ***************
- *** 2109,2115 ****
- {
- register int i;
- register U_CHAR *p;
- !
- if (obuf->length - (obuf->bufp - obuf->buf) > needed)
- return obuf->buf;
-
- --- 2178,2184 ----
- {
- register int i;
- register U_CHAR *p;
- !
- if (obuf->length - (obuf->bufp - obuf->buf) > needed)
- return obuf->buf;
-
- ***************
- *** 2125,2131 ****
-
- return p;
- }
- !
- /*
- * install a name in the main hash table, even if it is already there.
- * name stops with first non alphanumeric, except leading '#'.
- --- 2194,2200 ----
-
- return p;
- }
- !
- /*
- * install a name in the main hash table, even if it is already there.
- * name stops with first non alphanumeric, except leading '#'.
- ***************
- *** 2198,2204 ****
- delete(hp)
- HASHNODE *hp;
- {
- !
- if (hp->prev != NULL)
- hp->prev->next = hp->next;
- if (hp->next != NULL)
- --- 2267,2273 ----
- delete(hp)
- HASHNODE *hp;
- {
- !
- if (hp->prev != NULL)
- hp->prev->next = hp->next;
- if (hp->next != NULL)
- ***************
- *** 2232,2241 ****
- int hashsize;
- {
- register int r = 0;
- !
- while (len--)
- r = HASHSTEP(r, *name++);
- !
- return MAKE_POS(r) % hashsize;
- }
-
- --- 2301,2310 ----
- int hashsize;
- {
- register int r = 0;
- !
- while (len--)
- r = HASHSTEP(r, *name++);
- !
- return MAKE_POS(r) % hashsize;
- }
-
- ***************
- *** 2282,2288 ****
- #endif
-
- /* is there more? */
- !
- }
-
- /*
- --- 2351,2357 ----
- #endif
-
- /* is there more? */
- !
- }
-
- /*
- ***************
- *** 2357,2363 ****
- #endif /* not VMS */
- }
-
- ! void
- bcopy (b1, b2, length)
- register char *b1;
- register char *b2;
- --- 2426,2432 ----
- #endif /* not VMS */
- }
-
- ! void
- bcopy (b1, b2, length)
- register char *b1;
- register char *b2;
- ***************
- *** 2379,2385 ****
- *b2++ = *b1++;
- #endif /* not VMS */
- }
- !
- int
- bcmp (b1, b2, length) /* This could be a macro! */
- register char *b1;
- --- 2448,2454 ----
- *b2++ = *b1++;
- #endif /* not VMS */
- }
- !
- int
- bcmp (b1, b2, length) /* This could be a macro! */
- register char *b1;
- diff -rcP emacs-18.59-fsf/cpp/smakefile emacs-18.59-amiga/cpp/smakefile
- *** emacs-18.59-fsf/cpp/smakefile Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/cpp/smakefile Sat Oct 2 15:30:13 1993
- ***************
- *** 0 ****
- --- 1,23 ----
- + # Makefile for cccp in the Emacs distribution only.
- + # Here we assume that you are using SASC
- + # (since cccp is used by Emacs only to deal with long strings in macros.
- +
- + CFLAGS=DEF EMACS idir //unix/include/ def STACK_DIRECTION=-1 def OUTPUT_LINE_COMMANDS nowvret debug sf
- +
- + cpp: cccp
- + -delete cpp
- + makelink cpp cccp
- + cccp: cccp.o cexp.tab.o alloca.o
- + sc link cccp.o alloca.o cexp.tab.o to cccp lib //unix/src/unix.lib
- +
- + testexp: y.tab.c
- + cc -g -DTEST_EXP_READER y.tab.c -o testexp
- +
- + cexp.tab.c: cexp.y
- + echo "expect 40 shift/reduce conflicts"
- + bin:bison cexp.y >bison.debug
- +
- + cccp.o: cccp.c
- + cexp.tab.o: cexp.tab.c
- + alloca.o: /src/alloca.c
- + $(CC) $(CFLAGS) objname alloca.o /src/alloca.c
- diff -rcP emacs-18.59-fsf/etc/SCOPTIONS emacs-18.59-amiga/etc/SCOPTIONS
- *** emacs-18.59-fsf/etc/SCOPTIONS Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/etc/SCOPTIONS Sat Dec 5 18:07:36 1992
- ***************
- *** 0 ****
- --- 1,15 ----
- + STRINGMERGE
- + STRUCTUREEQUIVALENCE
- + NOWARNVOIDRETURN
- + NOVERSION
- + MEMORYSIZE=HUGE
- + INCLUDEDIR=src:unix/include
- + IGNORE=147
- + IGNORE=62
- + IGNORE=132
- + IGNORE=154
- + IGNORE=104
- + IGNORE=100
- + IGNORE=161
- + IGNORE=84
- + IGNORE=93
- diff -rcP emacs-18.59-fsf/etc/amiga-env.c emacs-18.59-amiga/etc/amiga-env.c
- *** emacs-18.59-fsf/etc/amiga-env.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/etc/amiga-env.c Sat Jun 5 16:55:12 1993
- ***************
- *** 0 ****
- --- 1,439 ----
- + /* env.c - manipulate environment and execute a program
- + in that environment
- + Mly 861126
- +
- + Copyright (C) 1986 Free Software Foundation, Inc.
- +
- + This program is free software; you can redistribute it and/or modify
- + it under the terms of the GNU General Public License as published by
- + the Free Software Foundation; either version 1, or (at your option)
- + any later version.
- +
- + This program is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + GNU General Public License for more details.
- +
- + You should have received a copy of the GNU General Public License
- + along with this program; if not, write to the Free Software
- + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- +
- + In other words, you are welcome to use, share and improve this program.
- + You are forbidden to forbid anyone else to use, share and improve
- + what you give them. Help stamp out software-hoarding! */
- +
- + /*
- +
- + If first argument is "-", then a new environment is constructed
- + from scratch; otherwise the environment is inherited from the parent
- + process, except as modified by other options.
- +
- + So, "env - foo" will invoke the "foo" program in a null environment,
- + whereas "env foo" would invoke "foo" in the same environment as that
- + passed to "env" itself.
- +
- + Subsequent arguments are interpreted as follows:
- +
- + * "variable=value" (ie an arg containing a "=" character)
- + means to set the specified environment variable to that value.
- + `value' may be of zero length ("variable="). Note that setting
- + a variable to a zero-length value is different from unsetting it.
- +
- + * "-u variable" or "-unset variable"
- + means to unset that variable
- + If that variable isn't set, does nothing.
- +
- + * "-s variable value" or "-set variable value"
- + same as "variable=value"
- +
- + * "-" or "--"
- + are used to indicate that the following argument is the program
- + to invoke. This is only necessary when the program's name
- + begins with "-" or contains a "="
- +
- + * anything else
- + The first remaining argument specifies a program to invoke
- + (it is searched for according to the specification of the PATH
- + environment variable) and any arguments following that are
- + passed as arguments to that program
- +
- + If no program-name is specified following the environment
- + specifications the the resulting environment is printed
- + (The is like specifying a program-name of "printenv")
- +
- + Examples:
- + If the environment passed to "env" is
- + { USER=rms EDITOR=emacs PATH=.:/gnubin:/hacks }
- +
- + * "env DISPLAY=gnu:0 nemacs"
- + calls "nemacs" in the envionment
- + { EDITOR=emacs USER=rms DISPLAY=gnu }
- +
- + * "env - USER=foo /hacks/hack bar baz"
- + will call the "hack" program on arguments "bar" and "baz"
- + in an environment in which the only variable is "USER"
- + Note that the "-" option will clear out the PATH variable,
- + so one should be careful to specify in which directory
- + to find the program to call
- +
- + * "env -u EDITOR USER=foo PATH=/energy -- e=mc2 bar baz"
- + The program "/energy/e=mc2" is called with environment
- + { USER=foo PATH=/energy }
- +
- + */
- +
- + #include <exec/types.h>
- + #include <dos/dostags.h>
- + #include <dos/var.h>
- + #include <proto/dos.h>
- + #include <proto/exec.h>
- +
- + #ifdef EMACS
- + #define NO_SHORTNAMES
- + #include "../src/config.h"
- + #endif /* EMACS */
- +
- + #include <stdio.h>
- + #include <errno.h>
- + #include <setjmp.h>
- +
- + extern int execvp ();
- + extern char *index ();
- +
- + char *xmalloc (), *xrealloc ();
- + char *concat ();
- +
- + char *progname;
- + void setenv ();
- + void fatal ();
- +
- + #define index strchr
- +
- + struct MsgPort *end_port;
- + struct {
- + struct Message msg;
- + int rc;
- + } end_msg;
- + int gargc;
- + char **gargv;
- + jmp_buf unixexit_buf;
- +
- + void __saveds unix_start(void)
- + {
- + int rc;
- +
- + if (!(rc = setjmp(unixexit_buf)))
- + {
- + unixmain(gargc, gargv);
- + rc = 1;
- + }
- + end_msg.rc = rc - 1;
- + end_msg.msg.mn_Length = sizeof(end_msg);
- + end_msg.msg.mn_Node.ln_Type = NT_MESSAGE;
- + PutMsg(end_port, &end_msg);
- + }
- +
- + void unixexit(int rc)
- + {
- + longjmp(unixexit_buf, rc + 1);
- + }
- +
- + main(int argc, char **argv)
- + {
- + int rc = 1;
- + long stacksize;
- + struct Process *us = (struct Process *)FindTask(0);
- +
- + if (us->pr_CLI) stacksize = ((struct CommandLineInterface *)BADDR(us->pr_CLI))->cli_DefaultStack << 2;
- + else stacksize = us->pr_StackSize;
- +
- + gargc = argc;
- + gargv = argv;
- +
- + end_port = CreateMsgPort();
- +
- + if (end_port && CreateNewProcTags(NP_Entry, unix_start,
- + NP_Input, Input(), NP_CloseInput, 0UL,
- + NP_Output, Output(), NP_CloseOutput, 0UL,
- + NP_StackSize, stacksize,
- + NP_Cli, TRUE, TAG_END))
- + {
- + while (!GetMsg(end_port)) WaitPort(end_port);
- + rc = end_msg.rc;
- + }
- + if (end_port) DeleteMsgPort(end_port);
- + Delay(1);
- + exit(rc);
- + }
- +
- + #define exit unixexit
- +
- + unixmain (argc, argv)
- + register int argc;
- + register char **argv;
- + {
- + register char *tem;
- +
- + progname = argv[0];
- + argc--;
- + argv++;
- +
- + /* "-" flag means to not inherit parent's environment */
- + /* This is ignored on the amiga */
- + if (argc && !strcmp (*argv, "-"))
- + {
- + argc--;
- + argv++;
- + }
- +
- + while (argc > 0)
- + {
- + tem = index (*argv, '=');
- + if (tem)
- + /* If arg contains a "=" it specifies to set a variable */
- + {
- + *tem = '\000';
- + setenv (*argv, tem + 1);
- + argc--; argv++;
- + continue;
- + }
- +
- + if (**argv != '-')
- + /* Remaining args are program name and args to pass it */
- + break;
- +
- + if (argc < 2)
- + fatal ("No argument following \"%s\" switch", *argv);
- + if (!strcmp (*argv, "-u") ||
- + !strcmp (*argv, "-unset"))
- + /* Unset a variable */
- + {
- + argc--; argv++;
- + setenv (*argv, 0);
- + argc--; argv++;
- + }
- + else if (!strcmp (*argv, "-s") ||
- + !strcmp (*argv, "-set"))
- + /* Set a variable */
- + {
- + argc--; argv++;
- + tem = *argv;
- + if (argc < 2)
- + fatal ("No value specified for variable \"%s\"",
- + tem);
- + argc--; argv++;
- + setenv (tem, *argv);
- + argc--; argv++;
- + }
- + else if (!strcmp (*argv, "-") || !strcmp (*argv, "--"))
- + {
- + argc--; argv++;
- + break;
- + }
- + else
- + {
- + fatal ("unknown switch \"%s\"", *argv);
- + }
- + }
- +
- + /* If no program specified print the environment and exit */
- + if (argc <= 0)
- + {
- + printenv();
- + exit (0);
- + }
- + else
- + {
- + extern int errno, sys_nerr;
- + extern char *sys_errlist[];
- +
- + (void) execvp (*argv, argv);
- +
- + fprintf (stderr, "%s: Cannot execute \"%s\"",
- + progname, *argv);
- + if (errno < sys_nerr)
- + fprintf (stderr, ": %s\n" , sys_errlist[errno]);
- + else
- + putc ('\n', stderr);
- + exit (errno != 0 ? errno : 1);
- + }
- + }
- +
- + int execvp(program, argv)
- + char *program, **argv;
- + {
- + int index, comsize;
- + char *combuf, *bp;
- + long err, rc;
- +
- + combuf = xmalloc(256);
- + comsize = 256;
- +
- + bp = combuf;
- + for (index = 0; argv[index] != 0; index++)
- + {
- + char *s = argv[index];
- + int len;
- +
- + len = 3;
- + while (*s) len += 1 + 2 * (*s++ == '"');
- + if (bp + len + 1 >= combuf + comsize)
- + {
- + char *newbuf;
- + int new_comsize;
- +
- + new_comsize = 2 * comsize + len;
- + newbuf = xmalloc(new_comsize);
- + memcpy(newbuf, combuf, comsize);
- +
- + bp = newbuf + (bp - combuf);
- + combuf = newbuf;
- + comsize = new_comsize;
- + }
- + *bp++ = ' ';
- + *bp++ = '"';
- + s = argv[index];
- + while (*s)
- + {
- + if (*s == '"' || *s == '*') *bp++ = '*';
- + *bp++ = *s++;
- + }
- + *bp++ = '"';
- + }
- + *bp = '\0';
- + rc = SystemTags(combuf,
- + SYS_UserShell, 1UL,
- + TAG_END);
- + err = IoErr();
- + free(combuf);
- + if (rc != -1) exit(rc);
- +
- + errno = convert_oserr(err);
- + return -1;
- + }
- +
- + int convert_oserr(int ioerr)
- + {
- + extern int _OSERR;
- +
- + _OSERR = ioerr;
- + switch (ioerr)
- + {
- + case 0: return 0;
- + case ERROR_NO_FREE_STORE: return ENOMEM;
- + case ERROR_TASK_TABLE_FULL: return EAGAIN;
- + case ERROR_BAD_TEMPLATE: case ERROR_REQUIRED_ARG_MISSING:
- + case ERROR_KEY_NEEDS_ARG: case ERROR_TOO_MANY_ARGS:
- + case ERROR_UNMATCHED_QUOTES: case ERROR_LINE_TOO_LONG: return EINVAL;
- + case ERROR_OBJECT_IN_USE: return EBUSY;
- + case ERROR_OBJECT_EXISTS: return EEXIST;
- + case ERROR_DIR_NOT_FOUND: return ENOENT;
- + case ERROR_OBJECT_NOT_FOUND: return ENOENT;
- + case ERROR_BAD_STREAM_NAME: return EINVAL;
- + case ERROR_OBJECT_TOO_LARGE: return E2BIG;
- + case ERROR_ACTION_NOT_KNOWN: return EINVAL;
- + case ERROR_INVALID_COMPONENT_NAME: return EINVAL;
- + case ERROR_INVALID_LOCK: return EINVAL;
- + case ERROR_OBJECT_WRONG_TYPE: return EINVAL;
- + case ERROR_DISK_WRITE_PROTECTED: return EACCES;
- + case ERROR_SEEK_ERROR: return EIO;
- + case ERROR_DISK_FULL: return ENOSPC;
- + case ERROR_DELETE_PROTECTED: return EACCES;
- + case ERROR_WRITE_PROTECTED: return EACCES;
- + case ERROR_READ_PROTECTED: return EACCES;
- + case ERROR_RENAME_ACROSS_DEVICES: return EXDEV;
- + default: return EOSERR;
- + }
- + }
- +
- + printenv(void)
- + /* Effect: Prints a UNIX style environment from the AmigaDOS environment.
- + */
- + {
- + struct LocalVar *scan_env;
- + struct Process *us = (struct Process *)FindTask(0);
- +
- + for (scan_env = (struct LocalVar *)us->pr_LocalVars.mlh_Head;
- + scan_env->lv_Node.ln_Succ;
- + scan_env = (struct LocalVar *)scan_env->lv_Node.ln_Succ)
- + if (scan_env->lv_Node.ln_Type == LV_VAR &&
- + !(scan_env->lv_Flags & (GVF_GLOBAL_ONLY | GVF_BINARY_VAR)))
- + {
- + /* We only handle local text variables */
- + printf("%s=", scan_env->lv_Node.ln_Name);
- + fwrite(scan_env->lv_Value, 1, scan_env->lv_Len, stdout);
- + putchar('\n');
- + }
- + }
- +
- + void
- + setenv (var, val)
- + register char *var, *val;
- + {
- + if (val) SetVar(var, val, -1, LV_VAR | GVF_LOCAL_ONLY);
- + else DeleteVar(var, LV_VAR | GVF_LOCAL_ONLY);
- + }
- +
- + void
- + fatal (msg, arg1, arg2)
- + char *msg, *arg1, *arg2;
- + {
- + fprintf (stderr, "%s: ", progname);
- + fprintf (stderr, msg, arg1, arg2);
- + putc ('\n', stderr);
- + exit (1);
- + }
- +
- +
- + extern char *malloc (), *realloc ();
- +
- + void
- + memory_fatal ()
- + {
- + fatal ("Out of memory");
- + }
- +
- + char *
- + xmalloc (size)
- + int size;
- + {
- + register char *value;
- + value = (char *) malloc (size);
- + if (!value) memory_fatal ();
- + return (value);
- + }
- +
- + char *
- + xrealloc (ptr, size)
- + char *ptr;
- + int size;
- + {
- + register char *value;
- + value = (char *) realloc (ptr, size);
- + if (!value) memory_fatal ();
- + return (value);
- + }
- +
- + /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */
- +
- + char *
- + concat (s1, s2, s3)
- + char *s1, *s2, *s3;
- + {
- + int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
- + char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
- +
- + strcpy (result, s1);
- + strcpy (result + len1, s2);
- + strcpy (result + len1 + len2, s3);
- + *(result + len1 + len2 + len3) = 0;
- +
- + return result;
- + }
- +
- +
- + /*
- + * Local variables:
- + * compile-command: "lc -L -v amiga-env.c"
- + * end:
- + */
- diff -rcP emacs-18.59-fsf/etc/etags.c emacs-18.59-amiga/etc/etags.c
- *** emacs-18.59-fsf/etc/etags.c Thu Aug 20 05:11:01 1992
- --- emacs-18.59-amiga/etc/etags.c Sun May 9 18:35:40 1993
- ***************
- *** 338,347 ****
- --- 338,354 ----
- {
- for (i=1; i<ac; i++)
- {
- + #ifdef AMIGA
- + rename(outfile, "OTAGS");
- + sprintf(cmd, "egrep >%s -v '\t%s\t' OTAGS", outfile, av[i]);
- + system(cmd);
- + unlink("OTAGS");
- + #else
- sprintf(cmd,
- "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
- outfile, av[i], outfile);
- system(cmd);
- + #endif
- }
- aflag++;
- }
- ***************
- *** 357,363 ****
- --- 364,374 ----
- #ifndef VMS
- if (uflag)
- {
- + #ifdef AMIGA
- + sprintf(cmd, "c:sort from %s to %s", outfile, outfile);
- + #else
- sprintf(cmd, "sort %s -o %s", outfile, outfile);
- + #endif
- system(cmd);
- }
- #endif
- diff -rcP emacs-18.59-fsf/etc/make-docfile.c emacs-18.59-amiga/etc/make-docfile.c
- *** emacs-18.59-fsf/etc/make-docfile.c Fri Oct 25 18:43:28 1991
- --- emacs-18.59-amiga/etc/make-docfile.c Sun May 9 18:35:46 1993
- ***************
- *** 57,64 ****
- --- 57,86 ----
- i += 2;
- }
-
- + #ifdef AMIGA
- + {
- + char fn[512], *fpos;
- + int c;
- +
- + c = getchar();
- + do
- + {
- + while (c == ' ' || c == '\n' || c == '\t') c = getchar();
- + if (c == EOF) break;
- + fpos = fn;
- + do *fpos++ = c;
- + while ((c = getchar()) != EOF && c != ' ' && c != '\t' && c != '\n');
- + *fpos = 0;
- +
- + fprintf(stderr, "doc file %s\n", fn);
- + err_count += scan_file (fn); /* err_count seems to be {mis,un}used */
- + }
- + while (1);
- + }
- + #else
- for (; i < argc; i++)
- err_count += scan_file (argv[i]); /* err_count seems to be {mis,un}used */
- + #endif
- #ifndef VMS
- exit (err_count); /* see below - shane */
- #endif /* VMS */
- diff -rcP emacs-18.59-fsf/etc/sh.c emacs-18.59-amiga/etc/sh.c
- *** emacs-18.59-fsf/etc/sh.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/etc/sh.c Sat Jun 5 11:44:06 1993
- ***************
- *** 0 ****
- --- 1,145 ----
- + ;/*
- + SC LINK NOSTKCHK DEF SASC=1 sh.c
- + QUIT
- + */
- + /*
- + * original version: David Gay
- + *
- + * 05/18/93 ch added SAS support, external verbose flag and primitive_parse
- + */
- + #include <exec/types.h>
- + #include <dos/dostags.h>
- + #include <stdio.h>
- +
- + #ifdef SASC
- + #include <string.h>
- + #include <stdlib.h>
- + #endif
- +
- + #include <proto/dos.h>
- +
- + /*
- + translates:
- +
- + echo "string1;string2" ; cd xx:c ; copy xx yy
- +
- + into
- +
- + echo "string1;string2" \n cd xx:c \n copy xx yy
- +
- + note:
- + this is a really primitive function ;-) , it may be
- + changed if necessary
- +
- + */
- +
- + #define QUOTE '"'
- +
- + void primitive_parse(char *s)
- + {
- + int c;
- +
- + while(c = *s++)
- + {
- + if(c == QUOTE)
- + {
- + while((c = *s++) && (c != QUOTE))
- + ;
- + if(!c)
- + break;
- + }
- + else if(c == ';')
- + *(s-1) = '\n';
- + }
- + }
- +
- + int execute(char *cmd, int debug)
- + {
- + long rc;
- + char *s;
- +
- + while (*cmd == ' ') cmd++;
- + if (strncmp(cmd, "exec", 4) == 0 && (cmd[4] == ' ' || cmd[4] == '\t'))
- + cmd += 4;
- +
- + s = cmd;
- + primitive_parse(s);
- +
- + if(debug)
- + fprintf(stderr,"/etc/sh: preparsed line:\n%s\n", cmd);
- +
- + if ((rc = SystemTags(cmd, SYS_UserShell, TRUE, TAG_END)) == -1)
- + {
- + fprintf(stderr, "Failed to execute command %s\n", cmd);
- + return 20;
- + }
- + return rc;
- + }
- +
- + void main(int argc, char **argv)
- + {
- + int command;
- + char *command_string;
- + char *program_name = argv[0];
- + struct RDArgs *args;
- + long opts[1];
- + static char options[] = "";
- + long debug = 0;
- + char *shenv;
- +
- + /* Throw out AmigaDOS args so that Input() is clean */
- + if (args = ReadArgs(options, opts, NULL)) FreeArgs(args);
- +
- + shenv = getenv("EMACS_SH_DEBUG");
- +
- + if(shenv)
- + if(strstr(shenv, "-v")) /* external verbose flag */
- + debug = 1;
- +
- + command = 0;
- + /* Simplistic argument parsing */
- + argv++;
- + argc--;
- + while (argc > 0 && argv[0][0] == '-')
- + {
- + switch (argv[0][1])
- + {
- + case 'c':
- + if (argc == 1) goto usage;
- + command = 1;
- + command_string = argv[1];
- + argv++;
- + argc--;
- + break;
- + case 'v':
- + debug = 1;
- + break;
- + case 'i':
- + /* ignored for now */
- + break;
- + default: goto usage;
- + }
- + argc--;
- + argv++;
- + }
- + if (argc != 0) goto usage;
- +
- + if (command)
- + {
- + if(debug)
- + fprintf(stderr,"%s: command_string = %s\n", argv[0], command_string);
- + exit(execute(command_string, debug));
- + }
- + else exit(Execute("", Input(), NULL) ? 0 : 1);
- +
- + usage:
- + fprintf(stderr, "%s [-i] [-v] [-c command]\n", program_name);
- + exit(1);
- + }
- +
- +
- + /*
- + * Local variables:
- + * compile-command: "sc link nostkchk def SASC=1 sh.c"
- + * end:
- + */
- diff -rcP emacs-18.59-fsf/etc/smakefile emacs-18.59-amiga/etc/smakefile
- *** emacs-18.59-fsf/etc/smakefile Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/etc/smakefile Sat Oct 2 15:30:23 1993
- ***************
- *** 0 ****
- --- 1,17 ----
- + all: etags sh wakeup make-docfile # env
- +
- + env: amiga-env.c
- + echo "'sc link to env nostkchk amiga-env.c' should work (but doesn't)."
- + echo "You're welcome to try ..."
- +
- + make-docfile: make-docfile.c
- + sc link make-docfile.c
- +
- + sh: sh.c
- + sc link sh.c
- +
- + wakeup: wakeup.c
- + sc link wakeup.c
- +
- + etags: etags.c
- + sc link idir //unix/include def ETAGS etags.c lib //unix/src/unix.lib
- diff -rcP emacs-18.59-fsf/etc/termcap.amiga emacs-18.59-amiga/etc/termcap.amiga
- *** emacs-18.59-fsf/etc/termcap.amiga Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/etc/termcap.amiga Sun May 9 18:35:58 1993
- ***************
- *** 0 ****
- --- 1,12 ----
- + Amiga termcap by Kent Polk and David Gay
- + AA|amiga|Amiga ANSI:\
- + :co#80:li#23:am:bs:bw:MT:\
- + :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
- + :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
- + :ae=\017:al=\E[L:as=\016:bl=\007:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
- + :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:ho=\E[H:ic=\E[@:is=\E[20l:\
- + :k1=\E0~:k2=\E1~:k3=\E2~:k4=\E3~:k5=\E4~:k6=\E5~:k7=\E6~:k8=\E7~:k9=\E8~:\
- + :k0=\E9~:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\E[D:\
- + :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:\
- + :rs=\Ec:se=\E[0m:sf=\E[S:so=\E[7m:sr=\E[T:ue=\E[0m:up=\E[A:us=\E[4m:\
- + :ve=\E[\040p:vi=\E[\060\040p:xn:
- diff -rcP emacs-18.59-fsf/etc/wakeup.c emacs-18.59-amiga/etc/wakeup.c
- *** emacs-18.59-fsf/etc/wakeup.c Tue Jul 30 21:03:39 1991
- --- emacs-18.59-amiga/etc/wakeup.c Sun May 9 18:36:20 1993
- ***************
- *** 18,28 ****
- --- 18,34 ----
-
- while (1)
- {
- + #ifdef AMIGA
- + if (Write(Output(), "Wake up!\n", 9) != 9) exit(0);
- + chkabort();
- + #define sleep(n) Delay(50 * (n))
- + #else
- /* Make sure wakeup stops when Emacs goes away. */
- if (getppid () == 1)
- exit (0);
- printf ("Wake up!\n");
- fflush (stdout);
- + #endif
- /* If using a period of 60, produce the output when the minute
- changes. */
- if (period == 60)
- diff -rcP emacs-18.59-fsf/lisp/amiga-init.el emacs-18.59-amiga/lisp/amiga-init.el
- *** emacs-18.59-fsf/lisp/amiga-init.el Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/lisp/amiga-init.el Sat Jun 5 11:35:42 1993
- ***************
- *** 0 ****
- --- 1,206 ----
- + (global-set-key "\C-z" 'amiga-iconify)
- + (setq amiga-map (make-keymap))
- + (global-set-key "\C-x\C-^" amiga-map)
- +
- + (load "amiga-mouse")
- + (load "amiga-menu")
- +
- + (define-key amiga-map "A" 'previous-line)
- + (define-key amiga-map "B" 'next-line)
- + (define-key amiga-map "D" 'backward-char)
- + (define-key amiga-map "C" 'forward-char)
- + (define-key amiga-map "?~" 'info)
- + (define-key amiga-map "T" 'scroll-down)
- + (define-key amiga-map "S" 'scroll-up)
- + (define-key amiga-map " @" 'forward-word)
- + (define-key amiga-map " A" 'backward-word)
- + (define-key amiga-map "\M-A" 'beginning-of-buffer)
- + (define-key amiga-map "\M-B" 'end-of-buffer)
- + (define-key amiga-map "\M-D" 'beginning-of-line)
- + (define-key amiga-map "\M-C" 'end-of-line)
- + (define-key amiga-map "\M- \M-@" 'forward-sexp)
- + (define-key amiga-map "\M- \M-A" 'backward-sexp)
- + (define-key amiga-map "\M-T" 'scroll-down-1)
- + (define-key amiga-map "\M-S" 'scroll-up-1)
- + ; Keypad sequences are handled like normal ones
- + (define-key amiga-map "K" 'do-nothing)
- +
- + (defun do-nothing () (interactive))
- +
- + (defun scroll-down-1 ()
- + "Move up one line on screen"
- + (interactive)
- + (scroll-down 1))
- +
- + (defun scroll-up-1 ()
- + "Move down one line on screen"
- + (interactive)
- + (scroll-up 1))
- +
- + ;; ARexx stuff
- +
- + ;;; This function needs to be re-written to handle rexx returned results.
- + ;;;
- + (setq amiga-arexx-processing nil)
- + (setq amiga-arexx-errors nil)
- +
- + (defvar amiga-arexx-failat 5
- + "Return level from which arexx commands returns cause errors")
- +
- + ;;
- + ;; process incoming rexx messages
- + ;;
- + (defun amiga-arexx-process ()
- + (interactive)
- + (if (not amiga-arexx-processing)
- + (progn
- + (setq amiga-arexx-processing t)
- + (condition-case nil ; Avoid blocking of processing in case of bugs
- + (let (arexxcmd)
- + (while (setq arexxcmd (amiga-arexx-get-next-msg))
- + (let ((rc 0) result)
- + (condition-case err ; detect errors in arexx command
- + (let ((expr (car (read-from-string arexxcmd))))
- + (setq result (prin1-to-string (eval expr))))
- + (error (progn
- + (setq rc 20)
- + (setq result (prin1-to-string err)))))
- + (amiga-arexx-reply rc result))))
- + (error nil))
- + (setq amiga-arexx-processing nil))))
- +
- + (defun amiga-arexx-wait-command (id)
- + "Waits for a pending ARexx commands (MSGID) to complete.
- + Also processes any pending ARexx requests during this interval.
- + returns the result list associated with this id, which takes the
- + form: (msgid result-code error-or-string)
- + ``error-or-string'' depends on ``result-code''.
- + if ``result-code'' is 0 the command finished successfully and
- + ``error-or-string'' will be a string or nil, otherwise the command
- + returned with an error and ``error-or-string'' will be an interger
- + that is the secondary error code of the arexx command."
- + (amiga-arexx-process)
- + (while (not (amiga-arexx-check-command id))
- + (amiga-arexx-wait)
- + (amiga-arexx-process))
- + (amiga-arexx-get-msg-results id))
- +
- + (defconst amiga-arexx-error-messages
- + ["No cause"
- + "Program not found"
- + "Execution halted"
- + "Insufficient memory"
- + "Invalid character"
- + "Unmatched quote"
- + "Unterminated comment"
- + "Clause too long"
- + "Invalid token"
- + "Symbol or string too long"
- + "Invalid message packet"
- + "Command string error"
- + "Error return from function"
- + "Host environment not found"
- + "Requested library not found"
- + "Function not found"
- + "Function did not return value"
- + "Wrong number of arguments"
- + "Invalid argument to function"
- + "Invalid PROCEDURE"
- + "Unexpected THEN or WHEN"
- + "Unexpected ELSE or OTHERWISE"
- + "Unexpected BREAK, LEAVE or ITERATE"
- + "Invalid statement in SELECT"
- + "Missing or multiple THEN"
- + "Missing OTHERWISE"
- + "Missing or unexpected END"
- + "Symbol mismatch"
- + "Invalid DO syntax"
- + "Incomplete IF or SELECT"
- + "Label not found"
- + "Symbol expected"
- + "Symbol or string expected"
- + "Invalid keyword"
- + "Required keyword missing"
- + "Extraneous characters"
- + "Keyword conflict"
- + "Invalid template"
- + "Invalid TRACE request"
- + "Unitialized variable"
- + "Invalid variable name"
- + "Invalid expression"
- + "Unbalanced parentheses"
- + "Nesting limit exceeded"
- + "Invalid expression result"
- + "Expression required"
- + "Boolean value not 0 or 1"
- + "Arithmetic conversion error"
- + "Invalid operand"
- + ]
- + "The arexx error messages, sorted by number")
- +
- + (defun amiga-arexx-do-command (str as-file)
- + "Sends ARexx command STR (like amiga-arexx-send-command).
- + If AS-FILE is true, STR is an arexx command, otherwise it is a file name.
- + Waits for the command to return. If the arexx command fails an error will
- + be caused.
- +
- + If you would like to get result strings and errors (ie. not cause
- + a lisp error) use: (amiga-arexx-do-command-with-results)"
- + (interactive "sARexx command:
- + P")
- + (let ((id (amiga-arexx-send-command str as-file)))
- + (if (not id)
- + (error "Failed to send arexx command.")
- + (let ((reslist (amiga-arexx-wait-command id)))
- + (let ((rc (nth 1 reslist)) (second (nth 2 reslist)))
- + (if (> rc 0)
- + (progn ; error
- + (let ((error-message
- + (if (< second (length amiga-arexx-error-messages))
- + (aref amiga-arexx-error-messages second)
- + (format nil "Unknown error %d" second))))
- + (error "Arexx command failed, level %d, cause %s" rc error-message))
- + reslist)
- + second))))))
- +
- + (defun amiga-arexx-do-command-with-results (str as-file)
- + "Sends ARexx command STR (like amiga-arexx-do-command).
- + If AS-FILE is true, STR is an arexx command, otherwise it is a file name.
- + Waits for the command to return.
- +
- + The return value is one of three things:
- + - the command executed succesfully: nil or a result string.
- + - the command failed: a list of the form (RC ERROR-CODE)
- + where RC is the severity and ERROR-CODE is the secondary error."
- + (interactive "sARexx command:
- + P")
- + (let ((id (amiga-arexx-send-command str as-file)))
- + (if (not id)
- + (error "Failed to send arexx command.")
- + (let ((reslist (amiga-arexx-wait-command id)))
- + (let ((rc (nth 1 reslist)) (second (nth 2 reslist)))
- + (if (and rc (> rc 0))
- + (list rc second)
- + second))))))
- +
- + (define-key amiga-map "X" 'amiga-arexx-process)
- + (setq amiga-arexx-initialized t) ;; ARexx commands can now be processed.
- +
- + (defun amiga-wb-process ()
- + "Process all pending workbench events, ie load all files requested"
- + (interactive)
- + (let (file)
- + (condition-case nil
- + (while (setq file (amiga-get-wb-event t))
- + (condition-case nil
- + (find-file file)
- + (error nil)))
- + (error nil))))
- +
- + (define-key amiga-map "W" 'amiga-wb-process)
- + (setq amiga-wb-initialized t) ;; WB events can now be processed.
- +
- + (setq completion-ignore-case t)
- + ;; Default is no numbered versions on Amiga, because directory searches are too
- + ;; slow.
- + (setq version-control 'never)
- Binary files emacs-18.59-fsf/lisp/amiga-init.elc and emacs-18.59-amiga/lisp/amiga-init.elc differ
- diff -rcP emacs-18.59-fsf/lisp/amiga-menu.el emacs-18.59-amiga/lisp/amiga-menu.el
- *** emacs-18.59-fsf/lisp/amiga-menu.el Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/lisp/amiga-menu.el Sat Nov 21 16:13:18 1992
- ***************
- *** 0 ****
- --- 1,135 ----
- + ;(provide 'amiga-menu)
- +
- + (defconst amiga-menu-pick (char-to-string 3))
- + (defconst amiga-menu-help (char-to-string 7))
- +
- + (defvar amiga-menus-description nil
- + "Variable containing the menus setup for Emacs")
- +
- + (defun amiga-menus-set (menus)
- + "Setup menus for emacs (parameter as for amiga-menus)"
- + (define-key mouse-map amiga-menu-pick 'amiga-menus-dispatch)
- + (define-key mouse-map amiga-menu-help 'amiga-menus-help)
- + (setq amiga-menus-description menus)
- + (amiga-menus menus))
- +
- + (defun amiga-menus-dispatch (selection)
- + (let* ((menu (car selection))
- + (item (cadr selection))
- + (code (cadr (nth item (cadr (nth menu amiga-menus-description))))))
- + (if (and (listp code) (eq (car code) 'call-interactively)
- + (listp (cadr code)) (eq (car (cadr code)) 'quote))
- + (setq this-command (cadr (cadr code))))
- + (eval code)))
- +
- + (defun amiga-menus-help (selection)
- + (let* ((menu (car selection))
- + (item (cadr selection))
- + (cmd (cadr (nth item (cadr (nth menu amiga-menus-description))))))
- + (if (and (listp cmd) (eq (car cmd) 'call-interactively)
- + (listp (car (cdr cmd))) (eq (car (car (cdr cmd))) 'quote))
- + (describe-function (car (cdr (car (cdr cmd)))))
- + (error "Don't know how to describe %s" cmd))))
- +
- + (defun make-explicit-string (str)
- + (if (and (>= (length str) 2) (= (elt str 0) 27) (< (elt str 1) 128))
- + (key-description (concat (char-to-string (+ 128 (elt str 1)))
- + (substring str 2)))
- + (key-description str)))
- +
- + (defun make-command-name (command str width)
- + (let ((keys (where-is-internal command nil t))
- + (string (if str str (symbol-name command))))
- + (if keys
- + (format (if width (format "%%-%ds%%s" (+ width 2)) "%s (%s)")
- + string (make-explicit-string keys))
- + string)))
- +
- + (defun menu-items (commands proportional)
- + (let* ((width (if proportional nil 0))
- + (names (mapcar
- + (function (lambda (cmd)
- + (if cmd
- + (let* ((name (if (symbolp cmd)
- + (symbol-name cmd)
- + (car cmd)))
- + (len (length name)))
- + (if (and (not proportional) (> len width))
- + (setq width len))
- + name))))
- + commands)))
- + (mapcar
- + (function (lambda (cmd)
- + (let ((name (car names)))
- + (setq names (cdr names))
- + (if cmd
- + (let ((command (if (symbolp cmd) cmd (cadr cmd))))
- + (list (make-command-name command name width)
- + (list 'call-interactively (list 'quote command))
- + (caddr cmd)))))))
- + commands)))
- +
- + (defun convert-menu-buffer (proportional)
- + "Convert the current buffer into a loadable menu file for emacs.\n\
- + If PROPORTIONAL is true (or if a prefix arg is given), assume menu is in a \n\
- + proportional font & present it differently."
- + (interactive "P")
- + (save-buffer)
- + (widen)
- + (goto-char 1)
- + (let ((menu-spec (reverse (read (current-buffer))))
- + menu-code)
- + (while menu-spec
- + (let ((menu-item (car menu-spec)))
- + (setq menu-code
- + (cons (list (car menu-item)
- + (menu-items (cdr menu-item) proportional))
- + menu-code))
- + (setq menu-spec (cdr menu-spec))))
- + (let ((new-buf
- + (find-file (concat
- + (substring (buffer-file-name) 0
- + (string-match "\\.menu$" (buffer-file-name)))
- + ".el"))))
- + (erase-buffer)
- + (prin1 (list 'amiga-menus-set (list 'quote menu-code)) (current-buffer))
- + (beginning-of-buffer))))
- +
- + (defvar menu-mode-syntax-table nil
- + "Syntax table used while in menu mode.")
- +
- + (defvar menu-mode-abbrev-table nil
- + "Abbrev table used while in menu mode.")
- + (define-abbrev-table 'menu-mode-abbrev-table ())
- +
- + (if menu-mode-syntax-table
- + ()
- + (setq menu-mode-syntax-table (make-syntax-table))
- + (modify-syntax-entry ?' "w " menu-mode-syntax-table))
- +
- + (defvar menu-mode-map ())
- + (if menu-mode-map
- + ()
- + (setq menu-mode-map (make-sparse-keymap))
- + (define-key menu-mode-map "\t" 'indent-relative)
- + (define-key menu-mode-map "\C-c\C-c" 'convert-menu-buffer))
- +
- + (defun menu-mode ()
- + "Major mode for editing menus intended for humans to read.
- + Indentation works like in indented-text-mode. This could be improved.\\{menu-mode-map}
- + Turning on menu-mode calls the value of the variable menu-mode-hook,
- + if that value is non-nil."
- + (interactive)
- + (kill-all-local-variables)
- + (use-local-map menu-mode-map)
- + (define-abbrev-table 'menu-mode-abbrev-table ())
- + (setq local-abbrev-table menu-mode-abbrev-table)
- + (set-syntax-table menu-mode-syntax-table)
- + (make-local-variable 'indent-line-function)
- + (setq indent-line-function 'indent-relative-maybe)
- + (use-local-map menu-mode-map)
- + (setq mode-name "Menu")
- + (setq major-mode 'menu-mode)
- + (run-hooks 'menu-mode-hook))
- +
- + (setq auto-mode-alist (cons '("\\.menu$" . menu-mode) auto-mode-alist))
- Binary files emacs-18.59-fsf/lisp/amiga-menu.elc and emacs-18.59-amiga/lisp/amiga-menu.elc differ
- diff -rcP emacs-18.59-fsf/lisp/amiga-mouse.el emacs-18.59-amiga/lisp/amiga-mouse.el
- *** emacs-18.59-fsf/lisp/amiga-mouse.el Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/lisp/amiga-mouse.el Sat Nov 21 16:13:20 1992
- ***************
- *** 0 ****
- --- 1,276 ----
- + ;; Mouse support for Amiga Intuition window system.
- + ;; Copyright (C) 1985, 1987 Free Software Foundation, Inc.
- +
- + ;; This file is part of GNU Emacs.
- +
- + ;; GNU Emacs is distributed in the hope that it will be useful,
- + ;; but WITHOUT ANY WARRANTY. No author or distributor
- + ;; accepts responsibility to anyone for the consequences of using it
- + ;; or for whether it serves any particular purpose or works at all,
- + ;; unless he says so in writing. Refer to the GNU Emacs General Public
- + ;; License for full details.
- +
- + ;; Everyone is granted permission to copy, modify and redistribute
- + ;; GNU Emacs, but only under the conditions described in the
- + ;; GNU Emacs General Public License. A copy of this license is
- + ;; supposed to have been given to you along with GNU Emacs so you
- + ;; can know your rights and responsibilities. It should be in a
- + ;; file named COPYING. Among other things, the copyright notice
- + ;; and this notice must be preserved on all copies.
- +
- + (provide 'amiga-mouse)
- +
- + (defconst amiga-button-right (char-to-string 0))
- + (defconst amiga-button-middle (char-to-string 1))
- + (defconst amiga-button-left (char-to-string 2))
- +
- + (defconst amiga-button-right-up (char-to-string 4))
- + (defconst amiga-button-middle-up (char-to-string 5))
- + (defconst amiga-button-left-up (char-to-string 6))
- +
- + (defconst amiga-button-s-right (char-to-string 16))
- + (defconst amiga-button-s-middle (char-to-string 17))
- + (defconst amiga-button-s-left (char-to-string 18))
- +
- + (defconst amiga-button-s-right-up (char-to-string 20))
- + (defconst amiga-button-s-middle-up (char-to-string 21))
- + (defconst amiga-button-s-left-up (char-to-string 22))
- +
- + (defconst amiga-button-m-right (char-to-string 32))
- + (defconst amiga-button-m-middle (char-to-string 33))
- + (defconst amiga-button-m-left (char-to-string 34))
- +
- + (defconst amiga-button-m-right-up (char-to-string 36))
- + (defconst amiga-button-m-middle-up (char-to-string 37))
- + (defconst amiga-button-m-left-up (char-to-string 38))
- +
- + (defconst amiga-button-c-right (char-to-string 64))
- + (defconst amiga-button-c-middle (char-to-string 65))
- + (defconst amiga-button-c-left (char-to-string 66))
- +
- + (defconst amiga-button-c-right-up (char-to-string 68))
- + (defconst amiga-button-c-middle-up (char-to-string 69))
- + (defconst amiga-button-c-left-up (char-to-string 70))
- +
- + (defconst amiga-button-m-s-right (char-to-string 48))
- + (defconst amiga-button-m-s-middle (char-to-string 49))
- + (defconst amiga-button-m-s-left (char-to-string 50))
- +
- + (defconst amiga-button-m-s-right-up (char-to-string 52))
- + (defconst amiga-button-m-s-middle-up (char-to-string 53))
- + (defconst amiga-button-m-s-left-up (char-to-string 54))
- +
- + (defconst amiga-button-c-s-right (char-to-string 80))
- + (defconst amiga-button-c-s-middle (char-to-string 81))
- + (defconst amiga-button-c-s-left (char-to-string 82))
- +
- + (defconst amiga-button-c-s-right-up (char-to-string 84))
- + (defconst amiga-button-c-s-middle-up (char-to-string 85))
- + (defconst amiga-button-c-s-left-up (char-to-string 86))
- +
- + (defconst amiga-button-c-m-right (char-to-string 96))
- + (defconst amiga-button-c-m-middle (char-to-string 97))
- + (defconst amiga-button-c-m-left (char-to-string 98))
- +
- + (defconst amiga-button-c-m-right-up (char-to-string 100))
- + (defconst amiga-button-c-m-middle-up (char-to-string 101))
- + (defconst amiga-button-c-m-left-up (char-to-string 102))
- +
- + (defconst amiga-button-c-m-s-right (char-to-string 112))
- + (defconst amiga-button-c-m-s-middle (char-to-string 113))
- + (defconst amiga-button-c-m-s-left (char-to-string 114))
- +
- + (defconst amiga-button-c-m-s-right-up (char-to-string 116))
- + (defconst amiga-button-c-m-s-middle-up (char-to-string 117))
- + (defconst amiga-button-c-m-s-left-up (char-to-string 118))
- +
- + (defmacro cadr (x) (list 'car (list 'cdr x)))
- + (defmacro caddr (x) (list 'car (list 'cdr (list 'cdr x))))
- + (defmacro cadddr (x) (list 'car (list 'cdr (list 'cdr (list 'cdr x)))))
- +
- + (defun coordinates-in-window-p (arg w)
- + (let ((x (car arg))
- + (y (cadr arg))
- + (edges (window-edges w)))
- + (and (>= x (car edges)) (< x (caddr edges))
- + (>= y (cadr edges)) (< y (cadddr edges))
- + (list (- x (car edges)) (- y (cadr edges))))))
- +
- + (defvar amiga-process-mouse-hook nil
- + "Hook to run after each mouse event is processed. Should take two
- + arguments; the first being a list (XPOS YPOS) corresponding to character
- + offset from top left of screen and the second being a specifier for the
- + buttons/keys.
- +
- + This will normally be set on a per-buffer basis.")
- +
- + (defun amiga-flush-mouse-queue ()
- + "Process all queued mouse events."
- + ;; A mouse event causes a special character sequence to be given
- + ;; as keyboard input. That runs this function, which process all
- + ;; queued mouse events and returns.
- + (interactive)
- + (while (> (amiga-mouse-events) 0)
- + (amiga-proc-mouse-event)
- + (and (boundp 'amiga-process-mouse-hook)
- + (symbol-value 'amiga-process-mouse-hook)
- + (funcall amiga-process-mouse-hook amiga-mouse-pos amiga-mouse-item))))
- +
- + (defun amiga-mouse-select (arg)
- + "Select Emacs window the mouse is on."
- + (let ((start-w (selected-window))
- + (done nil)
- + (w (selected-window))
- + (rel-coordinate nil))
- + (if (eq start-w (minibuffer-window))
- + (setq rel-coordinate (coordinates-in-window-p arg w))
- + (while (and (not done)
- + (null (setq rel-coordinate
- + (coordinates-in-window-p arg w))))
- + (setq w (next-window w))
- + (if (eq w start-w)
- + (setq done t))))
- + (select-window w)
- + rel-coordinate))
- +
- + (defun amiga-mouse-keep-one-window (arg)
- + "Select Emacs window mouse is on, then kill all other Emacs windows."
- + (if (amiga-mouse-select arg)
- + (delete-other-windows)))
- +
- + (defun amiga-mouse-select-and-split (arg)
- + "Select Emacs window mouse is on, then split it vertically in half."
- + (if (amiga-mouse-select arg)
- + (split-window-vertically nil)))
- +
- +
- + (defun amiga-mouse-set-point (arg)
- + "Select Emacs window mouse is on, and move point to mouse position."
- + (let* ((relative-coordinate (amiga-mouse-select arg))
- + margin-column
- + (rel-x (car relative-coordinate))
- + (rel-y (car (cdr relative-coordinate))))
- + (if relative-coordinate
- + (let ((prompt-width (if (eq (selected-window) (minibuffer-window))
- + minibuffer-prompt-width 0)))
- + (move-to-window-line rel-y)
- + (setq margin-column
- + (if (or truncate-lines (> (window-hscroll) 0))
- + (current-column)
- + ;; If we are using line continuation,
- + ;; compensate if first character on a continuation line
- + ;; does not start precisely at the margin.
- + (- (current-column)
- + (% (current-column) (1- (window-width))))))
- + (move-to-column (+ rel-x (1- (max 1 (window-hscroll)))
- + (if (= (point) 1)
- + (- prompt-width) 0)
- + margin-column))))))
- +
- + (defun amiga-mouse-set-mark (arg)
- + "Select Emacs window mouse is on, and set mark at mouse position.
- + Display cursor at that position for a second."
- + (if (amiga-mouse-select arg)
- + (let ((point-save (point)))
- + (unwind-protect
- + (progn (amiga-mouse-set-point arg)
- + (push-mark nil t)
- + (sit-for 1))
- + (goto-char point-save)))))
- +
- + (defun amiga-mouse-cut (arg)
- + "Select Emacs window mouse is on, and set mark at mouse position.
- + Display cursor at that position for a second. Then cut."
- + (if (amiga-mouse-select arg)
- + (let ((point-save (point)))
- + (unwind-protect
- + (progn (amiga-mouse-set-point arg)
- + (push-mark nil t)
- + (kill-region point-save (point))
- + (sit-for 1))
- + (goto-char point-save)))))
- +
- + (defun amiga-mouse-copy (arg)
- + "Select Emacs window mouse is on, and set mark at mouse position.
- + Display cursor at that position for a second. Then copy."
- + (if (amiga-mouse-select arg)
- + (let ((point-save (point)))
- + (unwind-protect
- + (progn (amiga-mouse-set-point arg)
- + (push-mark nil t)
- + (copy-region-as-kill point-save (point))
- + (sit-for 1))
- + (goto-char point-save)))))
- +
- + (defun amiga-mouse-paste (arg)
- + "Move point to mouse position (and select window), then paste."
- + (if (amiga-mouse-select arg)
- + (progn
- + (amiga-mouse-set-point arg)
- + (yank))))
- +
- + (defun amiga-mouse-iconify (arg) (amiga-iconify))
- +
- + (defun amiga-mouse-ignore (arg)
- + "Don't do anything.")
- +
- + ; Prevent beeps. on button-up. If the button isn't bound to anything, it
- + (define-key mouse-map amiga-button-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-s-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-m-s-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-s-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-left-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-right 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-middle 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-left 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-right-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-middle-up 'amiga-mouse-ignore)
- + (define-key mouse-map amiga-button-c-m-s-left-up 'amiga-mouse-ignore)
- +
- + ; Define a few events
- + (define-key mouse-map amiga-button-left 'amiga-mouse-set-point)
- + (define-key mouse-map amiga-button-s-left 'amiga-mouse-set-mark)
- + (define-key mouse-map amiga-button-c-left 'amiga-mouse-cut)
- + (define-key mouse-map amiga-button-m-left 'amiga-mouse-copy)
- + (define-key mouse-map amiga-button-middle 'amiga-mouse-paste)
- + (define-key mouse-map amiga-button-s-middle 'amiga-mouse-iconify)
- +
- + (define-key amiga-map "M" 'amiga-flush-mouse-queue)
- + (setq amiga-mouse-initialized t) ;; Mouse commands can now be processed.
- Binary files emacs-18.59-fsf/lisp/amiga-mouse.elc and emacs-18.59-amiga/lisp/amiga-mouse.elc differ
- diff -rcP emacs-18.59-fsf/lisp/compile.el emacs-18.59-amiga/lisp/compile.el
- *** emacs-18.59-fsf/lisp/compile.el Fri Aug 14 22:53:00 1992
- --- emacs-18.59-amiga/lisp/compile.el Thu Dec 24 17:06:50 1992
- ***************
- *** 43,49 ****
- ;; The filename excludes colons to avoid confusion when error message
- ;; starts with digits.
- (defvar compilation-error-regexp
- ! "\\([^ :\n]+\\(: *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
- "Regular expression for filename/linenumber in error in compilation log.")
-
- (defun compile (command)
- --- 43,49 ----
- ;; The filename excludes colons to avoid confusion when error message
- ;; starts with digits.
- (defvar compilation-error-regexp
- ! "^\\([^ :\e]+\\([ :] *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
- "Regular expression for filename/linenumber in error in compilation log.")
-
- (defun compile (command)
- ***************
- *** 61,67 ****
- While grep runs asynchronously, you can use the \\[next-error] command
- to find the text that grep hits refer to."
- (interactive "sRun grep (with args): ")
- ! (compile1 (concat "grep -n " command " /dev/null")
- "No more grep hits" "grep"))
-
- (defun compile1 (command error-message &optional name-of-mode)
- --- 61,68 ----
- While grep runs asynchronously, you can use the \\[next-error] command
- to find the text that grep hits refer to."
- (interactive "sRun grep (with args): ")
- ! (compile1 (concat "grep -n " command (if (eq system-type 'amigados) " nil:"
- ! " /dev/null"))
- "No more grep hits" "grep"))
-
- (defun compile1 (command error-message &optional name-of-mode)
- ***************
- *** 195,201 ****
- (let* ((pop-up-windows t)
- (w (display-buffer (marker-buffer (car next-error)))))
- (set-window-point w (car next-error))
- ! (set-window-start w (car next-error)))
- (set-marker (car next-error) nil)))
-
- ;; Set compilation-error-list to nil, and
- --- 196,208 ----
- (let* ((pop-up-windows t)
- (w (display-buffer (marker-buffer (car next-error)))))
- (set-window-point w (car next-error))
- ! (if compilation-parse-sasc
- ! (let ((thiswin (selected-window)))
- ! (select-window w)
- ! (vertical-motion -1)
- ! (set-window-start w (point))
- ! (select-window thiswin))
- ! (set-window-start w (car next-error))))
- (set-marker (car next-error) nil)))
-
- ;; Set compilation-error-list to nil, and
- ***************
- *** 222,227 ****
- --- 229,236 ----
- and visits its location."
- (setq compilation-error-list nil)
- (message "Parsing error messages...")
- + (goto-char (point-min))
- + (setq compilation-parse-sasc (search-forward "SAS/C" nil t))
- (let (text-buffer
- last-filename last-linenum)
- ;; Don't reparse messages already seen at last parse.
- Binary files emacs-18.59-fsf/lisp/compile.elc and emacs-18.59-amiga/lisp/compile.elc differ
- diff -rcP emacs-18.59-fsf/lisp/files.el emacs-18.59-amiga/lisp/files.el
- *** emacs-18.59-fsf/lisp/files.el Sun Oct 11 22:27:38 1992
- --- emacs-18.59-amiga/lisp/files.el Sat Nov 21 16:14:10 1992
- ***************
- *** 141,146 ****
- --- 141,156 ----
- after you find a file. If you explicitly request such a scan with
- \\[normal-mode], there is no query, regardless of this variable.")
-
- + (defconst backup-char (if (eq system-type 'amigados) "!" "~")
- + "Character to add to file names to make backup names.")
- +
- + (defconst autosave-char (if (eq system-type 'amigados) "@" "#")
- + "Character to add to file names to make autosave names.")
- +
- + (defconst bufferfile-char (if (eq system-type 'amigados) "^" "%")
- + "Character to add to buffer names to make file names.")
- +
- +
- ;; Avoid losing in versions where CLASH_DETECTION is disabled.
- (or (fboundp 'lock-buffer)
- (fset 'lock-buffer 'ignore))
- ***************
- *** 380,386 ****
- (funcall (intern (concat (downcase mode) "-mode")))
- (let ((alist auto-mode-alist)
- (name buffer-file-name))
- ! (let ((case-fold-search (eq system-type 'vax-vms)))
- ;; Remove backup-suffixes from file name.
- (setq name (file-name-sans-versions name))
- ;; Find first matching alist entry.
- --- 390,397 ----
- (funcall (intern (concat (downcase mode) "-mode")))
- (let ((alist auto-mode-alist)
- (name buffer-file-name))
- ! (let ((case-fold-search (or (eq system-type 'amigados)
- ! (eq system-type 'vax-vms))))
- ;; Remove backup-suffixes from file name.
- (setq name (file-name-sans-versions name))
- ;; Find first matching alist entry.
- ***************
- *** 559,566 ****
- (setq setmodes (file-modes backupname)))
- (file-error
- ;; If trouble writing the backup, write it in ~.
- ! (setq backupname (expand-file-name "~/%backup%~"))
- ! (message "Cannot write backup file; backing up in ~/%%backup%%~")
- (sleep-for 1)
- (condition-case ()
- (delete-file backupname)
- --- 570,580 ----
- (setq setmodes (file-modes backupname)))
- (file-error
- ;; If trouble writing the backup, write it in ~.
- ! (setq backupname
- ! (expand-file-name (concat "~/" bufferfile-char "backup"
- ! bufferfile-char backup-char)))
- ! (message "Cannot write backup file; backing up in ~/%sbackup%s%s"
- ! bufferfile-char bufferfile-char backup-char)
- (sleep-for 1)
- (condition-case ()
- (delete-file backupname)
- ***************
- *** 588,605 ****
- (or (string-match ";[0-9]*\\'" name)
- (and (string-match "\\." name (string-match "[]>]" name))
- (string-match "\\.[0-9]*\\'" name (match-end 0))))
- ! (string-match "\\(\\.~[0-9]+\\)?~\\'" name))))
-
- (defun make-backup-file-name (file)
- "Create the non-numeric backup file name for FILE.
- This is a separate function so you can redefine it for customization."
- ! (concat file "~"))
-
- (defun backup-file-name-p (file)
- "Return non-nil if FILE is a backup file name (numeric or not).
- This is a separate function so you can redefine it for customization.
- You may need to redefine file-name-sans-versions as well."
- ! (string-match "~$" file))
-
- ;; I believe there is no need to alter this behavior for VMS;
- ;; since backup files are not made on VMS, it should not get called.
- --- 602,620 ----
- (or (string-match ";[0-9]*\\'" name)
- (and (string-match "\\." name (string-match "[]>]" name))
- (string-match "\\.[0-9]*\\'" name (match-end 0))))
- ! (string-match (concat "\\(\\." backup-char "[0-9]+\\)?"
- ! backup-char "\\'") name))))
-
- (defun make-backup-file-name (file)
- "Create the non-numeric backup file name for FILE.
- This is a separate function so you can redefine it for customization."
- ! (concat file backup-char))
-
- (defun backup-file-name-p (file)
- "Return non-nil if FILE is a backup file name (numeric or not).
- This is a separate function so you can redefine it for customization.
- You may need to redefine file-name-sans-versions as well."
- ! (string-match (concat backup-char "$") file))
-
- ;; I believe there is no need to alter this behavior for VMS;
- ;; since backup files are not made on VMS, it should not get called.
- ***************
- *** 609,615 ****
- and whose cdr is a list of old versions to consider deleting now."
- (if (eq version-control 'never)
- (list (make-backup-file-name fn))
- ! (let* ((base-versions (concat (file-name-nondirectory fn) ".~"))
- (bv-length (length base-versions))
- (possibilities (file-name-all-completions
- base-versions
- --- 624,630 ----
- and whose cdr is a list of old versions to consider deleting now."
- (if (eq version-control 'never)
- (list (make-backup-file-name fn))
- ! (let* ((base-versions (concat (file-name-nondirectory fn) "." backup-char))
- (bv-length (length base-versions))
- (possibilities (file-name-all-completions
- base-versions
- ***************
- *** 626,645 ****
- kept-old-versions kept-new-versions -1)))
- (if (not deserve-versions-p)
- (list (make-backup-file-name fn))
- ! (cons (concat fn ".~" (int-to-string (1+ high-water-mark)) "~")
- (if (and (> number-to-delete 0)
- ;; Delete nothing if there is overflow
- ;; in the number of versions to keep.
- (>= (+ kept-new-versions kept-old-versions -1) 0))
- (mapcar (function (lambda (n)
- ! (concat fn ".~"
- ! (int-to-string n) "~")))
- (let ((v (nthcdr kept-old-versions versions)))
- (rplacd (nthcdr (1- number-to-delete) v) ())
- v))))))))
-
- (defun backup-extract-version (fn)
- ! (if (and (string-match "[0-9]+~$" fn bv-length)
- (= (match-beginning 0) bv-length))
- (string-to-int (substring fn bv-length -1))
- 0))
- --- 641,661 ----
- kept-old-versions kept-new-versions -1)))
- (if (not deserve-versions-p)
- (list (make-backup-file-name fn))
- ! (cons (concat fn "." backup-char (int-to-string (1+ high-water-mark))
- ! backup-char)
- (if (and (> number-to-delete 0)
- ;; Delete nothing if there is overflow
- ;; in the number of versions to keep.
- (>= (+ kept-new-versions kept-old-versions -1) 0))
- (mapcar (function (lambda (n)
- ! (concat fn "." backup-char
- ! (int-to-string n) backup-char)))
- (let ((v (nthcdr kept-old-versions versions)))
- (rplacd (nthcdr (1- number-to-delete) v) ())
- v))))))))
-
- (defun backup-extract-version (fn)
- ! (if (and (string-match (concat "[0-9]+" backup-char "$") fn bv-length)
- (= (match-beginning 0) bv-length))
- (string-to-int (substring fn bv-length -1))
- 0))
- ***************
- *** 741,747 ****
- ;; If file is precious, rename it away before
- ;; overwriting it.
- (let ((rename t) nodelete
- ! (file (concat buffer-file-name "#")))
- (condition-case ()
- (progn (rename-file buffer-file-name file t)
- (setq setmodes (file-modes file)))
- --- 757,763 ----
- ;; If file is precious, rename it away before
- ;; overwriting it.
- (let ((rename t) nodelete
- ! (file (concat buffer-file-name autosave-char)))
- (condition-case ()
- (progn (rename-file buffer-file-name file t)
- (setq setmodes (file-modes file)))
- ***************
- *** 774,779 ****
- --- 790,798 ----
- ;; Change the mode back, after writing.
- (setq setmodes (file-modes buffer-file-name))
- (set-file-modes buffer-file-name 511)))
- + (if (eq system-type 'amigados)
- + (if amiga-create-icons
- + (amiga-put-icon buffer-file-name nil)))
- (write-region (point-min) (point-max)
- buffer-file-name nil t)))))
- (if setmodes
- ***************
- *** 983,998 ****
- See also auto-save-file-name-p."
- (if buffer-file-name
- (concat (file-name-directory buffer-file-name)
- ! "#"
- (file-name-nondirectory buffer-file-name)
- ! "#")
- ! (expand-file-name (concat "#%" (buffer-name) "#"))))
-
- (defun auto-save-file-name-p (filename)
- "Return non-nil if FILENAME can be yielded by make-auto-save-file-name.
- FILENAME should lack slashes.
- You can redefine this for customization."
- ! (string-match "^#.*#$" filename))
-
- (defconst list-directory-brief-switches "-CF"
- "*Switches for list-directory to pass to `ls' for brief listing,")
- --- 1002,1018 ----
- See also auto-save-file-name-p."
- (if buffer-file-name
- (concat (file-name-directory buffer-file-name)
- ! autosave-char
- (file-name-nondirectory buffer-file-name)
- ! autosave-char)
- ! (expand-file-name (concat autosave-char bufferfile-char (buffer-name)
- ! autosave-char))))
-
- (defun auto-save-file-name-p (filename)
- "Return non-nil if FILENAME can be yielded by make-auto-save-file-name.
- FILENAME should lack slashes.
- You can redefine this for customization."
- ! (string-match (concat "^" autosave-char ".*" autosave-char "$") filename))
-
- (defconst list-directory-brief-switches "-CF"
- "*Switches for list-directory to pass to `ls' for brief listing,")
- Binary files emacs-18.59-fsf/lisp/files.elc and emacs-18.59-amiga/lisp/files.elc differ
- diff -rcP emacs-18.59-fsf/lisp/loadup.el emacs-18.59-amiga/lisp/loadup.el
- *** emacs-18.59-fsf/lisp/loadup.el Wed May 13 19:42:48 1992
- --- emacs-18.59-amiga/lisp/loadup.el Sat Nov 21 16:14:52 1992
- ***************
- *** 28,34 ****
- (load "simple")
- (garbage-collect)
- (load "help")
- - (garbage-collect)
- (load "files")
- (garbage-collect)
- (load "indent")
- --- 28,33 ----
- ***************
- *** 64,69 ****
- --- 63,72 ----
- (progn
- (garbage-collect)
- (load "vms-patch")))
- + (if (eq system-type 'amigados)
- + (progn
- + (garbage-collect)
- + (load "amiga-init")))
-
- ;If you want additional libraries to be preloaded and their
- ;doc strings kept in the DOC file rather than in core,
- diff -rcP emacs-18.59-fsf/lisp/simple.el emacs-18.59-amiga/lisp/simple.el
- *** emacs-18.59-fsf/lisp/simple.el Wed Apr 15 08:13:32 1992
- --- emacs-18.59-amiga/lisp/simple.el Sat Nov 21 16:16:00 1992
- ***************
- *** 539,549 ****
- (defvar kill-ring-yank-pointer nil
- "The tail of the kill ring whose car is the last thing yanked.")
-
- (defun kill-append (string before-p)
- (setcar kill-ring
- (if before-p
- (concat string (car kill-ring))
- ! (concat (car kill-ring) string))))
-
- (defun kill-region (beg end)
- "Kill between point and mark.
- --- 539,585 ----
- (defvar kill-ring-yank-pointer nil
- "The tail of the kill ring whose car is the last thing yanked.")
-
- + (if (eq system-type 'amigados)
- + (progn
- + (defun safe-amiga-paste ()
- + "Paste from the amiga clipboard, trapping any errors."
- + (condition-case nil
- + (amiga-paste)
- + (error nil)))
- +
- + (defun check-clipboard ()
- + "If there is anything new in the clipboard, add it to the emacs kill ring.
- + Returns t if there was something added, nil otherwise."
- + (let (added)
- + (if amiga-new-clip
- + (let ((str (safe-amiga-paste)))
- + (setq amiga-new-clip nil)
- + (if str
- + (progn
- + (kill-add str)
- + (setq added t)
- + (setq kill-ring-yank-pointer kill-ring)))))
- + added))
- + (defun update-clipboard (str)
- + (amiga-cut str)
- + (setq amiga-new-clip nil)))
- + (progn ; These could be defined for X-Windows.
- + (defun check-clipboard () nil)
- + (defun update-clipboard () nil)))
- +
- (defun kill-append (string before-p)
- (setcar kill-ring
- (if before-p
- (concat string (car kill-ring))
- ! (concat (car kill-ring) string)))
- ! (update-clipboard (car kill-ring)))
- !
- ! (defun kill-add (string)
- ! (check-clipboard)
- ! (setq kill-ring (cons string kill-ring))
- ! (update-clipboard string)
- ! (if (> (length kill-ring) kill-ring-max)
- ! (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-
- (defun kill-region (beg end)
- "Kill between point and mark.
- ***************
- *** 571,579 ****
- (delete-region beg end)
- ;; Take the same string recorded for undo
- ;; and put it in the kill-ring.
- ! (setq kill-ring (cons (car (car buffer-undo-list)) kill-ring))
- ! (if (> (length kill-ring) kill-ring-max)
- ! (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
- (setq this-command 'kill-region)
- (setq kill-ring-yank-pointer kill-ring))
- (copy-region-as-kill beg end)
- --- 607,613 ----
- (delete-region beg end)
- ;; Take the same string recorded for undo
- ;; and put it in the kill-ring.
- ! (kill-add (car (car buffer-undo-list)))
- (setq this-command 'kill-region)
- (setq kill-ring-yank-pointer kill-ring))
- (copy-region-as-kill beg end)
- ***************
- *** 584,594 ****
- (defun copy-region-as-kill (beg end)
- "Save the region as if killed, but don't kill it."
- (interactive "r")
- ! (if (eq last-command 'kill-region)
- (kill-append (buffer-substring beg end) (< end beg))
- ! (setq kill-ring (cons (buffer-substring beg end) kill-ring))
- ! (if (> (length kill-ring) kill-ring-max)
- ! (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
- (setq this-command 'kill-region)
- (setq kill-ring-yank-pointer kill-ring))
-
- --- 618,626 ----
- (defun copy-region-as-kill (beg end)
- "Save the region as if killed, but don't kill it."
- (interactive "r")
- ! (if (and (eq last-command 'kill-region) (not (check-clipboard)))
- (kill-append (buffer-substring beg end) (< end beg))
- ! (kill-add (buffer-substring beg end)))
- (setq this-command 'kill-region)
- (setq kill-ring-yank-pointer kill-ring))
-
- ***************
- *** 643,648 ****
- --- 675,681 ----
- text.
- See also the command \\[yank-pop]."
- (interactive "*P")
- + (check-clipboard)
- (rotate-yank-pointer (if (listp arg) 0
- (if (eq arg '-) -1
- (1- arg))))
- Binary files emacs-18.59-fsf/lisp/simple.elc and emacs-18.59-amiga/lisp/simple.elc differ
- diff -rcP emacs-18.59-fsf/lisp/startup.el emacs-18.59-amiga/lisp/startup.el
- *** emacs-18.59-fsf/lisp/startup.el Sun Apr 19 05:20:08 1992
- --- emacs-18.59-amiga/lisp/startup.el Sat Nov 21 16:16:08 1992
- ***************
- *** 113,121 ****
- ;; Load user's init file, or load default one.
- (condition-case error
- (if init
- ! (progn (load (if (eq system-type 'vax-vms)
- ! "sys$login:.emacs"
- ! (concat "~" init "/.emacs"))
- t t t)
- (or inhibit-default-init
- (let ((inhibit-startup-message nil))
- --- 113,121 ----
- ;; Load user's init file, or load default one.
- (condition-case error
- (if init
- ! (progn (load (cond ((eq system-type 'vax-vms) "sys$login:.emacs")
- ! ((eq system-type 'amigados) "s:.emacs")
- ! (t (concat "~" init "/.emacs")))
- t t t)
- (or inhibit-default-init
- (let ((inhibit-startup-message nil))
- ***************
- *** 129,134 ****
- --- 129,138 ----
- (save-excursion
- (set-buffer "*scratch*")
- (funcall initial-major-mode)))
- + ;; On Amiga, initialise clipboard
- + (if (eq system-type 'amigados)
- + (let ((clip (safe-amiga-paste)))
- + (if clip (kill-add clip))))
- ;; Load library for our terminal type.
- ;; User init file can set term-file-prefix to nil to prevent this.
- (and term-file-prefix (not noninteractive)
- Binary files emacs-18.59-fsf/lisp/startup.elc and emacs-18.59-amiga/lisp/startup.elc differ
- diff -rcP emacs-18.59-fsf/lisp/term/intuition-win.el emacs-18.59-amiga/lisp/term/intuition-win.el
- *** emacs-18.59-fsf/lisp/term/intuition-win.el Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/lisp/term/intuition-win.el Sat Nov 21 16:08:08 1992
- ***************
- *** 0 ****
- --- 1,47 ----
- + (load "s:.emacs-menu" t t)
- + (setq command-switch-alist (append '(("-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))
- +
- + (defun amiga-handle-set-font (switch)
- + (condition-case err
- + (let ((wfont (car command-line-args-left))
- + (height (car (read-from-string (car (cdr command-line-args-left))))))
- + (setq command-line-args-left (cdr (cdr command-line-args-left)))
- + (amiga-set-font wfont height))
- + (error (message "Failed to load font"))))
- +
- + (defun amiga-handle-set-foreground (switch)
- + (condition-case err
- + (let ((pen (car (read-from-string (car command-line-args-left)))))
- + (setq command-line-args-left (cdr command-line-args-left))
- + (amiga-set-foreground-color pen))
- + (error (message "Failed to set foreground colour"))))
- +
- + (defun amiga-handle-set-background (switch)
- + (condition-case err
- + (let ((pen (car (read-from-string (car command-line-args-left)))))
- + (setq command-line-args-left (cdr command-line-args-left))
- + (amiga-set-background-color pen))
- + (error (message "Failed to set background colour"))))
- +
- + (defun amiga-handle-set-screen (switch)
- + (condition-case err
- + (let ((name (car command-line-args-left)))
- + (setq command-line-args-left (cdr command-line-args-left))
- + (amiga-set-geometry nil nil nil nil name))
- + (error (message "Couldn't open on public screen"))))
- +
- + (defun amiga-handle-set-geometry (switch)
- + (condition-case err
- + (let ((x (car (read-from-string (car command-line-args-left))))
- + (y (car (read-from-string (car (cdr command-line-args-left)))))
- + (w (car (read-from-string (car (cdr (cdr command-line-args-left))))))
- + (h (car (read-from-string (car (cdr (cdr (cdr command-line-args-left)))))))
- + )
- + (setq command-line-args-left (cdr (cdr (cdr (cdr command-line-args-left)))))
- + (amiga-set-geometry x y w h nil))
- + (error (message "Couldn't set window size"))))
- diff -rcP emacs-18.59-fsf/lisp/term/intuition-win.elc emacs-18.59-amiga/lisp/term/intuition-win.elc
- *** emacs-18.59-fsf/lisp/term/intuition-win.elc Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/lisp/term/intuition-win.elc Sun May 16 10:57:14 1993
- ***************
- *** 0 ****
- --- 1,16 ----
- +
- + (load "s:.emacs-menu" t t)
- +
- + (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))
- +
- + (defun amiga-handle-set-font (switch) (byte-code "ÀÁÂ" [err (byte-code " @Ã A@!@ AAÄ
- + \"*" [wfont command-line-args-left height read-from-string amiga-set-font] 4) ((error (byte-code "ÀÁ!" [message "Failed to load font"] 2)))] 3))
- +
- + (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))
- +
- + (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))
- +
- + (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))
- +
- + (defun amiga-handle-set-geometry (switch) (byte-code "ÀÁÂ" [err (byte-code "Æ @!@Æ A@!@Æ AA@!@Æ AAA@!@ AAAAÇ
- + Å%," [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))
- diff -rcP emacs-18.59-fsf/lisp/texinfmt.el emacs-18.59-amiga/lisp/texinfmt.el
- *** emacs-18.59-fsf/lisp/texinfmt.el Sun Dec 8 05:28:09 1991
- --- emacs-18.59-amiga/lisp/texinfmt.el Sat Nov 21 16:16:32 1992
- ***************
- *** 874,880 ****
- (insert "\n* Menu:\n\n")
- (setq opoint (point))
- (texinfo-print-index nil indexelts)
- ! (if (eq system-type 'vax-vms)
- (texinfo-sort-region opoint (point))
- (shell-command-on-region opoint (point) "sort -fd" 1))))
-
- --- 874,880 ----
- (insert "\n* Menu:\n\n")
- (setq opoint (point))
- (texinfo-print-index nil indexelts)
- ! (if (or (eq system-type 'amigados) (eq system-type 'vax-vms))
- (texinfo-sort-region opoint (point))
- (shell-command-on-region opoint (point) "sort -fd" 1))))
-
- Binary files emacs-18.59-fsf/lisp/texinfmt.elc and emacs-18.59-amiga/lisp/texinfmt.elc differ
- diff -rcP emacs-18.59-fsf/src/SCOPTIONS emacs-18.59-amiga/src/SCOPTIONS
- *** emacs-18.59-fsf/src/SCOPTIONS Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/SCOPTIONS Sat Oct 2 15:31:56 1993
- ***************
- *** 0 ****
- --- 1,15 ----
- + STRINGMERGE
- + STRUCTUREEQUIVALENCE
- + NOWARNVOIDRETURN
- + NOVERSION
- + MEMORYSIZE=HUGE
- + INCLUDEDIR=//unix/include
- + IGNORE=147
- + IGNORE=62
- + IGNORE=132
- + IGNORE=154
- + IGNORE=104
- + IGNORE=100
- + IGNORE=161
- + IGNORE=84
- + IGNORE=93
- diff -rcP emacs-18.59-fsf/src/alloc.c emacs-18.59-amiga/src/alloc.c
- *** emacs-18.59-fsf/src/alloc.c Mon Sep 21 05:45:30 1992
- --- emacs-18.59-amiga/src/alloc.c Sun Dec 6 12:42:02 1992
- ***************
- *** 76,81 ****
- --- 76,86 ----
- Preallocated since perhaps we can't allocate it when memory is full. */
- Lisp_Object memory_exhausted_message;
-
- + #ifdef AMIGA_DUMP
- + int *pure; /* pure array is allocated at run-time */
- + int puresize = DEF_PURESIZE; /* and has a variable size */
- + #define PUREBEG (char *) pure
- + #else /* not AMIGA_DUMP */
- #ifndef HAVE_SHM
- #ifdef VMS
- int pure[PURESIZE / sizeof (int)]; /*no need to initialize - wasted space*/
- ***************
- *** 87,92 ****
- --- 92,98 ----
- #define pure PURE_SEG_BITS /* Use shared memory segment */
- #define PUREBEG (char *)PURE_SEG_BITS
- #endif /* not HAVE_SHM */
- + #endif /* not AMIGA_DUMP */
-
- /* Index in pure at which next pure object will be allocated. */
- int pureptr;
- ***************
- *** 608,614 ****
- XSET (val, Lisp_String,
- (struct Lisp_String *) current_string_block->chars);
- }
- !
- XSTRING (val)->size = length;
- XSTRING (val)->data[length] = 0;
-
- --- 614,620 ----
- XSET (val, Lisp_String,
- (struct Lisp_String *) current_string_block->chars);
- }
- !
- XSTRING (val)->size = length;
- XSTRING (val)->data[length] = 0;
-
- ***************
- *** 727,735 ****
- --- 733,745 ----
- #ifdef __GNUC__
- Lisp_Object *staticvec[NSTATICS] = {0};
- #else
- + #ifdef AMIGA_DUMP
- + Lisp_Object *staticvec[NSTATICS]; /* Doesn't need to be pure */
- + #else
- char staticvec1[NSTATICS * sizeof (Lisp_Object *)] = {0};
- #define staticvec ((Lisp_Object **) staticvec1)
- #endif
- + #endif
-
- /* Put an entry in staticvec, pointing at the variable whose address is given */
-
- ***************
- *** 859,870 ****
- {
- mark_object (&catch->tag);
- mark_object (&catch->val);
- ! }
- for (handler = handlerlist; handler; handler = handler->next)
- {
- mark_object (&handler->handler);
- mark_object (&handler->var);
- ! }
- for (backlist = backtrace_list; backlist; backlist = backlist->next)
- {
- if (!XMARKBIT (*backlist->function))
- --- 869,880 ----
- {
- mark_object (&catch->tag);
- mark_object (&catch->val);
- ! }
- for (handler = handlerlist; handler; handler = handler->next)
- {
- mark_object (&handler->handler);
- mark_object (&handler->var);
- ! }
- for (backlist = backtrace_list; backlist; backlist = backlist->next)
- {
- if (!XMARKBIT (*backlist->function))
- ***************
- *** 882,888 ****
- mark_object (&backlist->args[i]);
- XMARK (backlist->args[i]);
- }
- ! }
-
- gc_sweep ();
-
- --- 892,898 ----
- mark_object (&backlist->args[i]);
- XMARK (backlist->args[i]);
- }
- ! }
-
- gc_sweep ();
-
- ***************
- *** 900,906 ****
- i = backlist->nargs - 1;
- for (; i >= 0; i--)
- XUNMARK (backlist->args[i]);
- ! }
- XUNMARK (buffer_defaults.name);
- XUNMARK (buffer_local_symbols.name);
-
- --- 910,916 ----
- i = backlist->nargs - 1;
- for (; i >= 0; i--)
- XUNMARK (backlist->args[i]);
- ! }
- XUNMARK (buffer_defaults.name);
- XUNMARK (buffer_local_symbols.name);
-
- ***************
- *** 936,942 ****
- {
- register struct cons_block *cblk;
- register int lim = cons_block_index;
- !
- for (cblk = cons_block; cblk; cblk = cblk->next)
- {
- register int i;
- --- 946,952 ----
- {
- register struct cons_block *cblk;
- register int lim = cons_block_index;
- !
- for (cblk = cons_block; cblk; cblk = cblk->next)
- {
- register int i;
- ***************
- *** 949,955 ****
- {
- register struct symbol_block *sblk;
- register int lim = symbol_block_index;
- !
- for (sblk = symbol_block; sblk; sblk = sblk->next)
- {
- register int i;
- --- 959,965 ----
- {
- register struct symbol_block *sblk;
- register int lim = symbol_block_index;
- !
- for (sblk = symbol_block; sblk; sblk = sblk->next)
- {
- register int i;
- ***************
- *** 964,970 ****
- {
- register struct marker_block *sblk;
- register int lim = marker_block_index;
- !
- for (sblk = marker_block; sblk; sblk = sblk->next)
- {
- register int i;
- --- 974,980 ----
- {
- register struct marker_block *sblk;
- register int lim = marker_block_index;
- !
- for (sblk = marker_block; sblk; sblk = sblk->next)
- {
- register int i;
- ***************
- *** 1197,1203 ****
- register int num_free = 0, num_used = 0;
-
- cons_free_list = 0;
- !
- for (cblk = cons_block; cblk; cblk = cblk->next)
- {
- register int i;
- --- 1207,1213 ----
- register int num_free = 0, num_used = 0;
-
- cons_free_list = 0;
- !
- for (cblk = cons_block; cblk; cblk = cblk->next)
- {
- register int i;
- ***************
- *** 1226,1232 ****
- register int num_free = 0, num_used = 0;
-
- symbol_free_list = 0;
- !
- for (sblk = symbol_block; sblk; sblk = sblk->next)
- {
- register int i;
- --- 1236,1242 ----
- register int num_free = 0, num_used = 0;
-
- symbol_free_list = 0;
- !
- for (sblk = symbol_block; sblk; sblk = sblk->next)
- {
- register int i;
- ***************
- *** 1260,1266 ****
- register int num_free = 0, num_used = 0;
-
- marker_free_list = 0;
- !
- for (mblk = marker_block; mblk; mblk = mblk->next)
- {
- register int i;
- --- 1270,1276 ----
- register int num_free = 0, num_used = 0;
-
- marker_free_list = 0;
- !
- for (mblk = marker_block; mblk; mblk = mblk->next)
- {
- register int i;
- ***************
- *** 1400,1406 ****
- while ((unsigned) size > STRING_BLOCK_SIZE)
- {
- if (size & 1) size ^= MARKBIT | 1;
- ! size = *(int *)size & ~MARKBIT;
- }
-
- total_string_size += size;
- --- 1410,1417 ----
- while ((unsigned) size > STRING_BLOCK_SIZE)
- {
- if (size & 1) size ^= MARKBIT | 1;
- ! size = *(int *)size;
- ! size &= ~MARKBIT;
- }
-
- total_string_size += size;
- ***************
- *** 1438,1444 ****
- if (size & 1) size ^= MARKBIT | 1;
- objptr = (Lisp_Object *)size;
-
- ! size = XFASTINT (*objptr) & ~MARKBIT;
- if (XMARKBIT (*objptr))
- {
- XSET (*objptr, Lisp_String, newaddr);
- --- 1449,1456 ----
- if (size & 1) size ^= MARKBIT | 1;
- objptr = (Lisp_Object *)size;
-
- ! size = XFASTINT (*objptr);
- ! size &= ~MARKBIT;
- if (XMARKBIT (*objptr))
- {
- XSET (*objptr, Lisp_String, newaddr);
- ***************
- *** 1498,1504 ****
- Qt tends to return NULL, which effectively turns undo back on.
- So don't call truncate_undo_list if undo_list is Qt. */
- if (! EQ (nextb->undo_list, Qt))
- ! nextb->undo_list
- = truncate_undo_list (nextb->undo_list, undo_threshold,
- undo_high_threshold);
- nextb = nextb->next;
- --- 1510,1516 ----
- Qt tends to return NULL, which effectively turns undo back on.
- So don't call truncate_undo_list if undo_list is Qt. */
- if (! EQ (nextb->undo_list, Qt))
- ! nextb->undo_list
- = truncate_undo_list (nextb->undo_list, undo_threshold,
- undo_high_threshold);
- nextb = nextb->next;
- diff -rcP emacs-18.59-fsf/src/alloca.c emacs-18.59-amiga/src/alloca.c
- *** emacs-18.59-fsf/src/alloca.c Sat Jul 25 21:40:32 1992
- --- emacs-18.59-amiga/src/alloca.c Sun Nov 22 10:12:50 1992
- ***************
- *** 72,78 ****
- #define STACK_DIRECTION 0 /* direction unknown */
- #endif
-
- ! #if STACK_DIRECTION != 0
-
- #define STACK_DIR STACK_DIRECTION /* known at compile-time */
-
- --- 72,78 ----
- #define STACK_DIRECTION 0 /* direction unknown */
- #endif
-
- ! #if (STACK_DIRECTION) != 0
-
- #define STACK_DIR STACK_DIRECTION /* known at compile-time */
-
- ***************
- *** 137,142 ****
- --- 137,144 ----
-
- static header *last_alloca_header = NULL; /* -> last alloca header */
-
- + int alloca_calling;
- +
- pointer
- alloca (size) /* returns pointer to storage */
- unsigned size; /* # bytes to allocate */
- ***************
- *** 176,185 ****
- --- 178,189 ----
-
- /* Allocate combined header + user data storage. */
-
- + alloca_calling = 1;
- {
- register pointer new = xmalloc (sizeof (header) + size);
- /* address of header */
-
- + alloca_calling = 0;
- ((header *)new)->h.next = last_alloca_header;
- ((header *)new)->h.deep = depth;
-
- diff -rcP emacs-18.59-fsf/src/amiga.h emacs-18.59-amiga/src/amiga.h
- *** emacs-18.59-fsf/src/amiga.h Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga.h Sat Dec 5 18:07:10 1992
- ***************
- *** 0 ****
- --- 1,145 ----
- +
- + /* Prototypes for functions defined in amiga_clipboard.c */
- + void syms_of_amiga_clipboard(void);
- + void early_clipboard(void);
- + void init_clipboard(void);
- + void cleanup_clipboard(void);
- +
- + /* Prototypes for functions defined in amiga_dump.c */
- + void map_out_data(char *fn);
- + void map_in_data(int load);
- + extern void *far first_fn, *far last_fn;
- +
- + /* Prototypes for functions defined in amiga_menu.c */
- + void suspend_menus(void);
- + int resume_menus(void);
- + void syms_of_amiga_menu(void);
- + void init_amiga_menu(void);
- + void cleanup_amiga_menu(void);
- +
- + /* Prototypes for functions defined in amiga_processes.c */
- + /* Simulation of unix processes & signals */
- + int wait_for_termination(int pid);
- + int wait_without_blocking(void);
- + char *amiga_path(void);
- + void init_amiga_processes(void);
- + void cleanup_amiga_processes(void);
- +
- + /* Prototypes for functions defined in amiga_rexx.c */
- + int check_arexx(int force, int kbd);
- + void init_amiga_rexx(void);
- + void cleanup_amiga_rexx(void);
- + void syms_of_amiga_rexx(void);
- +
- + /* Prototypes for functions defined in amiga_screen.c */
- + extern struct Window *emacs_win;
- + void get_window_size(int *widthp, int *heightp);
- + void reset_window(void);
- + void force_window(void);
- + void add_wbevent(struct WBArg *wbarg);
- + void check_window(int force);
- + void setup_intchar(char intchar);
- +
- + void start_count(int n);
- + void stop_count(int n);
- + void suspend_count(int n);
- + void resume_count(int n);
- + int disp_counts(void);
- +
- + void screen_puts(char *str, unsigned int len);
- + void syms_of_amiga_screen(void);
- + void init_amiga_screen(void);
- + void cleanup_amiga_screen(void);
- +
- + /* Prototypes for functions defined in amiga_serial.c */
- + void init_amiga_serial(void);
- + void cleanup_amiga_serial(void);
- + void check_serial(int force);
- + void serial_puts(char *str, int len);
- + unsigned long serial_baud_rate(void);
- +
- + /* Prototypes for functions defined in amiga_sysdep.c */
- + extern int selecting;
- +
- + int set_exclusive_use(int fd);
- + int sys_suspend(void);
- + char *get_system_name(void);
- + char *expand_path(char *path, char *buf, int len);
- + int syms_of_amiga(void);
- + void cleanup_amiga(void);
- + void amiga_undump_reinit(void);
- + void *early_xmalloc(long size);
- + void *early_xrealloc(void *old, long size);
- +
- + /* Failure stuff */
- + void wbmessage(char *msg);
- + void fail(char *cause);
- + void fail_nomem(void);
- + void _fail_internal(char *file, int line);
- + #define fail_internal() _fail_internal(__FILE__, __LINE__);
- + enum exit_method { use_exit, use_xcexit, use_safe };
- + extern enum exit_method amiga_fail_exit;
- +
- + #define MALLOC_HUNK_SIZE 92000 /* Default malloc hunk size */
- + extern long malloc_hunk_size; /* Amount of memory malloc'ed by a to-be-dumped emacs */
- + extern long malloc_bytes_used; /* Amount of this hunk actually used */
- + extern long far pre_alloc; /* amount of memory to reserve for emacs */
- + extern int puresize; /* Size of pure hunk */
- +
- + /* Various special values used to find the beginning & end of the text, data,
- + bss and malloc segments. */
- + extern int first_data, last_data, first_bss, last_bss;
- + extern void first_function(), last_function();
- + extern char *malloc_hunk;
- + extern int amiga_initialized; /* True once Emacs has been undumped or initialised */
- + struct mem_header /* sizeof() must be multiple of 4 ! */
- + {
- + struct mem_header *next, *prev;
- + long size;
- + /* Data follows */
- + };
- + extern struct mem_header *free_list;
- +
- +
- + /* Prototypes for functions defined in amiga_term.c */
- + int amiga_term_init(void);
- +
- + /* Prototypes for functions defined in amiga_tty.c */
- + extern struct timeinfo *far odd_timer;
- + extern unsigned long odd_sig;
- + int setpgrp_of_tty(int pid);
- + int init_sigio(void);
- + int reset_sigio(void);
- + int request_sigio(void);
- + int unrequest_sigio(void);
- + int tabs_safe_p(void);
- + int get_screen_size(int *widthp, int *heightp);
- + int init_baud_rate(void);
- + void check_intuition(void);
- + #define AMIGASEQ 256 /* When passed to enque, insert the Amiga sequence introducer
- + C-x C-^ */
- + void enque(unsigned int c, int meta);
- + int init_sys_modes(void);
- + int reset_sys_modes(void);
- + void amiga_consume_input(void);
- + int discard_tty_input(void);
- + int emacs_fflush(struct __iobuf *f);
- + void emacs_putchar(int c);
- + void emacs_output(char *str, int size);
- + void emacs_fwrite(char *str, unsigned int nblocks, unsigned int len, FILE *f);
- + void syms_of_amiga_tty(void);
- + void init_amiga_tty(void);
- + void cleanup_amiga_tty(void);
- + void early_amiga_tty(void);
- + void amiga_term_open(void);
- + /* Signal mask used to detect available keyboard input.
- + Must be set by amiga_serial or amiga_screen */
- + extern unsigned long inputsig;
- +
- + /* Prototypes for functions defined in amiga_unix.c */
- + void MemCleanup(void);
- + char *malloc(int size);
- + int free(void *p);
- + char *calloc(long n, long size);
- + char *realloc(char *p, long size);
- + void emacs_malloc_init(void);
- diff -rcP emacs-18.59-fsf/src/amiga_clipboard.c emacs-18.59-amiga/src/amiga_clipboard.c
- *** emacs-18.59-fsf/src/amiga_clipboard.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_clipboard.c Tue Mar 23 09:41:50 1993
- ***************
- *** 0 ****
- --- 1,225 ----
- + #include "config.h"
- + #undef NULL
- + #include "lisp.h"
- + #include "termchar.h"
- + #include "amiga.h"
- +
- + #include <stdio.h>
- + #include <internal/devices.h>
- +
- + #undef LONGBITS
- +
- + #include <exec/types.h>
- + #include <exec/io.h>
- + #include <devices/clipboard.h>
- + #include <libraries/iffparse.h>
- + #include <utility/hooks.h>
- +
- + #include <proto/exec.h>
- + #include <proto/iffparse.h>
- +
- + #define ID_FTXT MAKE_ID('F','T','X','T')
- + #define ID_CHRS MAKE_ID('C','H','R','S')
- +
- + /*
- + * Text error messages for possible IFFERR_#? returns from various
- + * IFF routines. To get the index into this array, take your IFFERR code,
- + * negate it, and subtract one.
- + * idx = -error - 1;
- + */
- + static char *far ifferrormsgs[] = {
- + "End of file (not an error).",
- + "End of context (not an error).",
- + "No lexical scope.",
- + "Insufficient memory.",
- + "Stream read error.",
- + "Stream write error.",
- + "Stream seek error.",
- + "File is corrupt.",
- + "IFF syntax error.",
- + "Not an IFF file.",
- + "Required call-back hook missing.",
- + "Return to client. You should never see this."
- + };
- +
- + Lisp_Object amiga_new_clip;
- + static struct IFFHandle *far iff;
- + struct Library *IFFParseBase;
- +
- + static struct IOClipReq *far ClipRequest;
- + static struct Hook cliphook;
- +
- + /* added __interrupt flag this disables stack checking for this function
- + * so we can compile with stack checking on. -ch3/19/93. */
- + static ULONG __saveds __asm __interrupt
- + clip_change( register __a0 struct Hook *hook,
- + register __a2 VOID *object,
- + register __a1 ULONG *message )
- + {
- + amiga_new_clip = 1;
- + return 0;
- + }
- +
- + static Lisp_Object clip_unwind(Lisp_Object dummy)
- + {
- + CloseIFF (iff);
- + CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
- +
- + return Qnil;
- + }
- +
- + static int clip_protect(void)
- + {
- + int count = specpdl_ptr - specpdl;
- +
- + record_unwind_protect(clip_unwind, Qnil);
- +
- + return count;
- + }
- +
- + static long clip_check(long err)
- + {
- + if(err) error ("Clipboard IO failed, error %ld: %s\n",
- + err, ifferrormsgs[-err - 1]);
- + return err;
- + }
- +
- +
- + static void cut(char *str, int size)
- + {
- + int count;
- +
- + if (!(iff->iff_Stream = (ULONG) OpenClipboard (0)))
- + error ("Clipboard open failed.");
- +
- + count = clip_protect();
- +
- + /* Open clipbaord */
- + InitIFFasClip (iff);
- + clip_check(OpenIFF (iff, IFFF_WRITE));
- +
- + /* Write data */
- + clip_check(PushChunk(iff, ID_FTXT, ID_FORM, IFFSIZE_UNKNOWN));
- + clip_check(PushChunk(iff, 0, ID_CHRS, IFFSIZE_UNKNOWN));
- + if (WriteChunkBytes(iff, str, size) != size) clip_check(IFFERR_WRITE);
- + clip_check(PopChunk(iff));
- + clip_check(PopChunk(iff));
- +
- + /* & close */
- + unbind_to (count);
- + }
- +
- + DEFUN ("amiga-cut", Famiga_cut, Samiga_cut,
- + 1, 1, 0,
- + "Copy string into Amiga clipboard.")
- + (arg)
- + Lisp_Object arg;
- + {
- + struct Lisp_String *p;
- +
- + CHECK_STRING (arg, 0);
- +
- + p = XSTRING (arg);
- + cut(p->data, p->size);
- +
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-paste", Famiga_paste, Samiga_paste,
- + 0, 0, 0,
- + "Returns text currently in the Amiga clipboard, or NIL if there is none.")
- + ()
- + {
- + long err = 0;
- + Lisp_Object result = Qnil;
- + struct ContextNode *cn;
- + int count;
- +
- + if (!(iff->iff_Stream = (ULONG) OpenClipboard (0)))
- + error ("Clipboard open failed.");
- +
- + count = clip_protect();
- +
- + /* Open clipbaord */
- + InitIFFasClip (iff);
- + clip_check(OpenIFF (iff, IFFF_READ));
- + clip_check(StopChunk(iff, ID_FTXT, ID_CHRS));
- +
- + /* Find the first FTXT CHRS chunks */
- + while (result == Qnil)
- + {
- + long err = ParseIFF(iff, IFFPARSE_SCAN);
- +
- + if (err == IFFERR_EOC) continue; /* enter next context */
- + else if (err == IFFERR_EOF) break;
- + else clip_check(err);
- +
- + /* We only asked to stop at FTXT CHRS chunks
- + * If no error we've hit a stop chunk
- + * Read the CHRS chunk data
- + */
- + cn = CurrentChunk(iff);
- +
- + if ((cn) && (cn->cn_Type == ID_FTXT) && (cn->cn_ID == ID_CHRS))
- + {
- + int size = cn->cn_Size, rlen;
- +
- + result = make_string("", size);
- +
- + if ((rlen = ReadChunkBytes(iff, XSTRING (result)->data, size)) != size)
- + if (rlen < 0) clip_check(rlen);
- + else clip_check(IFFERR_EOC);
- + }
- + }
- + unbind_to (count);
- +
- + return result;
- + }
- +
- + void syms_of_amiga_clipboard(void)
- + {
- + DEFVAR_BOOL ("amiga-new-clip", &amiga_new_clip,
- + "Set to t every time a new clip is put in the Amiga clipboard");
- + amiga_new_clip = 0;
- +
- + defsubr (&Samiga_cut);
- + defsubr (&Samiga_paste);
- + }
- +
- + void early_clipboard(void)
- + {
- + IFFParseBase = 0;
- + }
- +
- + void init_clipboard(void)
- + {
- + /* Initialise IFF for clipboard */
- + if (!(IFFParseBase = OpenLibrary("iffparse.library", 0)))
- + _fail("iffparse.library is required");
- + if (!(iff = AllocIFF())) no_memory();
- +
- + ClipRequest = (struct IOClipReq *)
- + _device_open("clipboard.device", 0L, 0L, 0L, 0, sizeof(struct IOClipReq));
- + if (!ClipRequest) _fail("clipboard.device missing !?");
- +
- + cliphook.h_Entry = (ULONG (*)())clip_change;
- + ClipRequest->io_Command = CBD_CHANGEHOOK;
- + ClipRequest->io_Length = 1; /* install */
- + ClipRequest->io_Data = (APTR)&cliphook;
- + DoIO((struct IORequest *)ClipRequest);
- + }
- +
- + void cleanup_clipboard(void)
- + {
- + if (ClipRequest)
- + {
- + cliphook.h_Entry = (ULONG (*)())clip_change;
- + ClipRequest->io_Command = CBD_CHANGEHOOK;
- + ClipRequest->io_Length = 0; /* remove */
- + ClipRequest->io_Data = (APTR)&cliphook;
- + DoIO((struct IORequest *)ClipRequest);
- + }
- + if (iff) FreeIFF(iff);
- + if (IFFParseBase) CloseLibrary(IFFParseBase);
- + _device_close((struct IORequest *)ClipRequest);
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_data.c emacs-18.59-amiga/src/amiga_data.c
- *** emacs-18.59-fsf/src/amiga_data.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_data.c Sun Nov 22 10:12:54 1992
- ***************
- *** 0 ****
- --- 1 ----
- + /* Declarations of data that should not be squashed by the dump routine */
- diff -rcP emacs-18.59-fsf/src/amiga_dump.c emacs-18.59-amiga/src/amiga_dump.c
- *** emacs-18.59-fsf/src/amiga_dump.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_dump.c Sun Nov 22 10:13:00 1992
- ***************
- *** 0 ****
- --- 1,721 ----
- + #include <exec/types.h>
- + #include <fcntl.h>
- + #include <stdio.h>
- + #include <assert.h>
- + #include <proto/dos.h>
- + #include <internal/messages.h>
- + #include "config.h"
- + #include "lisp.h"
- + #include "buffer.h"
- + #include "regex.h"
- + #include "amiga.h"
- + #include "dispextern.h"
- + #include "termchar.h"
- +
- + #define RANGE(ptr, s, e) ((char *)ptr >= (char *)s && (char *)ptr < (char *)e)
- + #define HUNK_POS (VALBITS - 3)
- + #define HUNK_MASK (7 << HUNK_POS)
- + #define HUNK_CODE (0 << HUNK_POS)
- + #define HUNK_DATA (1 << HUNK_POS)
- + #define HUNK_BSS (2 << HUNK_POS)
- + #define HUNK_MALLOC (3 << HUNK_POS)
- + #define HUNK_PURE (4 << HUNK_POS)
- + #define ARRAY_MARK_FLAG ((MARKBIT >> 1) & ~MARKBIT)
- +
- + void *far first_fn = first_function, *far last_fn = last_function;
- +
- + extern int *pure, puresize;
- + extern struct gcpro *gcprolist;
- +
- + extern Lisp_Object *staticvec[];
- + extern int staticidx;
- + extern struct cons_block *cons_block;
- + extern struct Lisp_Cons *cons_free_list;
- + extern struct Lisp_Vector *all_vectors;
- + extern struct symbol_block *symbol_block;
- + extern struct Lisp_Symbol *symbol_free_list;
- + extern struct marker_block *marker_block;
- + extern struct Lisp_Marker *marker_free_list;
- +
- + struct string_block_head
- + {
- + struct string_block_head *next, *prev;
- + int pos;
- + };
- + extern struct string_block_head *current_string_block;
- + extern struct string_block_head *first_string_block;
- + extern struct string_block_head *large_string_blocks;
- + extern char *kbd_macro_buffer, *read_buffer, *chars_wasted, *copybuf;
- + extern struct minibuf_save_data *minibuf_save_vector;
- + extern struct re_pattern_buffer searchbuf;
- + extern int *ILcost, *DLcost, *ILncost, *DLncost;
- + extern Lisp_Object MouseMap, global_map, Vglobal_map, Vesc_map, Vctl_x_map;
- + extern Lisp_Object Qvariable_documentation, selected_window;
- +
- + extern char *callint_argfuns[];
- +
- + static void *dump_malloc(int size)
- + {
- + void *new = malloc(size);
- +
- + if (!new) no_memory();
- +
- + return new;
- + }
- +
- + static void bailout(char *fn)
- + {
- + if (fn) _message("%s isn't a dump file for this version of Emacs, aborting", fn);
- + else _message("Dump file isn't for this version of Emacs, aborting");
- +
- + /* We are in deep trouble, as all our variables are potentially corrupt */
- + /* Therefore, no cleanup is possible */
- + /* Remove cleanup routines */
- + onexit(0);
- + /* However, the library & the memory allocation should be ok, so
- + we can exit reasonably */
- + _fail("Some system resources may have been lost");
- + }
- +
- + static void *hunk_pointer(void *ptr)
- + {
- + if (!ptr) return ptr;
- +
- + if (RANGE(ptr, first_fn, last_fn))
- + return (void *)(HUNK_CODE | (char *)ptr - (char *)first_fn);
- + else if (RANGE(ptr, &first_data, &last_data))
- + return (void *)(HUNK_DATA | (char *)ptr - (char *)&first_data);
- + else if (RANGE(ptr, &first_bss, &last_bss))
- + return (void *)(HUNK_BSS | (char *)ptr - (char *)&first_bss);
- + else if (RANGE(ptr, malloc_hunk, malloc_hunk + malloc_hunk_size))
- + return (void *)(HUNK_MALLOC | (char *)ptr - malloc_hunk);
- + else if (RANGE(ptr, pure, (char *)pure + puresize))
- + return (void *)(HUNK_PURE | (char *)ptr - (char *)pure);
- + else bailout(0);
- + }
- +
- + static Lisp_Object hunk_lispptr(Lisp_Object *objptr, Lisp_Object val)
- + {
- + int type = val & ~VALMASK;
- + void *ptr = (void *)XPNTR(val);
- +
- + if (RANGE(ptr, first_fn, last_fn))
- + return type | HUNK_CODE | (char *)ptr - (char *)first_fn;
- + else if (RANGE(ptr, &first_data, &last_data))
- + return type | HUNK_DATA | (char *)ptr - (char *)&first_data;
- + else if (RANGE(ptr, &first_bss, &last_bss))
- + return type | HUNK_BSS | (char *)ptr - (char *)&first_bss;
- + else if (RANGE(ptr, pure, (char *)pure + puresize))
- + return type | HUNK_PURE | (char *)ptr - (char *)pure;
- + else if (RANGE(ptr, malloc_hunk, malloc_hunk + malloc_hunk_size))
- + return type | HUNK_MALLOC | (char *)ptr - malloc_hunk;
- + else bailout(0);
- + }
- +
- + static void patch_pointers ();
- +
- + static void patch_buffer (buf)
- + Lisp_Object buf;
- + {
- + Lisp_Object tem;
- + register struct buffer *buffer = XBUFFER (buf);
- + register Lisp_Object *ptr;
- +
- + buffer->text.beg = hunk_pointer (buffer->text.beg);
- + patch_pointers (&buffer->markers);
- +
- + /* This is the buffer's markbit */
- + patch_pointers (&buffer->name);
- + XMARK (buffer->name);
- +
- + for (ptr = &buffer->name + 1;
- + (char *)ptr < (char *)buffer + sizeof (struct buffer);
- + ptr++)
- + patch_pointers (ptr);
- + }
- +
- + static void patch_pointers (objptr)
- + Lisp_Object *objptr;
- + {
- + register Lisp_Object obj;
- +
- + obj = *objptr;
- + XUNMARK (obj);
- +
- +
- + loop:
- +
- + switch (XGCTYPE (obj))
- + {
- + case Lisp_String:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + break;
- +
- + case Lisp_Vector:
- + case Lisp_Window:
- + case Lisp_Process:
- + case Lisp_Window_Configuration:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Vector *ptr = XVECTOR (obj);
- + register int size = ptr->size;
- + register int i;
- +
- + if (size & ARRAY_MARK_FLAG) break; /* Already marked */
- + ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
- + for (i = 0; i < size; i++) /* and then mark its elements */
- + patch_pointers (&ptr->contents[i]);
- + }
- + break;
- +
- + case Lisp_Symbol:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Symbol *ptr = XSYMBOL (obj);
- + struct Lisp_Symbol *ptrx;
- +
- + if (XMARKBIT (ptr->plist)) break;
- + XMARK (ptr->plist);
- + XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
- + patch_pointers (&ptr->name);
- + patch_pointers ((Lisp_Object *) &ptr->value);
- + patch_pointers (&ptr->function);
- + patch_pointers (&ptr->plist);
- + objptr = (Lisp_Object *)&ptr->next;
- + ptr = ptr->next;
- + if (ptr)
- + {
- + ptrx = ptr; /* Use pf ptrx avoids compiler bug on Sun */
- + XSETSYMBOL (obj, ptrx);
- + goto loop;
- + }
- + }
- + break;
- +
- + case Lisp_Marker: {
- + struct Lisp_Marker *ptr = XMARKER (obj);
- +
- + *objptr = hunk_lispptr(objptr, *objptr);
- + if (XMARKBIT (ptr->chain)) break;
- + XMARK (ptr->chain);
- + ptr->buffer = hunk_pointer (ptr->buffer);
- + patch_pointers (&ptr->chain);
- + break;
- + }
- +
- + case Lisp_Cons:
- + case Lisp_Buffer_Local_Value:
- + case Lisp_Some_Buffer_Local_Value:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Cons *ptr = XCONS (obj);
- + if (XMARKBIT (ptr->car)) break;
- + XMARK (ptr->car);
- + patch_pointers (&ptr->car);
- + objptr = &ptr->cdr;
- + obj = ptr->cdr;
- + goto loop;
- + }
- +
- + case Lisp_Buffer:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + if (!XMARKBIT (XBUFFER (obj)->name))
- + patch_buffer (obj);
- + break;
- +
- + case Lisp_Subr: {
- + struct Lisp_Subr *subr = XSUBR(obj);
- +
- + *objptr = hunk_lispptr(objptr, *objptr);
- + if (subr->min_args & 0x8000) break;
- + subr->min_args |= 0x8000;
- + subr->function = hunk_pointer(subr->function);
- + subr->symbol_name = hunk_pointer(subr->symbol_name);
- + subr->prompt = hunk_pointer(subr->prompt);
- + if ((long)subr->doc >= 0) /* Make sure that not a doc offset */
- + subr->doc = hunk_pointer(subr->doc);
- + break;
- + }
- +
- + case Lisp_Int:
- + case Lisp_Void:
- + case Lisp_Buffer_Objfwd: break;
- +
- + case Lisp_Intfwd:
- + case Lisp_Boolfwd:
- + case Lisp_Objfwd:
- + case Lisp_Internal_Stream:
- + *objptr = hunk_lispptr(objptr, *objptr);
- + /* Don't bother with Lisp_Buffer_Objfwd,
- + since all markable slots in current buffer marked anyway. */
- + /* Don't need to do Lisp_Objfwd, since the places they point
- + are protected with staticpro. */
- + break;
- +
- + default:
- + abort ();
- + }
- + }
- +
- + static void patch_chain(void **ptr, int offset)
- + {
- + while (*ptr)
- + {
- + void **next = (void **)((char *)*ptr + offset);
- +
- + *ptr = hunk_pointer(*ptr);
- + ptr = next;
- + }
- + }
- +
- + static void patch(void)
- + {
- + int i;
- + struct string_block_head *sptr;
- + struct buffer *bptr;
- + struct mem_header *mem;
- +
- + for (i = 0; i < staticidx; i++)
- + {
- + if (!XMARKBIT(*staticvec[i]))
- + {
- + patch_pointers(staticvec[i]);
- + XMARK(*staticvec[i]);
- + }
- + staticvec[i] = hunk_pointer(staticvec[i]);
- + }
- +
- + /* Patch all the pointers normally used before a dump ! */
- + patch_chain((void **)&cons_block, 0);
- + patch_chain((void **)&cons_free_list, 0);
- +
- + patch_chain((void **)&all_vectors, 4);
- +
- + patch_chain((void **)&symbol_block, 0);
- + patch_chain((void **)&symbol_free_list, 4);
- +
- + patch_chain((void **)&marker_block, 0);
- + patch_chain((void **)&marker_free_list, 4);
- +
- + /* Strings are lots of fun */
- + patch_chain((void **)&large_string_blocks, 0);
- + sptr = first_string_block;
- + while (sptr)
- + {
- + struct string_block *next = sptr->next;
- +
- + if (sptr->next) sptr->next = hunk_pointer(sptr->next);
- + if (sptr->prev) sptr->prev = hunk_pointer(sptr->prev);
- + sptr = next;
- + }
- + first_string_block = hunk_pointer(first_string_block);
- + current_string_block = hunk_pointer(current_string_block);
- +
- + /* More fun with buffers */
- + bptr = all_buffers;
- + if (bptr)
- + {
- + while (bptr->next)
- + {
- + struct buffer *next = bptr->next;
- +
- + bptr->next = hunk_pointer(bptr->next);
- + bptr = next;
- + }
- + }
- + all_buffers = hunk_pointer(all_buffers);
- + current_buffer = hunk_pointer(current_buffer);
- +
- + kbd_macro_buffer = hunk_pointer(kbd_macro_buffer);
- + minibuf_save_vector = hunk_pointer(minibuf_save_vector);
- + searchbuf.buffer = hunk_pointer(searchbuf.buffer);
- + searchbuf.fastmap = hunk_pointer(searchbuf.fastmap);
- + specpdl = hunk_pointer(specpdl);
- + read_buffer = hunk_pointer(read_buffer);
- +
- + MouseMap = hunk_lispptr(&MouseMap, MouseMap);
- + global_map = hunk_lispptr(&global_map, global_map);
- + Vglobal_map = hunk_lispptr(&Vglobal_map, Vglobal_map);
- + Vesc_map = hunk_lispptr(&Vesc_map, Vesc_map);
- + Vctl_x_map = hunk_lispptr(&Vctl_x_map, Vctl_x_map);
- +
- + Qvariable_documentation = hunk_lispptr(&Qvariable_documentation, Qvariable_documentation);
- + selected_window = hunk_lispptr(&selected_window, selected_window);
- +
- + mem = free_list;
- + free_list = hunk_pointer(free_list);
- + while (mem)
- + {
- + struct mem_header *next = mem->next;
- +
- + mem->prev = hunk_pointer(mem->prev);
- + mem->next = hunk_pointer(mem->next);
- + mem = next;
- + }
- +
- + for (i = 0; i <= 4; i++)
- + callint_argfuns[i] = hunk_pointer(callint_argfuns[i]);
- + }
- +
- + static dump(char *fn)
- + {
- + BPTR fd;
- + long size;
- +
- + fd = Open(fn, MODE_NEWFILE);
- + if (!fd)
- + {
- + static void unpatch();
- +
- + unpatch();
- + _fail("emacs hasn't been dumped (%s missing)", fn);
- + }
- +
- + Write(fd, (char *)&puresize, sizeof puresize);
- + Write(fd, (char *)&malloc_hunk_size, sizeof malloc_hunk_size);
- + Write(fd, (char *)&first_data, (char *)&last_data - (char *)&first_data);
- + Write(fd, (char *)&first_bss, (char *)&last_bss - (char *)&first_bss);
- + Write(fd, (char *)pure, puresize);
- + Write(fd, (char *)malloc_hunk, malloc_hunk_size);
- + Write(fd, (char *)&staticidx, sizeof staticidx);
- + Write(fd, (char *)staticvec, staticidx * sizeof(Lisp_Object *));
- + size = (char *)last_fn - (char *)first_fn;
- + Write(fd, (char *)&size, sizeof size);
- +
- + Close(fd);
- + }
- +
- + static void *make_pointer(void *ptr)
- + {
- + int hunk = (long)ptr & HUNK_MASK;
- + int offset = (long)ptr & (VALMASK & ~HUNK_MASK);
- +
- + if (!ptr) return 0;
- +
- + if (hunk == HUNK_CODE) return (char *)first_fn + offset;
- + if (hunk == HUNK_DATA) return (char *)&first_data + offset;
- + if (hunk == HUNK_BSS) return (char *)&first_bss + offset;
- + if (hunk == HUNK_PURE) return (char *)pure + offset;
- + if (hunk == HUNK_MALLOC) return malloc_hunk + offset;
- + assert(0);
- + }
- +
- + static Lisp_Object make_lispptr(Lisp_Object *objptr, Lisp_Object obj)
- + {
- + long val = XUINT(obj);
- + int hunk = val & HUNK_MASK;
- + int offset = val & ~HUNK_MASK;
- + char *ptr;
- +
- + if (hunk == HUNK_CODE) ptr = (char *)first_fn + offset;
- + else if (hunk == HUNK_DATA) ptr = (char *)&first_data + offset;
- + else if (hunk == HUNK_BSS) ptr = (char *)&first_bss + offset;
- + else if (hunk == HUNK_PURE) ptr = (char *)pure + offset;
- + else if (hunk == HUNK_MALLOC) ptr = malloc_hunk + offset;
- + else assert(0);
- +
- + XSETPNTR(obj, (long)ptr);
- + return obj;
- + }
- +
- + static void unpatch_pointers ();
- +
- + static void unpatch_buffer (buf)
- + Lisp_Object buf;
- + {
- + Lisp_Object tem;
- + register struct buffer *buffer = XBUFFER (buf);
- + register Lisp_Object *ptr;
- +
- + buffer->text.beg = make_pointer (buffer->text.beg);
- + unpatch_pointers (&buffer->markers);
- +
- + /* This is the buffer's markbit */
- + XUNMARK (buffer->name);
- + unpatch_pointers (&buffer->name);
- +
- + for (ptr = &buffer->name + 1;
- + (char *)ptr < (char *)buffer + sizeof (struct buffer);
- + ptr++)
- + unpatch_pointers (ptr);
- + }
- +
- + static void unpatch_pointers (objptr)
- + Lisp_Object *objptr;
- + {
- + register Lisp_Object obj;
- +
- + obj = *objptr;
- + XUNMARK (obj);
- +
- +
- + loop:
- +
- + switch (XGCTYPE (obj))
- + {
- + case Lisp_String:
- + *objptr = make_lispptr(objptr, *objptr);
- + break;
- +
- + case Lisp_Vector:
- + case Lisp_Window:
- + case Lisp_Process:
- + case Lisp_Window_Configuration:
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Vector *ptr = XVECTOR (obj);
- + register int size;
- + register int i;
- +
- + if (!(ptr->size & ARRAY_MARK_FLAG)) break; /* Already unmarked */
- + size = ptr->size &= ~ARRAY_MARK_FLAG; /* Else unmark it */
- + for (i = 0; i < size; i++) /* and then unmark its elements */
- + unpatch_pointers (&ptr->contents[i]);
- + }
- + break;
- +
- + case Lisp_Symbol:
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Symbol *ptr = XSYMBOL (obj);
- + struct Lisp_Symbol *ptrx;
- +
- + if (!XMARKBIT (ptr->plist)) break;
- + XUNMARK (ptr->plist);
- + unpatch_pointers (&ptr->name);
- + ptr->name = XSTRING (*(Lisp_Object *)&ptr->name);
- + unpatch_pointers ((Lisp_Object *) &ptr->value);
- + unpatch_pointers (&ptr->function);
- + unpatch_pointers (&ptr->plist);
- + objptr = (Lisp_Object *)&ptr->next;
- + ptr = ptr->next;
- + if (ptr)
- + {
- + ptrx = ptr; /* Use pf ptrx avoids compiler bug on Sun */
- + XSET (obj, Lisp_Symbol, ptrx);
- + goto loop;
- + }
- + }
- + break;
- +
- + case Lisp_Marker: {
- + struct Lisp_Marker *ptr;
- +
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + ptr = XMARKER (obj);
- + if (!XMARKBIT (ptr->chain)) break;
- + XUNMARK (ptr->chain);
- + ptr->buffer = make_pointer (ptr->buffer);
- + unpatch_pointers (&ptr->chain);
- + break;
- + }
- +
- + case Lisp_Cons:
- + case Lisp_Buffer_Local_Value:
- + case Lisp_Some_Buffer_Local_Value:
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + {
- + register struct Lisp_Cons *ptr = XCONS (obj);
- + if (!XMARKBIT (ptr->car)) break;
- + XUNMARK (ptr->car);
- + unpatch_pointers (&ptr->car);
- + objptr = &ptr->cdr;
- + obj = ptr->cdr;
- + goto loop;
- + }
- +
- + case Lisp_Buffer:
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + if (XMARKBIT (XBUFFER (obj)->name))
- + unpatch_buffer (obj);
- + break;
- +
- + case Lisp_Subr: {
- + struct Lisp_Subr *subr;
- +
- + obj = *objptr = make_lispptr(objptr, *objptr);
- + subr = XSUBR(obj);
- + if (!(subr->min_args & 0x8000)) break;
- + subr->min_args &= ~0x8000;
- + subr->function = make_pointer(subr->function);
- + subr->symbol_name = make_pointer(subr->symbol_name);
- + subr->prompt = make_pointer(subr->prompt);
- + if ((long)subr->doc >= 0) /* Make sure that not a doc offset */
- + subr->doc = make_pointer(subr->doc);
- + break;
- + }
- +
- + case Lisp_Int:
- + case Lisp_Void:
- + case Lisp_Buffer_Objfwd: break;
- +
- + case Lisp_Intfwd:
- + case Lisp_Boolfwd:
- + case Lisp_Objfwd:
- + case Lisp_Internal_Stream:
- + *objptr = make_lispptr(objptr, *objptr);
- + /* Don't bother with Lisp_Buffer_Objfwd,
- + since all markable slots in current buffer marked anyway. */
- + /* Don't need to do Lisp_Objfwd, since the places they point
- + are protected with staticpro. */
- + break;
- +
- + default:
- + abort ();
- + }
- + }
- +
- + static void unpatch_chain(void **ptr, int offset)
- + {
- + while (*ptr)
- + {
- + *ptr = make_pointer(*ptr);
- + ptr = (void **)((char *)*ptr + offset);
- + }
- + }
- +
- + /* Reconstructs the addresses that were patched */
- + static void unpatch(void)
- + {
- + int fd, i;
- + struct string_block_head *sptr;
- + struct buffer *bptr;
- + struct mem_header *mem;
- +
- + for (i = 0; i < staticidx; i++)
- + {
- + staticvec[i] = make_pointer(staticvec[i]);
- + if (XMARKBIT(*staticvec[i]))
- + {
- + XUNMARK(*staticvec[i]);
- + unpatch_pointers(staticvec[i]);
- + }
- + }
- +
- + /* Unpatch all the pointers normally used before a dump ! */
- + unpatch_chain((void **)&cons_block, 0);
- + unpatch_chain((void **)&cons_free_list, 0);
- +
- + unpatch_chain((void **)&all_vectors, 4);
- +
- + unpatch_chain((void **)&symbol_block, 0);
- + unpatch_chain((void **)&symbol_free_list, 4);
- +
- + unpatch_chain((void **)&marker_block, 0);
- + unpatch_chain((void **)&marker_free_list, 4);
- +
- + /* Strings are lots of fun */
- + unpatch_chain((void **)&large_string_blocks, 0);
- + sptr = first_string_block = make_pointer(first_string_block);
- + current_string_block = make_pointer(current_string_block);
- + while (sptr)
- + {
- + if (sptr->next) sptr->next = make_pointer(sptr->next);
- + if (sptr->prev) sptr->prev = make_pointer(sptr->prev);
- + sptr = sptr->next;
- + }
- +
- + /* More fun with buffers */
- + bptr = all_buffers = make_pointer(all_buffers);
- + if (bptr)
- + {
- + while (bptr->next)
- + {
- + bptr->next = make_pointer(bptr->next);
- + bptr = bptr->next;
- + }
- + }
- + current_buffer = make_pointer(current_buffer);
- +
- + kbd_macro_buffer = make_pointer(kbd_macro_buffer);
- + minibuf_save_vector = make_pointer(minibuf_save_vector);
- + searchbuf.buffer = make_pointer(searchbuf.buffer);
- + searchbuf.fastmap = make_pointer(searchbuf.fastmap);
- + specpdl = make_pointer(specpdl);
- + read_buffer = make_pointer(read_buffer);
- +
- + MouseMap = make_lispptr(&MouseMap, MouseMap);
- + global_map = make_lispptr(&global_map, global_map);
- + Vglobal_map = make_lispptr(&Vglobal_map, Vglobal_map);
- + Vesc_map = make_lispptr(&Vesc_map, Vesc_map);
- + Vctl_x_map = make_lispptr(&Vctl_x_map, Vctl_x_map);
- +
- + Qvariable_documentation = make_lispptr(&Qvariable_documentation, Qvariable_documentation);
- + selected_window = make_lispptr(&selected_window, selected_window);
- +
- + free_list = make_pointer(free_list);
- + mem = free_list;
- + while (mem)
- + {
- + mem->prev = make_pointer(mem->prev);
- + mem->next = make_pointer(mem->next);
- + mem = mem->next;
- + }
- +
- + for (i = 0; i <= 4; i++)
- + callint_argfuns[i] = make_pointer(callint_argfuns[i]);
- + }
- +
- + static undump(char *fn)
- + {
- + BPTR fd;
- + long code_size;
- + char *_malloc_hunk;
- + int *_pure;
- + /*extern struct Library *FifoBase;
- + struct Library *_FifoBase = FifoBase;*/
- +
- + fd = Open(fn, MODE_OLDFILE);
- + if (!fd) return 0;
- +
- + Read(fd, (char *)&puresize, sizeof puresize);
- + Read(fd, (char *)&malloc_hunk_size, sizeof malloc_hunk_size);
- + _pure = dump_malloc(puresize);
- + _malloc_hunk = dump_malloc(malloc_hunk_size + pre_alloc);
- + Read(fd, (char *)&first_data, (char *)&last_data - (char *)&first_data);
- + Read(fd, (char *)&first_bss, (char *)&last_bss - (char *)&first_bss);
- + Read(fd, (char *)_pure, puresize);
- + Read(fd, (char *)_malloc_hunk, malloc_hunk_size);
- + Read(fd, (char *)&staticidx, sizeof staticidx);
- + Read(fd, (char *)staticvec, staticidx * sizeof(Lisp_Object *));
- + /*FifoBase = _FifoBase;*/
- + if (Read(fd, (char *)&code_size, sizeof code_size) != sizeof code_size ||
- + code_size != (char *)last_fn - (char *)first_fn)
- + bailout(fn);
- +
- + Close(fd);
- + malloc_hunk = _malloc_hunk;
- + pure = _pure;
- + return 1;
- + }
- +
- + void map_out_data(char *fn)
- + {
- + if (amiga_initialized) error("You can only dump once !");
- + Fgarbage_collect();
- +
- + patch();
- + dump(fn);
- + unpatch();
- + amiga_initialized = 1;
- + }
- +
- + void map_in_data(int load)
- + {
- + if (load && undump("GNUEmacs:etc/EMACS-DATA"))
- + {
- + unpatch();
- + current_screen = new_screen = temp_screen = 0;
- + message_buf = 0;
- + chars_wasted = copybuf = 0;
- + DC_ICcost = 0;
- + ILcost = DLcost = ILncost = DLncost = 0;
- + initialized = amiga_initialized = 1;
- + }
- + else
- + {
- + malloc_hunk = dump_malloc(malloc_hunk_size + pre_alloc);
- + pure = dump_malloc(puresize);
- + }
- + amiga_undump_reinit();
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_malloc.c emacs-18.59-amiga/src/amiga_malloc.c
- *** emacs-18.59-fsf/src/amiga_malloc.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_malloc.c Sat Dec 5 16:36:46 1992
- ***************
- *** 0 ****
- --- 1,321 ----
- + /* Emulation of some unix functions for emacs.
- + Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY. No author or distributor
- + accepts responsibility to anyone for the consequences of using it
- + or for whether it serves any particular purpose or works at all,
- + unless he says so in writing. Refer to the GNU Emacs General Public
- + License for full details.
- +
- + Everyone is granted permission to copy, modify and redistribute
- + GNU Emacs, but only under the conditions described in the
- + GNU Emacs General Public License. A copy of this license is
- + supposed to have been given to you along with GNU Emacs so you
- + can know your rights and responsibilities. It should be in a
- + file named COPYING. Among other things, the copyright notice
- + and this notice must be preserved on all copies. */
- +
- + #include <exec/types.h>
- + #include <exec/memory.h>
- + #include <proto/exec.h>
- +
- + #undef LONGBITS
- + #undef NULL
- + #include "config.h"
- + #include "lisp.h"
- + #include "amiga.h"
- +
- + /* Memory stuff */
- + long far DataSegBits;
- + static int DataSegFound;
- + static struct mem_header *far current;
- + struct mem_header *free_list;
- + extern int alloca_calling;
- + extern int *pure;
- + long far pre_alloc; /* amount of memory to reserve for emacs */
- + char *malloc_hunk;
- + long malloc_hunk_size = MALLOC_HUNK_SIZE; /* Amount of memory malloc'ed by a
- + to-be-dumped emacs */
- + long malloc_bytes_used; /* Amount of this hunk actually used */
- + static int early_malloc = TRUE; /* Before we undump, we want system allocations */
- +
- + #define ADDR_OK(x) (((long)x & ~VALMASK) == DataSegBits)
- +
- + /* Memory allocation code */
- + /* ---------------------- */
- +
- + static void *alloc_sys(long memsize)
- + /* Effect: Allocate from AmigaOS (via AllocMem). */
- + {
- + /* Allocation rounded up to multiple of 4 */
- + long size = ((memsize + 3) & ~3) + sizeof(struct mem_header);
- + struct mem_header *mem;
- +
- + if (!DataSegFound)
- + {
- + /* Find page containing Pure data. All data used by emacs must be
- + on the same page (As a page is 2^26 bytes, this shouldn't be too
- + unlikely). */
- + DataSegBits = (long)&first_data & ~VALMASK;
- + if (!(ADDR_OK(first_fn) && ADDR_OK(last_fn) &&
- + ADDR_OK(&first_data) && ADDR_OK(&last_data) &&
- + ADDR_OK(&first_bss) && ADDR_OK(&last_bss)))
- + _fail("I can't handle your memory configuration");
- + DataSegFound = TRUE;
- + }
- +
- + mem = AllocMem(size, 0);
- + if (!mem) return 0;
- + /* All memory *must* be allocated on the same page ! */
- + if (!ADDR_OK(mem))
- + {
- + FreeMem(mem, size);
- + return 0;
- + }
- + if (current) current->prev = mem;
- + mem->next = current;
- + mem->prev = 0;
- + current = mem;
- + mem->size = size;
- +
- + return mem + 1;
- + }
- +
- + static void free_sys(char *p)
- + {
- + struct mem_header *old = (struct mem_header *)p - 1;
- +
- + if (old == current)
- + {
- + current = current->next;
- + if (current) current->prev = 0;
- + }
- + else
- + {
- + old->prev->next = old->next;
- + if (old->next) old->next->prev = old->prev;
- + }
- + FreeMem(old, old->size);
- + }
- +
- + void _MemCleanup(void)
- + {
- + struct mem_header *next;
- +
- + while (current)
- + {
- + next = current->next;
- + FreeMem(current, current->size);
- + current = next;
- + }
- + }
- +
- + static void *alloc_hunk(long memsize)
- + /* Effect: Allocates from the malloc hunk (which is dumped to disk).
- + */
- + {
- + /* Allocation rounded up to multiple of 4 */
- + long size = ((memsize + 3) & ~3) + sizeof(struct mem_header);
- + /* Find a free block in the memory list */
- + struct mem_header *scan = free_list->next;
- +
- + while (scan->size > 0)
- + {
- + if (size < scan->size) /* Found ! */
- + {
- + long end;
- +
- + /* Split block if big enough */
- + if (size + sizeof(struct mem_header) + 8 > scan->size)
- + {
- + /* Remove block from list */
- + scan->prev->next = scan->next;
- + scan->next->prev = scan->prev;
- + }
- + else
- + {
- + /* Split block */
- + struct mem_header *new = (struct mem_header *)((char *)scan + size);
- +
- + new->prev = scan->prev;
- + new->next = scan->next;
- + scan->prev->next = new;
- + scan->next->prev = new;
- + new->size = scan->size - size;
- + scan->size = size;
- + }
- + if (!amiga_initialized)
- + {
- + end = (char *)scan - (char *)free_list + scan->size +
- + sizeof(long) + sizeof(struct mem_header);
- + if (end > malloc_bytes_used) malloc_bytes_used = end;
- + }
- + return scan + 1;
- + }
- + scan = scan->next;
- + }
- + return 0;
- + }
- +
- + static void free_hunk(char *p)
- + {
- + struct mem_header *old = (struct mem_header *)p - 1, *scan = free_list;
- +
- + do scan = scan->next; while (scan < old);
- +
- + /* Check for merges (potentially with both sides) */
- + if ((char *)scan->prev + scan->prev->size == (char *)old)
- + if ((char *)old + old->size == (char *)scan)
- + {
- + /* Merge all 3 blocks together */
- + scan->prev->size += old->size + scan->size;
- + scan->next->prev = scan->prev;
- + scan->prev->next = scan->next;
- + }
- + else /* Merge with previous block */
- + scan->prev->size += old->size;
- + else if ((char *)old + old->size == (char *)scan)
- + {
- + /* Merge with next block */
- + old->size += scan->size;
- + scan->prev->next = old;
- + scan->next->prev = old;
- + old->prev = scan->prev;
- + old->next = scan->next;
- + }
- + else /* Add a new block */
- + {
- + old->next = scan;
- + old->prev = scan->prev;
- + scan->prev->next = old;
- + scan->prev = old;
- + }
- + }
- +
- + char *__halloc(long size)
- + {
- + if (early_malloc) return alloc_sys(size);
- +
- + if (!amiga_initialized)
- + if (alloca_calling)
- + {
- + alloca_calling = 0;
- + return alloc_sys(size);
- + }
- + else
- + {
- + void *mem = alloc_hunk(size);
- +
- + if (!mem)
- + _fail("Emacs dump: ran out of memory for malloc. \n"
- + "See the -malloc option for more information.\n");
- + return mem;
- + }
- + else
- + {
- + alloca_calling = 0;
- + if (pre_alloc)
- + {
- + void *mem;
- +
- + if (mem = alloc_hunk(size)) return mem;
- + }
- + return alloc_sys(size);
- + }
- + }
- +
- + char *malloc(int size)
- + {
- + return __halloc(size);
- + }
- +
- + free(void *p)
- + {
- + struct mem_header *old = (struct mem_header *)p - 1;
- +
- + if ((char *)p >= malloc_hunk &&
- + (char *)p <= malloc_hunk + malloc_hunk_size + pre_alloc)
- + {
- + if (!amiga_initialized || pre_alloc) free_hunk(p);
- + }
- + else free_sys(p);
- + }
- +
- + char *calloc(long n, long size)
- + {
- + char *t;
- + long rsize = n * size;
- +
- + t = malloc(rsize);
- + if (t) memset (t, 0, rsize);
- +
- + return t;
- + }
- +
- + char *realloc(char *p, long size)
- + {
- + char *new = malloc(size);
- + struct mem_header *old = (struct mem_header *)p - 1;
- +
- + if (new)
- + {
- + long minsize;
- + long oldsize = old->size - sizeof(struct mem_header);
- +
- + if (size < oldsize) minsize = size;
- + else minsize = oldsize;
- +
- + memcpy(new, p, minsize);
- + }
- + free(p);
- + return new;
- + }
- +
- + void emacs_malloc_init(void)
- + {
- + struct mem_header *end_sentinel, *new_end, *new_block;
- +
- + early_malloc = FALSE; /* We now have a malloc hunk */
- +
- + /* Set up the memory allocation in the malloc hunk */
- + free_list = (struct mem_header *)malloc_hunk;
- + end_sentinel = (struct mem_header *)((char *)free_list + malloc_hunk_size
- + - sizeof(struct mem_header));
- + if (!amiga_initialized)
- + {
- + /* Before dumping */
- + free_list->next = free_list + 1;
- + free_list->prev = 0;
- + free_list->size = 0; /* Prevents merges with this pseudo-block */
- + free_list[1].prev = free_list;
- + free_list[1].next = end_sentinel;
- + free_list[1].size =
- + malloc_hunk_size - 2 * sizeof(struct mem_header) - sizeof(long);
- + /* The - sizeof(long) prevents any merges with end_sentinel */
- +
- + end_sentinel->size = 0;
- + end_sentinel->prev = free_list + 1;
- + end_sentinel->next = 0;
- +
- + malloc_bytes_used = 0;
- + }
- + else if (pre_alloc)
- + {
- + /* After having undumped extend malloc block */
- + /* Move end_sentinel: */
- + new_end = (struct mem_header *)((char *)free_list + malloc_hunk_size +
- + pre_alloc - sizeof(struct mem_header));
- + new_end->size = 0;
- + new_end->next = 0;
- + new_end->prev = end_sentinel->prev;
- + end_sentinel->prev->next = new_end;
- +
- + /* Add extra memory (pre_alloc bytes) */
- + new_block = (struct mem_header *)((char *)end_sentinel - sizeof(long));
- + new_block->size = pre_alloc;
- + free_hunk((char *)(new_block + 1));
- + }
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_menu.c emacs-18.59-amiga/src/amiga_menu.c
- *** emacs-18.59-fsf/src/amiga_menu.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_menu.c Thu Sep 30 21:27:42 1993
- ***************
- *** 0 ****
- --- 1,309 ----
- + #include <exec/types.h>
- + #include <libraries/gadtools.h>
- + #include <intuition/intuition.h>
- + #include <proto/exec.h>
- + #include <proto/dos.h>
- + #include <proto/gadtools.h>
- + #include <proto/intuition.h>
- + #include "config.h"
- + #undef NULL
- + #include "lisp.h"
- + #include "amiga.h"
- +
- + #ifndef GTMN_NewLookMenus
- + #define GTMN_NewLookMenus GT_TagBase+67
- + #endif
- +
- + static struct Menu *emacs_menu;
- + static char *emacs_menu_strings;
- + static APTR win_vi;
- + struct Library *GadToolsBase;
- +
- + void suspend_menus(void)
- + {
- + if (emacs_win)
- + {
- + ClearMenuStrip(emacs_win);
- + if (win_vi)
- + {
- + FreeVisualInfo(win_vi);
- + win_vi = 0;
- + }
- + }
- + }
- +
- + int resume_menus(void)
- + {
- + if (emacs_win && emacs_menu)
- + {
- + win_vi = GetVisualInfo(emacs_win->WScreen, TAG_END);
- +
- + if (!win_vi || !LayoutMenus(emacs_menu, win_vi,
- + GTMN_NewLookMenus, 1L,
- + TAG_END))
- + {
- + if (win_vi) FreeVisualInfo(win_vi);
- + Famiga_delete_menus();
- +
- + return FALSE;
- + }
- + SetMenuStrip(emacs_win, emacs_menu);
- + }
- + return TRUE;
- + }
- +
- + DEFUN ("amiga-menus", Famiga_menus, Samiga_menus, 1, 1, 0,
- + "Define menus for emacs. The argument is a list structured as follows:\n\
- + ((menu1-name ((item1-name item1-expr item1-key item1-disabled) ...)\n\
- + menu1-disabled) ...)\n\
- + menu-name is the name of the menu item header.\n\
- + The menu is disabled if menu-disabled is not nil [optional].\n\
- + item-name is the name of an item.\n\
- + The item-expr fields are ignored.\n\
- + If item-key is nil, no shortcut is allowed.\n\
- + If item-disabled is not nil, the item is disabled.\n\
- + If the item information list is nil, a line is drawn in the menu.\n\
- + item-key & item-disabled are optional.")
- + (menus)
- + Lisp_Object menus;
- + {
- + Lisp_Object s_menus, s_items;
- + int citems, slen;
- + char *strdata;
- + struct NewMenu *menudata, *mkm;
- + struct Lisp_String *name;
- +
- + /* int i;
- + extern int total[], nb[];
- +
- + for (i = 0; i < 16; i++)
- + {
- + printf("%d(%d) ", total[i], nb[i]);
- + total[i] = nb[i] = 0;
- + }
- + printf("\n");
- + start_count(15);
- + for (i = 0; i < 100; i++) { suspend_count(15); resume_count(15); }
- + stop_count(15);
- + for (i = 0; i < 100; i++) { start_count(14); stop_count(14); }
- + printf("100 s/r: %d, 100 s/s: %d\n", total[15], total[14]);
- +
- + return Qnil;
- + */
- + check_intuition();
- +
- + /* Check structure of parameter & count # items & menus */
- + s_menus = menus;
- + citems = slen = 0;
- +
- + while (!NULL(s_menus))
- + {
- + struct Lisp_Cons *menu, *menu_cell;
- +
- + CHECK_CONS(s_menus, 0);
- + menu_cell = XCONS(s_menus);
- + citems++;
- + CHECK_CONS(menu_cell->car, 0); /* Each menu is a list */
- + menu = XCONS(menu_cell->car);
- +
- + CHECK_STRING(menu->car, 0); /* Check name */
- + name = XSTRING(menu->car);
- + slen += name->size + 1;
- + CHECK_CONS(menu->cdr, 0);
- +
- + menu = XCONS(menu->cdr); /* Check items */
- +
- + s_items = menu->car;
- + while (!NULL(s_items))
- + {
- + struct Lisp_Cons *item, *item_cell;
- +
- + CHECK_CONS(s_items, 0);
- + item_cell = XCONS(s_items);
- + citems++;
- + if (!NULL(item_cell->car))
- + {
- + CHECK_CONS(item_cell->car, 0); /* Each item is a list */
- + item = XCONS(item_cell->car);
- +
- + CHECK_STRING(item->car, 0);
- + name = XSTRING(item->car);
- + slen += name->size + 1;
- +
- + if (!NULL(item->cdr)) /* Only name is necessary */
- + {
- + CHECK_CONS(item->cdr, 0);
- + item = XCONS(item->cdr);
- +
- + /* Expr is arbitrary */
- + if (!NULL(item->cdr))
- + {
- + CHECK_CONS(item->cdr, 0);
- + item = XCONS(item->cdr);
- +
- + /* Check shortcut */
- + if (!NULL(item->car))
- + {
- + CHECK_NUMBER(item->car, 0);
- + slen += 2;
- + }
- +
- + if (!NULL(item->cdr))
- + {
- + CHECK_CONS(item->cdr, 0);
- + item = XCONS(item->cdr);
- +
- + /* Check that end of list */
- + if (!NULL(item->cdr)) error("Badly formed item");
- + }
- + }
- + }
- + }
- + s_items = item_cell->cdr;
- + }
- + if (!NULL(menu->cdr))
- + {
- + CHECK_CONS(menu->cdr, 0);
- + menu = XCONS(menu->cdr);
- + if (!NULL(menu->cdr)) error("Badly formed menu");
- + }
- + s_menus = menu_cell->cdr;
- + }
- +
- + suspend_menus();
- + if (emacs_menu) Famiga_delete_menus();
- +
- + /* Now create menu structure */
- + menudata = (struct NewMenu *)alloca(sizeof(struct NewMenu) * (citems + 1));
- + emacs_menu_strings = strdata = (char *)xmalloc(slen);
- + mkm = menudata;
- + s_menus = menus;
- + while (!NULL(s_menus))
- + {
- + struct Lisp_Cons *menu, *menu_cell;
- + struct NewMenu *menu1;
- +
- + menu_cell = XCONS(s_menus);
- + mkm->nm_Type = NM_TITLE;
- + menu = XCONS(menu_cell->car);
- + name = XSTRING(menu->car);
- + strcpy(strdata, name->data);
- + mkm->nm_Label = strdata;
- + strdata += name->size + 1;
- + mkm->nm_CommKey = 0;
- + mkm->nm_Flags = 0;
- + mkm->nm_MutualExclude = 0;
- + menu1 = mkm++;
- +
- + menu = XCONS(menu->cdr); /* Check items */
- +
- + s_items = menu->car;
- + while (!NULL(s_items))
- + {
- + struct Lisp_Cons *item, *item_cell;
- +
- + item_cell = XCONS(s_items);
- + mkm->nm_Type = NM_ITEM;
- + mkm->nm_CommKey = 0;
- + mkm->nm_Flags = 0;
- + mkm->nm_MutualExclude = 0;
- + if (NULL(item_cell->car))
- + {
- + mkm->nm_Type = IM_ITEM;
- + mkm->nm_Label = NM_BARLABEL;
- + }
- + else
- + {
- +
- + item = XCONS(item_cell->car);
- + name = XSTRING(item->car);
- + strcpy(strdata, name->data);
- + mkm->nm_Label = strdata;
- + strdata += name->size + 1;
- +
- + if (!NULL(item->cdr)) /* Only name is necessary */
- + {
- + item = XCONS(item->cdr);
- +
- + /* Expr is ignored */
- +
- + if (!NULL(item->cdr))
- + {
- + item = XCONS(item->cdr);
- +
- + /* Check shortcut */
- + if (!NULL(item->car))
- + {
- + mkm->nm_CommKey = strdata;
- + strdata[0] = XFASTINT(item->car);
- + strdata[1] = '\0';
- + strdata += 2;
- + }
- + if (!NULL(item->cdr))
- + {
- + item = XCONS(item->cdr);
- + if (!NULL(item->car))
- + mkm->nm_Flags |= NM_ITEMDISABLED;
- + }
- + }
- + }
- + }
- + mkm++;
- + s_items = item_cell->cdr;
- + }
- + if (!NULL(menu->cdr))
- + {
- + menu = XCONS(menu->cdr);
- + if (!NULL(menu->car)) menu1->nm_Flags |= NM_MENUDISABLED;
- + }
- + s_menus = menu_cell->cdr;
- + }
- + mkm->nm_Type = NM_END;
- + mkm->nm_Label = 0;
- + mkm->nm_CommKey = 0;
- + mkm->nm_Flags = 0;
- + mkm->nm_MutualExclude = 0;
- + if (!(emacs_menu = CreateMenus(menudata, TAG_END)))
- + {
- + free(emacs_menu_strings);
- + emacs_menu_strings = 0;
- + error("Menu couldn't be created");
- + }
- + if (!resume_menus()) error("Menu couldn't be layed out");
- +
- + return Qt;
- + }
- +
- + DEFUN ("amiga-delete-menus", Famiga_delete_menus, Samiga_delete_menus, 0, 0, 0,
- + "Remove & free menu strip")
- + ()
- + {
- + check_intuition();
- +
- + suspend_menus();
- + if (emacs_menu) FreeMenus(emacs_menu);
- + emacs_menu = 0;
- + if (emacs_menu_strings) free(emacs_menu_strings);
- + emacs_menu_strings = 0;
- +
- + return Qt;
- + }
- +
- + void syms_of_amiga_menu(void)
- + {
- + defsubr(&Samiga_delete_menus);
- + defsubr(&Samiga_menus);
- + }
- +
- + void init_amiga_menu(void)
- + {
- + GadToolsBase = OpenLibrary("gadtools.library", 0);
- + if (!GadToolsBase) _fail("gadtools.library required");
- + }
- +
- + void cleanup_amiga_menu(void)
- + {
- + suspend_menus();
- + if (emacs_menu) Famiga_delete_menus();
- + if (GadToolsBase) CloseLibrary(GadToolsBase);
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_processes.c emacs-18.59-amiga/src/amiga_processes.c
- *** emacs-18.59-fsf/src/amiga_processes.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_processes.c Sun Nov 22 10:13:02 1992
- ***************
- *** 0 ****
- --- 1,94 ----
- + #include <exec/types.h>
- + #include <exec/execbase.h>
- + #include <exec/memory.h>
- + #include <dos/dos.h>
- + #include <dos/dosextens.h>
- + #include <dos/dostags.h>
- + #include <proto/exec.h>
- + #include <proto/dos.h>
- + #include <clib/alib_protos.h>
- + #include <signal.h>
- + #undef signal
- + #include <ios1.h>
- + #include <string.h>
- + #include <errno.h>
- + #include <stdio.h>
- + #include <internal/vars.h>
- +
- + #include "config.h"
- + #include "lisp.h"
- + #include "amiga.h"
- + #include "emacssignal.h"
- +
- + extern struct ExecBase *SysBase;
- +
- + int amiga_process_stack_size;
- +
- + /* A few emacs support functions */
- + /* ----------------------------- */
- +
- + wait_for_termination (pid)
- + int pid;
- + {
- + while (1)
- + {
- + sigsetmask (sigmask (SIGCHLD));
- + if (0 > kill (pid, 0))
- + {
- + sigsetmask (SIGEMPTYMASK);
- + break;
- + }
- + sigpause (SIGEMPTYMASK);
- + }
- + }
- +
- + char *amiga_path(void)
- + {
- + char *path, *pp, name[128];
- + int pathsize;
- + struct CommandLineInterface *cli;
- + BPTR lock;
- + long l, *lp, nlen;
- +
- + pathsize = 128;
- + path = (char *)xmalloc(pathsize);
- +
- + strcpy(path, ".");
- + pp = path + 1;
- +
- + if (!(cli = (struct CommandLineInterface *)((long)_us->pr_CLI << 2)))
- + return path;
- +
- + l = (long)cli->cli_CommandDir;
- + while (l) {
- + *pp++ = ',';
- + l <<= 2;
- + lp = (long *)l;
- + lock = (BPTR)*(lp + 1);
- + NameFromLock(lock, name, 128);
- + nlen = strlen(name);
- + if (pp + nlen + 5 >= path + pathsize)
- + {
- + char *newpath;
- +
- + pathsize = 2 * pathsize + nlen;
- + newpath = (char *)xrealloc(path);
- + pp = newpath + (pp - path);
- + path = newpath;
- + }
- + memcpy(pp, name, nlen);
- + pp += nlen;
- + l = *lp;
- + }
- + /* Use of +5 above guarantees that there is enough space for c: */
- + strcpy(pp, ",c:");
- +
- + return path;
- + }
- +
- + void syms_of_amiga_processes(void)
- + {
- + amiga_process_stack_size = 0;
- + DEFVAR_INT("amiga-process-stack-size", &amiga_process_stack_size,
- + "Size of stack for called processes. 0 means same size as emacs stack.");
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_rexx.c emacs-18.59-amiga/src/amiga_rexx.c
- *** emacs-18.59-fsf/src/amiga_rexx.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_rexx.c Sat Jun 5 13:21:16 1993
- ***************
- *** 0 ****
- --- 1,460 ----
- + /* low level ARexx code for use in amiga version of Emacs.
- + Copyright (C) 1993 Christian E. Hopps.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is free software; you can redistribute it and/or modify
- + it under the terms of the GNU General Public License as published by
- + the Free Software Foundation; either version 1, or (at your option)
- + any later version.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + GNU General Public License for more details.
- +
- + You should have received a copy of the GNU General Public License
- + along with GNU Emacs; see the file COPYING. If not, write to
- + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
- +
- + #include "SimpleRexx.h"
- + #include <proto/exec.h>
- + #undef NULL
- + #include "config.h"
- + #include "lisp.h"
- +
- + #include "amiga.h"
- +
- + #define XLRXMSG(x) ((struct LispRexxMsg *) XPNTR((x)))
- + #define XSETLRXMSG(x,v) (XSET((x), Lisp_Int, v))
- +
- + static AREXXCONTEXT far handle;
- + static int amiga_arexx_initialized;
- +
- + /* This structure should be allocated with emacs_malloc() its pointer will be */
- + /* used as an msgid. (emacs XUINT())*/
- + struct LispRexxMsg {
- + struct MinNode lrm_Node; /* A node for tracking messages. */
- + struct RexxMsg *lrm_Msg; /* The actual Rexx Msg. */
- + ULONG lrm_Flags;
- + };
- + /* Flags for LispRexxMessage indicating what to do with it. */
- + #define LRMF_SENTCMD (1L << 0) /* this msg originated here. */
- + #define LRMF_DOERRORS (1L << 1) /* handle error replies */
- + #define LRMF_DORESULTS (1L << 2) /* handle result strings */
- +
- + struct LispRexxList {
- + struct MinList lrl_List;
- + int lrl_Count;
- + };
- +
- + struct LispRexxList pending; /* The list of pending */
- + /* (outgoing) Rexx Messages. */
- + struct LispRexxList returned; /* The list of pending */
- + /* (outgoing) Rexx Messages */
- + /* that have been received. */
- + struct LispRexxList incoming; /* The message that are */
- + /* incoming to Emacs (sent */
- + /* from some other rexx host. */
- +
- + /* allocate a rexx message properly */
- + Lisp_Object alloc_rexx_msg(ULONG flags)
- + {
- + Lisp_Object rm = Qnil;
- + struct LispRexxMsg *lrm = (struct LispRexxMsg *)malloc(sizeof(*lrm));
- + if(lrm) {
- + lrm->lrm_Flags = flags;
- + XSETLRXMSG(rm,lrm);
- + return(rm);
- + }
- + return(Qnil);
- + }
- +
- + /* free an arexx message allocated with alloc_arexx_msg() */
- + void free_rexx_msg (Lisp_Object rm)
- + {
- + if(!NULL(rm)) {
- + void *mem = XLRXMSG(rm);
- + free(mem);
- + }
- + }
- +
- + /* The next 2 functions imlement FIFO lists. */
- +
- + /* add LispRexxMsg to a LispRexxLisp Tail. */
- + void add_rexx_msg_to_tail(struct LispRexxList *rl, Lisp_Object rm)
- + {
- + AddTail((struct List *)rl,(struct Node *)XPNTR(rm));
- + rl->lrl_Count++;
- + }
- +
- + /* remove LispRexxMsg from head of a LispRexxLisp. */
- + Lisp_Object remove_rexx_msg_from_head(struct LispRexxList *rl)
- + {
- + Lisp_Object rm = (Lisp_Object)RemHead((struct List *)rl);
- + if(rm != 0) {
- + rl->lrl_Count--;
- + return(rm);
- + } else {
- + return Qnil;
- + }
- + }
- +
- + void remove_rexx_msg(struct LispRexxList *rl, Lisp_Object rm)
- + {
- + Remove((struct Node *)XPNTR(rm));
- + rl->lrl_Count--;
- + }
- +
- +
- + /* find a rexx message on a list given an msgid (ptr) */
- + int is_rexx_msgid_on_list(struct LispRexxList *rl,
- + Lisp_Object id)
- + {
- + struct MinNode *mn = rl->lrl_List.mlh_Head;
- + for(mn; mn->mln_Succ; mn = mn->mln_Succ) {
- + Lisp_Object cmpid = Qnil;
- + XSETLRXMSG(cmpid,mn);
- + if( EQ(cmpid,id)) {
- + return(1);
- + }
- + }
- + return(0);
- + }
- +
- + Lisp_Object find_rexx_msg_on_list(struct LispRexxList *rl,
- + struct RexxMsg *msg)
- + {
- + Lisp_Object pnt = Qnil;
- + struct MinNode *mn = rl->lrl_List.mlh_Head;
- + for(mn; mn->mln_Succ; mn = mn->mln_Succ) {
- + if( ((struct LispRexxMsg *)mn)->lrm_Msg == msg) {
- + XSETLRXMSG(pnt,mn);
- + }
- + }
- + return(pnt);
- + }
- +
- + /* This function is given a RexxMsg and it goes and find (or doesn't) the */
- + /* corisponding pending message, removes it from the list and sets up the lisp */
- + /* list for return values. if it is not found nil is returned. (it deals with */
- + /* the errors for incoming messages properly. Some thought is needed on how to */
- + /* handle errors from replied sent commands that were not asking for results. */
- + Lisp_Object handle_rexx_msg_replied(struct RexxMsg *msg)
- + {
- + Lisp_Object rm = find_rexx_msg_on_list(&pending, msg);
- + if(!NULL(rm)) {
- + /* Process the command. If it was requesting results strings handle */
- + /* them otherwise just delete. */
- + struct LispRexxMsg *lrm = XLRXMSG(rm);
- + remove_rexx_msg(&pending, rm);
- +
- + if(msg->rm_Result1 == 0) {
- + if(lrm->lrm_Flags & LRMF_DORESULTS) {
- + /* add to returned so that result can be fetched. */
- + add_rexx_msg_to_tail(&returned,rm);
- + } else {
- + /* simply delete rexx message. */
- + DeleteARexxMsg(handle,msg);
- + free_rexx_msg(rm);
- + }
- + } else {
- + /* an error occured with our message. */
- + if(lrm->lrm_Flags & LRMF_DOERRORS) {
- + /* add to returned so that error can be fetched. */
- + add_rexx_msg_to_tail(&returned,rm);
- + } else {
- + /* simply delete rexx message. */
- + DeleteARexxMsg(handle,msg);
- + free_rexx_msg(rm);
- + }
- + }
- + } else {
- + /* This should never happen we received a rexx message reply */
- + /* that we never sent out. */
- + DeleteARexxMsg(handle,msg);
- + }
- + }
- +
- + /* This function takes incoming messages and place them on the incoming msg */
- + /* list. */
- + Lisp_Object handle_rexx_msg_received(struct RexxMsg *msg)
- + {
- + Lisp_Object rm = alloc_rexx_msg(LRMF_DORESULTS|LRMF_DOERRORS);
- + if(!NULL(rm)) {
- + /* Add message to incoming list. */
- + struct LispRexxMsg *lrm = XLRXMSG(rm);
- + lrm->lrm_Msg = msg; /* set msg pointer. */
- + add_rexx_msg_to_tail(&incoming,rm);
- + } else {
- + /* This should never happen we received a rexx message but ran out of */
- + /* memory. Set last error msg. and reply with fail. */
- + SetARexxLastError(handle, msg, "Out of emacs memory.");
- + ReplyARexxMsg(handle, msg, 0, 20);
- + }
- + }
- +
- + /* Almost the same as old one, but we now call handle_pending_arexx_reply() for */
- + /* replied messages that we sent, so that we can setup result strings and such. */
- + int check_arexx(int force, int kbd)
- + {
- + struct RexxMsg *msg;
- + int msg_received = FALSE;
- + while (msg = GetARexxMsg(handle)) {
- + msg_received = TRUE;
- + if(msg->rm_Node.mn_Node.ln_Type == NT_REPLYMSG) {
- + /* This is a reply to a rexx command we send out. */
- + handle_rexx_msg_replied(msg);
- + } else {
- + handle_rexx_msg_received(msg);
- + }
- + }
- + if ((kbd && amiga_arexx_initialized)) {
- + /* if we got a message or we have some out, or we have some waiting to */
- + /* be processes then enque the Key sequence that will call the rexx */
- + /* message handler. We obviously don't do this for returned commands :^) */
- + if ((msg_received || force && incoming.lrl_Count > 0) &&
- + get_ttycount() == 0) {
- + enque(AMIGASEQ, FALSE); enque('X', FALSE);
- + }
- + }
- + return msg_received;
- + }
- +
- + DEFUN ("amiga-arexx-wait", Famiga_arexx_wait, Samiga_arexx_wait, 0, 0, 0,
- + "Wait for an ARexx event (command or reply) before proceeding.")
- + ()
- + {
- + while (!check_arexx(FALSE, FALSE)) Wait(ARexxSignal(handle));
- + }
- +
- + DEFUN ("amiga-arexx-check-command",
- + Famiga_arexx_check_command, Samiga_arexx_check_command, 1, 1, 0,
- + "Return t if command ID has finished, nil otherwise.")
- + (id)
- + Lisp_Object id;
- + {
- + CHECK_NUMBER(id,0);
- +
- + if(is_rexx_msgid_on_list(&pending,id)) {
- + /* still on pending return false. */
- + return Qnil;
- + } else if(is_rexx_msgid_on_list(&returned,id)) {
- + /* is waiting to be processed return true. */
- + return Qt;
- + }
- +
- + /* is nowhere to be found. error. */
- + error("id not found.");
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-arexx-get-next-msg", Famiga_arexx_get_next_msg,
- + Samiga_get_next_msg, 0, 0, 0,
- + "Returns the oldest arexx msg sent to emacs rexx port.\n\
- + When you are through with this message call (amiga-arexx-reply).\n\
- + if the msg is not replied this function will continue to\n\
- + return that msg until it has been replied to.")
- + ()
- + {
- + struct RexxMsg *rmsg;
- +
- + check_arexx(FALSE, FALSE);
- + if (incoming.lrl_Count) {
- + struct RexxMsg *msg = ((struct LispRexxMsg *)
- + incoming.lrl_List.mlh_Head)->lrm_Msg;
- + return build_string(ARG0(msg));
- + }
- + /* nothing to be gotten. */
- + return Qnil;
- + }
- +
- + DEFUN("amiga-arexx-get-msg-results", Famiga_arexx_get_msg_results,
- + Samiga_arexx_get_msg_results, 1,1,0,
- + "Returns the results from MSGID. will be a list of the form:\n\
- + (msgid resultcode secondary)\n\n\
- + If resultcode is 0 then secondary will be a string or nil.\n\
- + else resulcode will be greater than 0 and secondary will be\n\
- + an error-code (int).\n\n\
- + If MSGID has not yet completed nil is returned.\n\
- + if MSGID has been dealt with or is invalid and error will occur.")
- + (msgid)
- + Lisp_Object msgid;
- + {
- + CHECK_NUMBER(msgid,0);
- +
- + if(is_rexx_msgid_on_list(&returned,msgid)) {
- + /* msgid has completed build list and delete LispRexxMsg. */
- + struct LispRexxMsg *lrm = XLRXMSG(msgid);
- + Lisp_Object rc, error_or_string, ret;
- + struct RexxMsg *msg = lrm->lrm_Msg;
- +
- + remove_rexx_msg(&returned,msgid);
- +
- + rc = make_number(msg->rm_Result1);
- + if(msg->rm_Result1 == 0) {
- + error_or_string = msg->rm_Result2 ? build_string(msg->rm_Result2) : 0;
- + } else {
- + /* error occurred */
- + error_or_string = make_number(msg->rm_Result2); /* save error code. */
- + }
- + free_rexx_msg(msgid); /* free our rexx msg. */
- + DeleteARexxMsg(handle,msg); /* free ARexx msg proper */
- +
- + /* build lisp list. */
- + ret = Fcons( msgid, Fcons( rc, Fcons(error_or_string, Qnil)));
- + if(NULL(ret)) {
- + error("Couldn't get memory.");
- + }
- + return(ret);
- + } else if(is_rexx_msgid_on_list(&pending,msgid)) {
- + return Qnil; /* this msgid has not yet completed. */
- + } else {
- + error("Unknown MSGID.");
- + return Qnil;
- + }
- + }
- +
- + DEFUN ("amiga-arexx-reply", Famiga_arexx_reply, Samiga_arexx_reply,
- + 2, 2, 0,
- + "Replies to the first arexx message (the one got via amiga-arexx-get-event)\n\
- + with RC as return code.\n\
- + If RC=0, TEXT is the result, otherwise it is the error text. It can be nil.")
- + (rc, text)
- + Lisp_Object rc, text;
- + {
- + int retcode, ok = TRUE;
- + char *result;
- + struct RexxMsg *rmsg;
- + Lisp_Object rm = remove_rexx_msg_from_head(&incoming);
- + struct LispRexxMsg *lrm = XLRXMSG(rm);
- +
- + if (NULL(rm))
- + error("No ARexx message to reply to.");
- +
- + rmsg = lrm->lrm_Msg;
- +
- + CHECK_NUMBER(rc, 0);
- + retcode = XINT(rc);
- +
- + if (!NULL (text)) {
- + CHECK_STRING(text, 0);
- + result = XSTRING (text)->data;
- + } else {
- + result = 0;
- + }
- + if (retcode && result)
- + ok = SetARexxLastError(handle, rmsg, result);
- + ReplyARexxMsg(handle, rmsg, result, retcode);
- +
- + if (!ok)
- + error("Failed to set ARexx error message.");
- +
- + return Qnil;
- + }
- +
- + Lisp_Object send_rexx_command(Lisp_Object str, Lisp_Object as_file,
- + ULONG flags)
- + {
- + struct RexxMsg *rmsg;
- + int i;
- + Lisp_Object id, rm;
- + struct LispRexxMsg *lrm;
- +
- + rm = alloc_rexx_msg(flags);
- + if(NULL(rm)) {
- + error("Failed to send command to ARexx.");
- + return Qnil;
- + }
- +
- + CHECK_STRING (str, 0);
- + if (!(rmsg = SendARexxMsg(handle, XSTRING (str)->data,!NULL (as_file),
- + (flags & LRMF_DORESULTS ? 1 : 0)))) {
- + free_rexx_msg(rm);
- + error("Failed to send command to ARexx.");
- + return Qnil;
- + }
- + lrm = XLRXMSG(rm);
- + lrm->lrm_Msg = rmsg; /* set rexx message pointer. */
- + add_rexx_msg_to_tail(&pending,rm); /* add to pending list. */
- +
- + return(rm);
- + }
- +
- + DEFUN ("amiga-arexx-send-command", Famiga_arexx_send_command,
- + Samiga_arexx_send_command, 1, 2, 0,
- + "Sends a command to ARexx for execution.\n\
- + If the second arg is non-nil, the command is directly interpreted.\n\
- + Returns an integer that uniquely identifies this message. This must\n\
- + then be used to get the results from the command.\n\
- + NOTE: this is very different from old way things worked.\n\
- + earlier versions of emacs discarded successful results\n\
- + and errors always got replied to becuase they caused failures\n\
- + Neither of these are true now.\
- + This function is also no longer interactive.\n\
- + Use (amiga-arexx-do-command)\n")
- + (str, as_file)
- + Lisp_Object str, as_file;
- + {
- + return(send_rexx_command(str,as_file,
- + LRMF_DORESULTS|
- + LRMF_DOERRORS|
- + LRMF_SENTCMD));
- + }
- +
- + void init_amiga_rexx(void)
- + {
- + extern ULONG inputsig;
- + int i;
- +
- + handle = InitARexx("Emacs", "elx");
- + inputsig |= ARexxSignal(handle);
- +
- + /* init exec lists. */
- + NewList((struct List *)&incoming.lrl_List);
- + incoming.lrl_Count = 0;
- +
- + NewList((struct List *)&pending.lrl_List);
- + pending.lrl_Count = 0;
- +
- + NewList((struct List *)&returned.lrl_List);
- + returned.lrl_Count = 0;
- + }
- +
- + void cleanup_amiga_rexx(void)
- + {
- + /* Delete and reply all rexx messages we have gotten. */
- + Lisp_Object rm = remove_rexx_msg_from_head(&returned);
- + while(!NULL(rm)) {
- + struct LispRexxMsg *lrm = XLRXMSG(rm);
- + DeleteARexxMsg(handle,lrm->lrm_Msg);
- + free_rexx_msg(rm);
- + rm = remove_rexx_msg_from_head(&returned);
- + }
- +
- + rm = remove_rexx_msg_from_head(&incoming);
- + while(!NULL(rm)) {
- + struct LispRexxMsg *lrm = XLRXMSG(rm);
- + ReplyARexxMsg(handle, lrm->lrm_Msg, 0, 20);
- + free_rexx_msg(rm);
- + rm = remove_rexx_msg_from_head(&incoming);
- + }
- +
- + /* Free the rest of rexx, will wait for pending msgs to return */
- + FreeARexx(handle);
- + }
- +
- + void syms_of_amiga_rexx(void)
- + {
- + DEFVAR_BOOL ("amiga-arexx-initialized", &amiga_arexx_initialized,
- + "Set this to t when Emacs is ready to respond to ARexx messages.\n"
- + "(ie C-\ X causes all pending ARexx messages to be answered)");
- + amiga_arexx_initialized = 0;
- +
- + defsubr(&Samiga_arexx_send_command);
- + defsubr(&Samiga_arexx_reply);
- + defsubr(&Samiga_get_next_msg);
- + defsubr(&Samiga_arexx_get_msg_results);
- + defsubr(&Samiga_arexx_check_command);
- + defsubr(&Samiga_arexx_wait);
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_screen.c emacs-18.59-amiga/src/amiga_screen.c
- *** emacs-18.59-fsf/src/amiga_screen.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_screen.c Tue Aug 31 18:16:14 1993
- ***************
- *** 0 ****
- --- 1,1396 ----
- + #include "config.h"
- + #undef NULL
- + #include "lisp.h"
- + #include "termchar.h"
- + #include "dispextern.h"
- +
- + #include <stdio.h>
- + #include <string.h>
- + #include <stddef.h>
- + #include <internal/devices.h>
- + #include <internal/vars.h>
- +
- + #define min(x,y) ((x) > (y) ? (y) : (x))
- + #define max(x,y) ((x) < (y) ? (y) : (x))
- +
- + #undef LONGBITS
- +
- + #include <exec/types.h>
- + #include <exec/interrupts.h>
- + #include <devices/input.h>
- + #include <devices/inputevent.h>
- + #include <intuition/intuitionbase.h>
- + #include <intuition/intuition.h>
- + #include <devices/conunit.h>
- + #include <devices/inputevent.h>
- + #include <graphics/gfxbase.h>
- + #include <graphics/gfxmacros.h>
- + #include <utility/hooks.h>
- + #include <workbench/startup.h>
- + #include <workbench/workbench.h>
- +
- + #include <proto/exec.h>
- + #include <proto/dos.h>
- + #include <proto/intuition.h>
- + #include <proto/graphics.h>
- + #include <proto/console.h>
- + #include <proto/diskfont.h>
- + #include <proto/wb.h>
- +
- + /* this is defined for those unlucky enough
- + * not to have the 3.0 headers -ch3/16/93. */
- + #ifndef WA_NewLookMenus
- + #define WA_NewLookMenus (WA_Dummy + 0x30)
- + #endif
- +
- + #include "amiga.h"
- +
- + #define SHIFT_MASK (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
- + #define CONTROL_MASK IEQUALIFIER_CONTROL
- + #define META_MASK IEQUALIFIER_LALT
- +
- + struct GfxBase *GfxBase;
- + struct IntuitionBase *IntuitionBase;
- + struct Library *DiskfontBase, *KeymapBase, *WorkbenchBase;
- +
- + static char intkey_code, intkey_qualifier;
- + static struct IOStdReq *input_req;
- + static struct Interrupt int_handler_hook;
- + static int hooked;
- +
- + static struct MsgPort *wbport;
- + static struct AppWindow *emacs_app_win;
- + static struct AppIcon *emacs_icon;
- +
- + struct Library *ConsoleDevice;
- + static struct TextFont *font;
- + static int font_opened;
- + /* The reset string resets the console, turns off scrolling and sets up
- + the foreground & background colors. */
- + #define CONSOLE_RESET "\x1b""c\x9b>1l\x9b""3%d;4%d;>%dm"
- + static char reset_string[20]; /* Must be big enough for
- + printf(CONSOLE_RESET, foreground, background, background);
- + (0 <= foreground, background <= 7) */
- +
- + /* These are the pen numbers for emacs window's base colors */
- + int foreground = 1, background = 0;
- +
- + /* Current window, and its main characteristics */
- + struct Window *emacs_win;
- + WORD emacs_x = 0, emacs_y = 0, emacs_w = 640, emacs_h = 200;
- + char *emacs_screen_name;
- + char emacs_screen_name_storage[MAXPUBSCREENNAME+1];
- + int emacs_backdrop = 0; /* Use backdrop window ? */
- +
- + /* Current window size: */
- + #define EMACS_X() (emacs_win ? emacs_win->LeftEdge : emacs_x)
- + #define EMACS_Y() (emacs_win ? emacs_win->TopEdge : emacs_y)
- + #define EMACS_W() (emacs_win ? emacs_win->Width : emacs_w)
- + #define EMACS_H() (emacs_win ? emacs_win->Height : emacs_h)
- +
- + /* used for setting the color of standout text -ch3/16/93. */
- + int inverse_fill_pen = 8, inverse_text_pen = 8;
- +
- + /* IO request for all console io. */
- + static struct IOStdReq *emacs_console;
- +
- + /* a storage area for the name of the screen last opened on */
- +
- + #define emacs_icon_width 57
- + #define emacs_icon_height 55
- + #define emacs_icon_num_planes 1
- + #define emacs_icon_words_per_plane 220
- +
- + UWORD chip emacs_icon_data[1][55][4] = {
- + {
- + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe0,0x6000,
- + 0x0000,0x0000,0x0060,0x6000,0x0000,0x0000,0x0fff,0xe000,
- + 0x0000,0x0000,0x1800,0x2000,0x0000,0x0000,0x13ff,0xa000,
- + 0x0000,0x0000,0x1400,0xa000,0x0000,0x0000,0x3600,0xa000,
- + 0x0000,0x0000,0x0000,0xa000,0x0000,0x0000,0x0c00,0xa000,
- + 0x0000,0x0000,0x1e00,0xa000,0x0000,0x0000,0x0c00,0xa000,
- + 0x0000,0x0000,0x0000,0xa000,0x0000,0x0000,0x2100,0xa000,
- + 0x0000,0x0000,0x3300,0xa000,0x0000,0x0000,0x0c00,0xa000,
- + 0x003f,0xffff,0xffff,0xb000,0x001f,0xffff,0xffff,0x8000,
- + 0x004e,0x0000,0x0001,0xf000,0x00c6,0x00f0,0x0001,0x8000,
- + 0x00c6,0x0100,0x0001,0x8000,0x0006,0x0103,0x9201,0x8000,
- + 0x0006,0x013a,0x5201,0x8000,0x00c6,0x010a,0x5201,0x8000,
- + 0x00c6,0x010a,0x5601,0x8000,0x0086,0x00f2,0x4a01,0x8000,
- + 0x0006,0x0000,0x0001,0x8000,0x0046,0x0000,0x0001,0x8000,
- + 0x00c6,0x7c00,0x0001,0x8000,0x00c6,0x4000,0x0001,0x8000,
- + 0x0006,0x41d8,0xc319,0x8000,0x0006,0x7925,0x24a1,0x8000,
- + 0x00c6,0x4125,0x2419,0x8000,0x01c6,0x4125,0x2485,0x8000,
- + 0x0086,0x7d24,0xd319,0x8000,0x0007,0x0000,0x0003,0x8000,
- + 0x0003,0xffe3,0xffff,0x0000,0x0081,0xfff7,0xfffe,0x0000,
- + 0x01c0,0x0036,0x0000,0x0000,0x0180,0x0014,0x0f80,0x0000,
- + 0x0000,0x0014,0x1040,0x0000,0x0000,0x0014,0x2720,0x0000,
- + 0x0000,0x0012,0x28a0,0x0000,0x0080,0x000a,0x48a0,0x0000,
- + 0x01c0,0x0009,0x90a0,0x0000,0x0180,0x0004,0x20a0,0x0000,
- + 0x0000,0x0003,0xc0a0,0x0000,0x0000,0x0000,0x00a0,0x0000,
- + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- + 0x0000,0x0000,0x0000,0x0000
- + },
- + };
- +
- + struct Image far emacs_icon_image = {
- + 0, 0,
- + emacs_icon_width, emacs_icon_height, emacs_icon_num_planes,
- + (UWORD *)emacs_icon_data,
- + 3, 0,
- + 0
- + };
- +
- + static struct DiskObject far emacs_icon_object = {
- + 0, 0,
- + { 0, 0, 0, emacs_icon_width, emacs_icon_height, 0, 0, 0, (APTR)&emacs_icon_image },
- + 0, 0, 0,
- + NO_ICON_POSITION, NO_ICON_POSITION
- + };
- +
- + static struct Hook background_hook;
- +
- + #define EVENTSIZE 32
- +
- + static struct event {
- + ULONG class;
- + UWORD code, qual;
- + WORD x, y;
- + } events[EVENTSIZE];
- + static int event_num, event_in, event_out;
- +
- + static struct wbevent {
- + struct wbevent *next;
- + char file[1];
- + } *wbevents;
- +
- + Lisp_Object Vamiga_mouse_pos;
- + Lisp_Object Vamiga_mouse_item;
- + extern Lisp_Object MouseMap;
- + int amiga_remap_bsdel;
- + int amiga_remap_numeric_keypad;
- + int amiga_mouse_initialized;
- + int amiga_wb_initialized;
- + int emacs_iconified;
- +
- + static int amiga_pos_x(int x)
- + {
- + return (x - emacs_win->BorderLeft) / emacs_win->RPort->Font->tf_XSize;
- + }
- +
- + static int amiga_pos_y(int y)
- + {
- + return (y - emacs_win->BorderTop) / emacs_win->RPort->Font->tf_YSize;
- + }
- +
- + static void amiga_change_size(void)
- + {
- + int new_height = amiga_pos_y(emacs_win->Height - emacs_win->BorderBottom);
- + int new_width = amiga_pos_x(emacs_win->Width - emacs_win->BorderRight);
- +
- + /* Hack to force redisplay */
- + if (screen_height == new_height) screen_height--;
- + /* I consider that refreshes are possible during a select, which is
- + true for the current state of emacs */
- + change_screen_size(new_height, new_width, 0, !selecting && !waiting_for_input, 1);
- + }
- +
- + /* Get terminal size from system.
- + Store number of lines into *heightp and width into *widthp.
- + If zero or a negative number is stored, the value is not valid. */
- +
- + void get_window_size (widthp, heightp)
- + int *widthp, *heightp;
- + {
- + if (emacs_win)
- + {
- + *heightp = amiga_pos_y(emacs_win->Height - emacs_win->BorderBottom);
- + *widthp = amiga_pos_x(emacs_win->Width - emacs_win->BorderRight);
- + }
- + else
- + {
- + *heightp = 0;
- + *widthp = 0;
- + }
- + }
- +
- + static int set_min_size(struct Window *win, struct TextFont *font,
- + WORD *minw, WORD *minh)
- + {
- + *minw = 11 * font->tf_XSize + win->BorderLeft + win->BorderRight;
- + *minh = 4 * font->tf_YSize + win->BorderTop + win->BorderBottom;
- +
- + return (int)WindowLimits(win, *minw, *minh, 0, 0);
- + }
- +
- + struct fill
- + {
- + struct Layer *layer;
- + struct Rectangle bounds;
- + WORD offsetx, offsety;
- + };
- +
- + /* __interrupt disables stack checking. -ch3/19/93. */
- + static ULONG __asm __saveds __interrupt
- + fill_background(register __a2 struct RastPort *obj,
- + register __a1 struct fill *msg)
- + {
- + struct Layer *l;
- +
- + SetAPen(obj, background);
- + SetDrMd(obj, JAM1);
- + SetAfPt(obj, 0, 0);
- + SetWrMsk(obj, 0xff);
- + /* Gross hack starts here */
- + l = obj->Layer;
- + obj->Layer = 0;
- + /* Stops */
- + RectFill(obj, msg->bounds.MinX, msg->bounds.MinY,
- + msg->bounds.MaxX, msg->bounds.MaxY);
- + /* Starts again */
- + obj->Layer = l;
- + /* And finally dies */
- +
- + return 0;
- + }
- +
- + static void clear_window(void)
- + {
- + SetAPen(emacs_win->RPort, background);
- + RectFill(emacs_win->RPort, emacs_win->BorderLeft, emacs_win->BorderTop,
- + emacs_win->Width - emacs_win->BorderRight - 1,
- + emacs_win->Height - emacs_win->BorderBottom - 1);
- + }
- +
- + static int make_reset_string(void)
- + {
- + sprintf(reset_string, CONSOLE_RESET, foreground, background, background);
- + }
- +
- + void reset_window(void)
- + {
- + make_reset_string();
- + if (emacs_win)
- + {
- + screen_puts (reset_string, strlen(reset_string));
- + clear_window();
- + amiga_change_size ();
- + }
- + }
- +
- + static void close_app_win(void)
- + {
- + if (emacs_app_win)
- + {
- + struct AppMessage *msg;
- +
- + RemoveAppWindow(emacs_app_win); /* What can I do if it fails ?! */
- + while (msg = (struct AppMessage *)GetMsg(wbport)) ReplyMsg(msg);
- + }
- + }
- +
- + static int close_emacs_window(void)
- + {
- + close_app_win();
- + inputsig &= ~(1L << emacs_win->UserPort->mp_SigBit);
- + _device_close(emacs_console);
- + if(emacs_win)
- + {
- + /* put title back the way it should be -ch3/19/93. */
- + ShowTitle(emacs_win->WScreen, !emacs_backdrop);
- + }
- + CloseWindow(emacs_win);
- + emacs_console = 0;
- + emacs_win = 0;
- + ConsoleDevice = 0;
- + }
- +
- + /* We need this function becuase we do not always have the string
- + * for the screen we opened on. for example LockPubScreen(NULL);
- + * This function will get the name by looping through all public
- + * screens looking for the one that matches ours. -ch3/20/93 */
- +
- + char *get_screen_name(struct Screen *this, char *namebuf)
- + {
- + struct PubScreenNode *pubscreens =
- + (struct PubScreenNode *)LockPubScreenList()->lh_Head;
- +
- + while (pubscreens->psn_Node.ln_Succ)
- + {
- + if (pubscreens->psn_Screen == this)
- + {
- + strcpy(namebuf, pubscreens->psn_Node.ln_Name);
- + UnlockPubScreenList();
- + return namebuf;
- + }
- + pubscreens = (struct PubScreenNode *)pubscreens->psn_Node.ln_Succ;
- + }
- + /* Failed to find screen */
- + namebuf[0] = '\0';
- + UnlockPubScreenList();
- +
- + return 0;
- + }
- +
- + /* added two parameters to eliminate the need for the global
- + * which was causing some unwanted effect (bugs). -ch3/19/93 */
- +
- + static enum { ok, no_screen, no_window }
- + open_emacs_window(UWORD x, UWORD y, UWORD w, UWORD h, int backdrop,
- + char *pubscreen_name)
- + /* Open or reopen emacs window */
- + {
- + WORD minw, minh;
- + struct Screen *new_screen;
- + struct Window *new_win;
- + struct IOStdReq *new_console;
- + int no_backdrop = !backdrop;
- +
- + new_screen = LockPubScreen(pubscreen_name);
- +
- + if (!new_screen)
- + return no_screen;
- +
- + /* removed newwindow structure, and added as tag
- + * items so that we can change them easier. -ch3/16/93. */
- +
- + new_win = OpenWindowTags(0, WA_Left, x, WA_Top, y,
- + WA_Width, w, WA_Height, h, /* Static items */
- + WA_AutoAdjust, 1, WA_NewLookMenus, 1,
- + WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_RAWKEY |
- + IDCMP_MOUSEBUTTONS| IDCMP_NEWSIZE |
- + IDCMP_MENUPICK | IDCMP_MENUHELP,
- + WA_PubScreen, new_screen,
- + WA_BackFill, &background_hook,
- + WA_MenuHelp, 1, WA_Activate, 1,
- + WA_SimpleRefresh, 1,
- + WA_MaxWidth, -1, WA_MaxHeight, -1,
- + WA_Backdrop, backdrop, /* changing items */
- + WA_Borderless, backdrop,
- + WA_CloseGadget, no_backdrop,
- + WA_SizeGadget, no_backdrop,
- + WA_DragBar, no_backdrop,
- + WA_DepthGadget, no_backdrop,
- + WA_Title, no_backdrop ?
- + "GNU Emacs 18.59, Amiga port "VERS : 0,
- + TAG_END);
- +
- + UnlockPubScreen(0L, new_screen);
- +
- + if (new_win)
- + {
- + /* if emacs_backdrop then the screen title will show BEHIND the window
- + -ch3/16/93. */
- + ShowTitle(new_screen, !emacs_backdrop);
- + SetFont(new_win->RPort, font);
- +
- + if (set_min_size(new_win, font, &minw, &minh) &&
- + (new_console = (struct IOStdReq *)
- + _device_open("console.device", CONU_CHARMAP, CONFLAG_NODRAW_ON_NEWSIZE,
- + (APTR)new_win, sizeof(*new_win),
- + sizeof(struct IOStdReq))))
- + {
- + inputsig |= 1L << new_win->UserPort->mp_SigBit;
- + ConsoleDevice = (struct Library *)new_console->io_Device;
- + emacs_app_win = AddAppWindowA(0, 0, new_win, wbport, 0);
- +
- + /* Copy the info into permanent storage */
- + emacs_win = new_win;
- + emacs_console = new_console;
- +
- + /* fetch the name of the current screen -ch3/19/93 */
- + emacs_screen_name = get_screen_name(emacs_win->WScreen,
- + emacs_screen_name_storage);
- +
- + emacs_backdrop = backdrop;
- +
- + reset_window();
- +
- + return ok;
- + }
- + CloseWindow(new_win);
- + }
- + return no_window;
- + }
- +
- + void force_window(void)
- + {
- + if (!emacs_win && !emacs_iconified)
- + {
- + if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
- + emacs_screen_name) != ok)
- + {
- + /* Try to return to defaults (Workbench, etc) */
- + if (open_emacs_window(0, 0, 640, 200, 0, 0) != ok)
- + _fail("I've lost my window ! Exiting.");
- + }
- + resume_menus();
- + }
- + }
- +
- + /* returns:
- + * -2 if msg is not class RAWKEY
- + * same as RawKeyConvert otherwise:
- + * buffer length if <= kbsize
- + * -1 else
- + */
- + static DeadKeyConvert(struct IntuiMessage *msg, UBYTE *kbuffer, int kbsize,
- + struct KeyMap *kmap)
- + {
- + static struct InputEvent ievent = {0, IECLASS_RAWKEY, 0, 0, 0};
- + int extra = 0, res;
- +
- + if (msg->Class != RAWKEY) return (-2);
- +
- + /* Do some keymapping ourselves to make emacs users happy */
- +
- + /* Ctrl-space becomes Ctrl-@ */
- + if (msg->Code == 0x40 && msg->Qualifier & CONTROL_MASK)
- + {
- + *kbuffer = 0;
- + return 1;
- + }
- + /* Backspace becomes DEL */
- + if (msg->Code == 0x41 && amiga_remap_bsdel)
- + {
- + *kbuffer = 0177;
- + return 1;
- + }
- + /* And DEL becomes CTRL-D */
- + if (msg->Code == 0x46 && amiga_remap_bsdel)
- + {
- + *kbuffer = 04;
- + return 1;
- + }
- + /* Stick numeric pad prefix in front of numeric keypad chars */
- + if (msg->Qualifier & IEQUALIFIER_NUMERICPAD && amiga_remap_numeric_keypad)
- + {
- + *kbuffer++ = 'x' & 037;
- + *kbuffer++ = '^' & 037;
- + *kbuffer++ = 'K';
- + kbsize -= 3;
- + extra = 3;
- + }
- +
- + /* pack input event */
- + ievent.ie_Code = msg->Code;
- +
- + /* Ignore meta in decoding keys */
- + ievent.ie_Qualifier = msg->Qualifier & ~META_MASK;
- +
- + /* get previous codes from location pointed to by IAddress
- + * this pointer is valid until IntuiMessage is replied.
- + */
- + ievent.ie_position.ie_addr = *((APTR *)msg->IAddress);
- + ievent.ie_position.ie_dead.ie_prev1DownQual &= ~META_MASK;
- + ievent.ie_position.ie_dead.ie_prev2DownQual &= ~META_MASK;
- +
- + res = RawKeyConvert(&ievent, kbuffer, kbsize, kmap);
- + return res ? res + extra : 0;
- + }
- +
- + void add_wbevent(struct WBArg *wbarg)
- + {
- + char filename[256];
- +
- + if (wbarg->wa_Lock && NameFromLock(wbarg->wa_Lock, filename, 256))
- + {
- + struct wbevent *event;
- +
- + if (wbarg->wa_Name) AddPart(filename, wbarg->wa_Name, 256);
- + if (event = (struct wbevent *)malloc(offsetof(struct wbevent, file) +
- + strlen(filename) + 1))
- + {
- + event->next = wbevents;
- + strcpy(event->file, filename);
- + wbevents = event;
- + }
- + }
- + }
- +
- + void check_window(int force)
- + {
- + ULONG class;
- + USHORT code, qualifier;
- + UWORD mx, my;
- + unsigned char buf[32];
- + int buflen, deiconify, i;
- + struct IntuiMessage *msg;
- + int mouse_event = FALSE, wb_event = FALSE;
- + struct AppMessage *amsg;
- +
- + force_window();
- +
- + if (emacs_win)
- + while (msg = (struct IntuiMessage *)GetMsg(emacs_win->UserPort))
- + {
- + class = msg->Class;
- + code = msg->Code;
- + qualifier = msg->Qualifier;
- + mx = msg->MouseX; my = msg->MouseY;
- + buflen = DeadKeyConvert(msg, buf, 32, 0);
- + ReplyMsg(msg);
- +
- + switch (class)
- + {
- + case IDCMP_CLOSEWINDOW: {
- + enque(030, FALSE); enque(03, FALSE); /* ^X^C */
- + break;
- + }
- + case IDCMP_RAWKEY: {
- + if (buflen > 0)
- + {
- + unsigned char *sbuf = buf;
- + int meta = qualifier & META_MASK;
- +
- + /* Don't set META on CSI */
- + do enque(*sbuf++, meta); while (--buflen);
- + }
- + break;
- + }
- + case IDCMP_NEWSIZE: amiga_change_size(); break;
- + case IDCMP_MENUPICK: case IDCMP_MENUHELP:
- + if (code == MENUNULL) break; /* else fall through */
- + case IDCMP_MOUSEBUTTONS: {
- + mouse_event = TRUE;
- + if (event_num == EVENTSIZE) break;
- +
- + events[event_in].class = class;
- + events[event_in].code = code;
- + events[event_in].qual = qualifier;
- + events[event_in].x = mx;
- + events[event_in].y = my;
- + event_num++;
- + event_in = (event_in + 1) % EVENTSIZE;
- +
- + break;
- + }
- + }
- + }
- + /* Handle App requests */
- + while (amsg = (struct AppMessage *)GetMsg(wbport))
- + switch (amsg->am_Type)
- + {
- + case MTYPE_APPICON: case MTYPE_APPWINDOW:
- + /* Add an event for all these files */
- + for (i = 0; i < amsg->am_NumArgs; i++) add_wbevent(amsg->am_ArgList + i);
- + wb_event = TRUE;
- + /* Reply to the message, and deiconify if was icon */
- + deiconify = amsg->am_Type == MTYPE_APPICON;
- + ReplyMsg(amsg);
- + if (deiconify && emacs_icon)
- + /* Reopen window */
- + if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
- + emacs_screen_name) == ok)
- + {
- + resume_menus();
- + RemoveAppIcon(emacs_icon);
- + emacs_icon = 0;
- + emacs_iconified = 0;
- + }
- + break;
- + default: ReplyMsg(amsg); break;
- + }
- +
- + if (amiga_mouse_initialized && (force && event_num > 0 || mouse_event))
- + {
- + enque(AMIGASEQ, FALSE); enque('M', FALSE);
- + }
- + if (amiga_wb_initialized && (force && wbevents || wb_event))
- + {
- + enque(AMIGASEQ, FALSE); enque('W', FALSE);
- + }
- + }
- +
- + void setup_intchar(char intchar)
- + {
- + char cqbuf[2];
- +
- + if (MapANSI(&intchar, 1, cqbuf, 1, 0) == 1)
- + {
- + intkey_code = cqbuf[0];
- + intkey_qualifier = cqbuf[1];
- + }
- + else
- + {
- + /* Default is CTRL-G in usa0 keymap */
- + intkey_code = 0x24;
- + intkey_qualifier = IEQUALIFIER_CONTROL;
- + }
- + }
- +
- + /* Hack to detect interrupt char as soon as it is pressed */
- + /* __interrupt disables stack checking. -ch3/19/93.*/
- + static long __saveds __interrupt __asm
- + int_handler(register __a0 struct InputEvent *ev)
- + {
- + struct InputEvent *ep, *laste;
- + static struct InputEvent retkey;
- + ULONG lock = LockIBase(0);
- +
- + if (emacs_win && IntuitionBase->ActiveWindow == emacs_win)
- + {
- + laste = 0;
- +
- + /* run down the list of events to see if they pressed the magic key */
- + for (ep = ev; ep; laste = ep, ep = ep->ie_NextEvent)
- + if (ep->ie_Class == IECLASS_RAWKEY &&
- + (ep->ie_Qualifier & 0xff) == intkey_qualifier &&
- + ep->ie_Code == intkey_code)
- + {
- + /* Remove this key from input sequence */
- + if (laste) laste->ie_NextEvent = ep->ie_NextEvent;
- + else ev = ep->ie_NextEvent;
- +
- + Vquit_flag = Qt;
- + Signal(_us, SIGBREAKF_CTRL_C);
- + }
- + }
- + UnlockIBase(lock);
- +
- + /* pass on the pointer to the event */
- + return (long)ev;
- + }
- +
- + DEFUN ("amiga-mouse-events", Famiga_mouse_events, Samiga_mouse_events, 0, 0, 0,
- + "Return number of pending mouse events from Intuition.")
- + ()
- + {
- + register Lisp_Object tem;
- +
- + check_intuition ();
- +
- + XSET (tem, Lisp_Int, event_num);
- +
- + return tem;
- + }
- +
- + DEFUN ("amiga-proc-mouse-event", Famiga_proc_mouse_event, Samiga_proc_mouse_event,
- + 0, 0, 0,
- + "Pulls a mouse event out of the mouse event buffer and dispatches\n\
- + the appropriate function to act upon this event.")
- + ()
- + {
- + register Lisp_Object mouse_cmd;
- + register char com_letter;
- + register char key_mask;
- + register Lisp_Object tempx;
- + register Lisp_Object tempy;
- + extern Lisp_Object get_keyelt ();
- + extern int meta_prefix_char;
- + struct event *ev;
- + int posx, posy;
- +
- + check_intuition ();
- +
- + if (event_num) {
- + ev = &events[event_out];
- + event_out = (event_out + 1) % EVENTSIZE;
- + event_num--;
- + if (ev->class == MOUSEBUTTONS)
- + {
- + switch (ev->code)
- + {
- + case SELECTDOWN: com_letter = 2; break;
- + case SELECTUP: com_letter = 6; break;
- + case MIDDLEDOWN: com_letter = 1; break;
- + case MIDDLEUP: com_letter = 5; break;
- + case MENUDOWN: com_letter = 0; break;
- + case MENUUP: com_letter = 4; break;
- + default: com_letter = 3; break;
- + }
- + posx = amiga_pos_x(ev->x);
- + posy = amiga_pos_y(ev->y);
- + XSET (tempx, Lisp_Int, min (screen_width-1, max (0, posx)));
- + XSET (tempy, Lisp_Int, min (screen_height-1, max (0, posy)));
- + }
- + else
- + {
- + /* Must be Menu Pick or Help */
- + com_letter = ev->class == IDCMP_MENUPICK ? 3 : 7;
- +
- + /* The parameters passed describe the selected item */
- + XSET (tempx, Lisp_Int, MENUNUM(ev->code));
- + XSET (tempy, Lisp_Int, ITEMNUM(ev->code));
- + }
- + if (ev->qual & META_MASK) com_letter |= 0x20;
- + if (ev->qual & SHIFT_MASK) com_letter |= 0x10;
- + if (ev->qual & CONTROL_MASK) com_letter |= 0x40;
- +
- + Vamiga_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
- + Vamiga_mouse_item = make_number (com_letter);
- + mouse_cmd = get_keyelt (access_keymap (MouseMap, com_letter));
- + if (NULL (mouse_cmd)) {
- + bell ();
- + Vamiga_mouse_pos = Qnil;
- + }
- + else return call1 (mouse_cmd, Vamiga_mouse_pos);
- + }
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-get-mouse-event", Famiga_get_mouse_event, Samiga_get_mouse_event,
- + 1, 1, 0,
- + "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\
- + ARG non-nil means return nil immediately if no pending event;\n\
- + otherwise, wait for an event.")
- + (arg)
- + Lisp_Object arg;
- + {
- + register char com_letter;
- + register char key_mask;
- +
- + register Lisp_Object tempx;
- + register Lisp_Object tempy;
- + struct event *ev;
- + int posx, posy;
- +
- + check_intuition ();
- +
- + if (NULL (arg))
- + {
- + amiga_consume_input();
- + while (!event_num)
- + {
- + int rfds = 1;
- +
- + select(1, &rfds, 0, 0, 0);
- + amiga_consume_input();
- + }
- + }
- + /*** ??? Surely you don't mean to busy wait??? */
- +
- + if (event_num) {
- + ev = &events[event_out];
- + event_out = (event_out + 1) % EVENTSIZE;
- + event_num--;
- + switch (ev->code)
- + {
- + case SELECTDOWN: com_letter = 2; break;
- + case SELECTUP: com_letter = 6; break;
- + case MIDDLEDOWN: com_letter = 1; break;
- + case MIDDLEUP: com_letter = 5; break;
- + case MENUDOWN: com_letter = 0; break;
- + case MENUUP: com_letter = 4; break;
- + default: com_letter = 3; break;
- + }
- + if (ev->qual & META_MASK) com_letter |= 0x20;
- + if (ev->qual & SHIFT_MASK) com_letter |= 0x10;
- + if (ev->qual & CONTROL_MASK) com_letter |= 0x40;
- +
- + posx = amiga_pos_x(ev->x);
- + posy = amiga_pos_y(ev->y);
- + XSET (tempx, Lisp_Int, min (screen_width-1, max (0, posx)));
- + XSET (tempy, Lisp_Int, min (screen_height-1, max (0, posy)));
- +
- + Vamiga_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
- + Vamiga_mouse_item = make_number (com_letter);
- + return Fcons (com_letter, Fcons (Vamiga_mouse_pos, Qnil));
- + }
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-get-wb-event", Famiga_get_wb_event, Samiga_get_wb_event,
- + 1, 1, 0,
- + "Get next Workbench event out of workbench event buffer (a file name).\n\
- + ARG non-nil means return nil immediately if no pending event;\n\
- + otherwise, wait for an event.")
- + (arg)
- + Lisp_Object arg;
- + {
- + Lisp_Object file;
- + struct wbevent *ev;
- +
- + check_intuition ();
- +
- + if (NULL (arg))
- + {
- + amiga_consume_input();
- + while (!wbevents)
- + {
- + int rfds = 1;
- +
- + select(1, &rfds, 0, 0, 0);
- + amiga_consume_input();
- + }
- + }
- + /*** ??? Surely you don't mean to busy wait??? */
- +
- + if (wbevents) {
- + file = build_string(wbevents->file);
- + ev = wbevents;
- + wbevents = wbevents->next;
- + free(ev);
- + return file;
- + }
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-foreground-color", Famiga_set_foreground_color,
- + Samiga_set_foreground_color, 1, 1, "nPen number: ",
- + "Use PEN as foreground color")
- + (pen)
- + {
- + int fg;
- +
- + check_intuition();
- + CHECK_NUMBER(pen, 0);
- +
- + fg = XUINT (pen);
- + if (pen > 7) error("Pen colors must be between 0 & 7");
- + foreground = fg;
- + reset_window();
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-background-color", Famiga_set_background_color,
- + Samiga_set_background_color, 1, 1, "nPen number: ",
- + "Use PEN as background color")
- + (pen)
- + {
- + int bg;
- +
- + check_intuition();
- + CHECK_NUMBER(pen, 0);
- +
- + bg = XUINT (pen);
- + if (pen > 7) error("Pen colors must be between 0 & 7");
- + background = bg;
- + reset_window();
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-inverse-fill-pen", Famiga_set_inverse_fill_pen,
- + Samiga_set_inverse_fill_pen, 1, 1, "nPen number: ",
- + "Use PEN's color for inverse fills (0-7 or 8 for reverse)")
- + (pen)
- + {
- + int ifp = 8;
- +
- + check_intuition();
- + CHECK_NUMBER(pen, 0);
- +
- + ifp = XUINT (pen);
- + if (pen > 8)
- + error("choices are from 0 to 8");
- + inverse_fill_pen = ifp;
- + reset_window();
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-inverse-text-pen", Famiga_set_inverse_text_pen,
- + Samiga_set_inverse_text_pen, 1, 1, "nPen number: ",
- + "Use PEN's color for inverse fills (0-7 or 8 for reverse)")
- + (pen)
- + {
- + int itp = 8;
- +
- + check_intuition();
- + CHECK_NUMBER(pen, 0);
- +
- + itp = XUINT (pen);
- + if (pen > 8)
- + error("choices are from 0 to 8");
- + inverse_text_pen = itp;
- + reset_window();
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-font", Famiga_set_font, Samiga_set_font, 2, 2,
- + "sFont: \n\
- + nSize: ",
- + "Set font used for window to FONT with given HEIGHT.\n\
- + The font used must be non-proportional.")
- + (wfont, height)
- + {
- + struct TextAttr attr;
- + struct TextFont *newfont;
- + char *fname;
- + struct Lisp_String *fstr;
- + WORD minw, minh, oldmw, oldmh;
- +
- + CHECK_STRING (wfont, 0);
- + CHECK_NUMBER (height, 0);
- +
- + check_intuition();
- +
- + fstr = XSTRING (wfont);
- + fname = (char *)alloca (fstr->size + 6);
- + strcpy (fname, fstr->data);
- + strcat (fname, ".font");
- + attr.ta_Name = fname;
- + attr.ta_YSize = XFASTINT (height);
- + attr.ta_Style = 0;
- + attr.ta_Flags = 0;
- + newfont = OpenDiskFont (&attr);
- +
- + if (!newfont)
- + error ("Font %s %d not found", fstr->data, XFASTINT (height));
- + if (newfont->tf_Flags & FPF_PROPORTIONAL)
- + {
- + CloseFont(newfont);
- + error ("Font %s %d is proportional", fstr->data, XFASTINT (height));
- + }
- +
- + if (emacs_win)
- + {
- + if (!set_min_size(emacs_win, newfont, &minw, &minh))
- + {
- + CloseFont(newfont);
- + if (!set_min_size(emacs_win, font, &oldmw, &oldmh))
- + _fail("Failed to restore old font, exiting.");
- + error("Window is too small for this font, need at least %d(w) by %d(h)",
- + minw, minh);
- + }
- + SetFont(emacs_win->RPort, newfont);
- + }
- + if (font_opened) CloseFont(font);
- + font_opened = TRUE;
- + font = newfont;
- + reset_window();
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-geometry", Famiga_set_geometry, Samiga_set_geometry, 4, MANY, 0,
- + "Set Emacs window geometry and screen.\n\
- + First 4 parameters are the (X,Y) position of the top-left corner of the window\n\
- + and its WIDTH and HEIGHT. These must be big enough for an 11x4 characters window.\n\
- + If nil is given for any of these, that means to keep the same value as before.\n\
- + The optional argument SCREEN specifies which screen to use, nil stands for the\n\
- + same screen as the window is on, t stands for the default public screen (normally\n\
- + the Workbench), a string specifies a given public screen.\n\
- + If optional argument BACKDROP is t, a backdrop window is used.")
- + (nargs, args)
- + int nargs;
- + Lisp_Object *args;
- + {
- + Lisp_Object x, y, w, h, scr = Qnil, backdrop = Qnil;
- + int opened;
- + WORD tempx, tempy, tempw, temph;
- + char *screen_name;
- + int use_backdrop;
- +
- + if (nargs > 6) error("Too many arguments to amiga-set-geometry");
- + x = args[0]; y = args[1]; w = args[2]; h = args[3];
- + if (nargs > 4)
- + {
- + scr = args[4];
- + if (nargs > 5) backdrop = args[5];
- + }
- +
- + check_intuition();
- +
- + if (!NULL (x))
- + {
- + CHECK_NUMBER(x, 0);
- + tempx = XUINT(x);
- + }
- + else tempx = EMACS_X();
- + if (!NULL (y))
- + {
- + CHECK_NUMBER(y, 0);
- + tempy = XUINT(y);
- + }
- + else tempy = EMACS_Y();
- + if (!NULL (w))
- + {
- + CHECK_NUMBER(w, 0);
- + tempw = XUINT(w);
- + }
- + else tempw = EMACS_W();
- + if (!NULL (h))
- + {
- + CHECK_NUMBER(h, 0);
- + temph = XUINT(h);
- + }
- + else temph = EMACS_H();
- +
- + use_backdrop = !NULL(backdrop);
- +
- + if (scr == Qt) screen_name = 0; /* set to zero for def. */
- + else if (!NULL (scr))
- + {
- + CHECK_STRING (scr, 0);
- + screen_name = XSTRING (scr)->data;
- + }
- + else screen_name = emacs_screen_name;
- +
- + if (emacs_win)
- + {
- + struct Window *old_win = emacs_win;
- + struct IOStdReq *old_console = emacs_console;
- +
- + suspend_menus();
- + opened = open_emacs_window(tempx, tempy, tempw, temph, use_backdrop,
- + screen_name);
- + if (opened != ok)
- + {
- + resume_menus();
- +
- + if (opened == no_window) error("Failed to open desired window");
- + else if (screen_name)
- + error("Unknown public screen %s", screen_name);
- + else error("The default screen wasn't found !?");
- + }
- +
- + _device_close(old_console);
- + CloseWindow(old_win);
- + if (!resume_menus()) error("Failed to recover menus (No memory?)");
- + }
- + else /* No window, set defaults */
- + {
- + emacs_screen_name = screen_name;
- + if (screen_name)
- + {
- + emacs_screen_name_storage[MAXPUBSCREENNAME] = '\0';
- + strncpy(emacs_screen_name_storage, screen_name, MAXPUBSCREENNAME);
- + }
- + emacs_x = tempx;
- + emacs_y = tempy;
- + emacs_w = tempw;
- + emacs_h = temph;
- + emacs_backdrop = use_backdrop;
- + }
- + return Qnil;
- + }
- +
- +
- + /* The next 2 functions are very usefull for writing
- + * arexx/lisp functions that interact with other programs
- + * that will be sharing the same screen. -ch3/19/93. */
- +
- + DEFUN("amiga-get-window-geometry",
- + Famiga_get_window_geometry, Samiga_get_window_geometry, 0, 0, 0,
- + "Get Emacs window geometry.\n\
- + a list returned is of the form: (iconified x y width height backdrop)\n\
- + where x, y, width, height are integers, backdrop is t or nil and iconified\n\
- + is t if the window is iconified and nil otherwise")
- + ()
- + {
- + Lisp_Object x, y, w, h, b, i;
- +
- + XSET(x, Lisp_Int, EMACS_X());
- + XSET(y, Lisp_Int, EMACS_Y());
- + XSET(w, Lisp_Int, EMACS_W());
- + XSET(h, Lisp_Int, EMACS_H());
- + b = emacs_backdrop ? Qt : Qnil;
- + i = emacs_iconified ? Qt : Qnil;
- +
- + return Fcons(i, Fcons(x, Fcons(y, Fcons(w, Fcons(h, Fcons(b, Qnil))))));
- + }
- +
- + DEFUN("amiga-get-screen-geometry",
- + Famiga_get_screen_geometry, Samiga_get_screen_geometry, 0, 0, 0,
- + "Get geometry of the screen emacs window resides on.\n\
- + a list returned is of the form: (name x y width height)\n\
- + where name is a string, x, y, width, height are integers.\n\
- + Only the public screen name is returned if the window is not currently open.\n\
- + In this last case, the name may be nil if the window will be opened on the\n\
- + default public screen.")
- + ()
- + {
- + Lisp_Object name;
- +
- + if (emacs_screen_name) name = Qnil;
- + else name = build_string(emacs_screen_name);
- +
- + if(emacs_win)
- + {
- + struct Screen *s = emacs_win->WScreen;
- + Lisp_Object x, y, w, h;
- +
- + XSET(x, Lisp_Int, s->LeftEdge);
- + XSET(y, Lisp_Int, s->TopEdge);
- + XSET(w, Lisp_Int, s->Width);
- + XSET(h, Lisp_Int, s->Height);
- +
- + return Fcons(name, Fcons(x, Fcons(y, Fcons(w, Fcons(h, Qnil)))));
- + }
- + return Fcons(name, Qnil);
- + }
- +
- + DEFUN("amiga-iconify", Famiga_iconify, Samiga_iconify, 0, 0, "",
- + "Toggle the emacs iconification state.")
- + ()
- + {
- + check_intuition();
- +
- + if (emacs_iconified)
- + {
- + /* Deiconify */
- +
- + /* Reopen window */
- + if (open_emacs_window(emacs_x, emacs_y, emacs_w, emacs_h, emacs_backdrop,
- + emacs_screen_name) != ok)
- + error("Failed to deiconify (No memory?)");
- + resume_menus();
- +
- + RemoveAppIcon(emacs_icon);
- + emacs_icon = 0;
- + emacs_iconified = 0;
- + }
- + else
- + if (emacs_icon = AddAppIconA(0, 0, "Emacs", wbport, 0, &emacs_icon_object, 0))
- + {
- + if (emacs_win)
- + {
- + /* Close window */
- + emacs_x = EMACS_X(); emacs_y = EMACS_Y();
- + emacs_w = EMACS_W(); emacs_h = EMACS_H();
- + suspend_menus();
- + close_emacs_window();
- + }
- + emacs_iconified = 1;
- + }
- + else error("Iconify attempt failed\n");
- +
- + return Qnil;
- + }
- +
- + DEFUN("amiga-set-icon-pos", Famiga_set_icon_pos, Samiga_set_icon_pos, 2, 2,
- + "nX position: \n\
- + nY position: ",
- + "Set the X Y position of the icon for emacs when iconified.")
- + (Lisp_Object x, Lisp_Object y)
- + {
- + long xpos, ypos;
- +
- + if (NULL (x)) emacs_icon_object.do_CurrentX = NO_ICON_POSITION;
- + else
- + {
- + CHECK_NUMBER (x, 0);
- + emacs_icon_object.do_CurrentX = XINT(x);
- + }
- + if (NULL (y)) emacs_icon_object.do_CurrentY = NO_ICON_POSITION;
- + else
- + {
- + CHECK_NUMBER (y, 0);
- + emacs_icon_object.do_CurrentY = XINT(y);
- + }
- +
- + return Qnil;
- + }
- +
- + struct EClockVal scount[16], ecount[16];
- + long total[16], counting[16], nb[16], susp[16];
- +
- + void start_count(int n)
- + {
- + nb[n]++;
- + if (counting[n]) printf("Restarted %d\n", n);
- + counting[n] = 1;
- + /*ReadEClock(&scount[n]);*/
- + }
- +
- + void stop_count(int n)
- + {
- + if (counting[n])
- + {
- + /*ReadEClock(&ecount[n]);*/
- + counting[n] = 0;
- +
- + total[n] += ecount[n].ev_lo - scount[n].ev_lo;
- + }
- + }
- +
- + void suspend_count(int n)
- + {
- + if (counting[n] && susp[n]++ == 0)
- + {
- + /*ReadEClock(&ecount[n]);*/
- + total[n] += ecount[n].ev_lo - scount[n].ev_lo;
- + }
- + }
- +
- + void resume_count(int n)
- + {
- + if (counting[n] && --susp[n] == 0) /*ReadEClock(&scount[n])*/;
- + }
- +
- + disp_counts(void)
- + {
- + int i;
- +
- + for (i = 0; i < 16; i++)
- + {
- + printf("%d(%d) ", total[i], nb[i]);
- + total[i] = nb[i] = 0;
- + }
- + printf("\n");
- + }
- +
- + void screen_puts(char *str, unsigned int len)
- + {
- + if (emacs_win)
- + {
- + int i;
- +
- + emacs_console->io_Command = CMD_WRITE;
- + emacs_console->io_Data = (APTR)str;
- + emacs_console->io_Length = len;
- +
- + /* start_count(0);
- + for (i = 1; i <= 6; i++) suspend_count(i);*/
- + DoIO(emacs_console);
- + /* for (i = 1; i <= 6; i++) resume_count(i);
- + stop_count(0);*/
- + }
- + }
- +
- + DEFUN ("amiga-activate-window", Famiga_activate_window, Samiga_activate_window, 0, 0, 0,
- + "Makes emacs window the currently active one.")
- + ()
- + {
- + if(emacs_win) {
- + ActivateWindow(emacs_win);
- + return Qnil;
- + }
- + error("No window to make active.");
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-window-to-front", Famiga_window_to_front, Samiga_window_to_front, 0, 0, 0,
- + "Pulls the emacs window to the front (including screen)")
- + ()
- + {
- + if(emacs_win) {
- + WindowToFront(emacs_win);
- + ScreenToFront(emacs_win->WScreen);
- + return Qnil;
- + }
- + error("No window to pull to the front.");
- + return Qnil;
- + }
- +
- + DEFUN ("amiga-window-to-back", Famiga_window_to_back, Samiga_window_to_back, 0, 0, 0,
- + "Pushes the emacs window to the back (including screen)")
- + ()
- + {
- + if(emacs_win) {
- + WindowToBack(emacs_win);
- + ScreenToBack(emacs_win->WScreen);
- + return Qnil;
- + }
- + error("No window to push back.");
- + return Qnil;
- + }
- +
- +
- + void syms_of_amiga_screen(void)
- + {
- + DEFVAR_LISP ("amiga-mouse-item", &Vamiga_mouse_item,
- + "Encoded representation of last mouse click, corresponding to\n\
- + numerical entries in amiga-mouse-map.");
- + Vamiga_mouse_item = Qnil;
- + DEFVAR_LISP ("amiga-mouse-pos", &Vamiga_mouse_pos,
- + "Current x-y position of mouse by row, column as specified by font.");
- + Vamiga_mouse_pos = Qnil;
- +
- + DEFVAR_BOOL ("amiga-remap-bsdel", &amiga_remap_bsdel,
- + "*If true, map DEL to Ctrl-D and Backspace to DEL. \n\
- + This is the most convenient (and default) setting. If nil, don't remap.");
- + amiga_remap_bsdel = 1;
- +
- + DEFVAR_BOOL ("amiga-remap-numeric-keypad", &amiga_remap_numeric_keypad,
- + "*If true, numeric keypad keys are prefixed with C-x C-^ K.\n\
- + This enables you to remap them, but causes problems with functions like\n\
- + isearch-forward-regexp on some keyboards. Default to true.");
- + amiga_remap_numeric_keypad = 1;
- +
- + DEFVAR_BOOL ("amiga-mouse-initialized", &amiga_mouse_initialized,
- + "Set to true once lisp has been setup to process mouse commands.\n\
- + No mouse processing request (C-X C-^ M) will be queued while this is nil.");
- + amiga_mouse_initialized = 0;
- +
- + DEFVAR_BOOL ("amiga-wb-initialized", &amiga_wb_initialized,
- + "Set to true once lisp has been setup to process workbench commands.\n\
- + No workbench processing request (C-X C-^ W) will be queued while this is nil.");
- + amiga_mouse_initialized = 0;
- +
- + defsubr (&Samiga_mouse_events);
- + defsubr (&Samiga_proc_mouse_event);
- + defsubr (&Samiga_get_mouse_event);
- + defsubr (&Samiga_get_wb_event);
- + defsubr (&Samiga_set_font);
- + defsubr (&Samiga_set_geometry);
- + defsubr (&Samiga_set_background_color);
- + defsubr (&Samiga_set_foreground_color);
- + defsubr (&Samiga_iconify);
- + defsubr (&Samiga_set_icon_pos);
- +
- + /* New functions -ch3/19/93. */
- + defsubr (&Samiga_set_inverse_text_pen);
- + defsubr (&Samiga_set_inverse_fill_pen);
- + defsubr (&Samiga_window_to_front);
- + defsubr (&Samiga_window_to_back);
- + defsubr (&Samiga_activate_window);
- + defsubr (&Samiga_get_window_geometry);
- + defsubr (&Samiga_get_screen_geometry);
- +
- + }
- +
- + void init_amiga_screen(void)
- + {
- + event_num = event_in = event_out = 0;
- +
- + if (!((IntuitionBase = (struct IntuitionBase *)
- + OpenLibrary("intuition.library", 37L)) &&
- + (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) &&
- + (DiskfontBase = OpenLibrary("diskfont.library", 0L)) &&
- + (WorkbenchBase = OpenLibrary("workbench.library", 37)) &&
- + (KeymapBase = OpenLibrary("keymap.library", 36)) &&
- + (input_req = (struct IOStdReq *)_device_open("input.device", 0, 0, 0, 0,
- + sizeof(struct IOStdReq)))))
- + _fail("Need version 2.04 and diskfont.library!");
- +
- + if (!(wbport = CreateMsgPort())) no_memory();
- +
- + /* Add Ctrl-G detector */
- + int_handler_hook.is_Data = 0;
- + int_handler_hook.is_Code = (void *)int_handler;
- + int_handler_hook.is_Node.ln_Pri = 100; /* 100 not 127 is the standard value
- + * for input stream handlers. -ch3/19/93. */
- + /* it is standard for interrupts to have names -ch3/19/93.*/
- + int_handler_hook.is_Node.ln_Name = "GNU Emacs CTRL-G handler";
- + input_req->io_Command = IND_ADDHANDLER;
- + input_req->io_Data = (APTR)&int_handler_hook;
- +
- + /* wasn't checking for error. -ch3/19/93. */
- + if(0 == DoIO(input_req))
- + hooked = TRUE;
- + else
- + {
- + hooked = FALSE;
- + _fail("couldn't get input handler hook for CTRL-G");
- + }
- +
- + inputsig |= 1L << wbport->mp_SigBit;
- +
- + background_hook.h_Entry = (ULONG (*)()) fill_background; /* added cast. */
- + font = GfxBase->DefaultFont;
- +
- + init_amiga_menu();
- + }
- +
- + void cleanup_amiga_screen(void)
- + {
- + if (hooked)
- + {
- + input_req->io_Command = IND_REMHANDLER;
- + input_req->io_Data = (APTR)&int_handler_hook;
- + DoIO(input_req);
- + }
- + close_app_win();
- + if (wbport) DeleteMsgPort(wbport);
- + cleanup_amiga_menu();
- + _device_close(emacs_console);
- + if (emacs_win) CloseWindow(emacs_win);
- + if (font_opened) CloseFont(font);
- + if (IntuitionBase) CloseLibrary(IntuitionBase);
- + if (GfxBase) CloseLibrary(GfxBase);
- + if (DiskfontBase) CloseLibrary(DiskfontBase);
- + if (WorkbenchBase) CloseLibrary(WorkbenchBase);
- + if (KeymapBase) CloseLibrary(KeymapBase);
- + _device_close(input_req);
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_serial.c emacs-18.59-amiga/src/amiga_serial.c
- *** emacs-18.59-fsf/src/amiga_serial.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_serial.c Sat Jun 5 11:37:38 1993
- ***************
- *** 0 ****
- --- 1,72 ----
- + #include <exec/types.h>
- + #include <devices/serial.h>
- + #include <stdio.h>
- + #include <internal/devices.h>
- +
- + #include <proto/exec.h>
- + #include <proto/dos.h>
- +
- + #include "amiga.h"
- +
- + static struct MsgPort *SerReadPort;
- + static struct IOExtSer *SerReadRequest, *SerWriteRequest;
- + static char ser_inbuf[2];
- + char *far serial_device = "serial.device";
- + long far serial_unit;
- +
- + void init_amiga_serial(void)
- + {
- + if ((SerWriteRequest = (struct IOExtSer *)
- + _device_open(serial_device, serial_unit, 0L,
- + 0L, 0, sizeof(struct IOExtSer))) &&
- + (SerReadPort = CreateMsgPort()) &&
- + (SerReadRequest = (struct IOExtSer *)CreateIORequest(SerReadPort, sizeof (struct IOExtSer))))
- + {
- + SerReadRequest->IOSer.io_Device = SerWriteRequest->IOSer.io_Device;
- + SerReadRequest->IOSer.io_Unit = SerWriteRequest->IOSer.io_Unit;
- + ser_inbuf[1]=0;
- + SerReadRequest->IOSer.io_Command = CMD_READ;
- + SerWriteRequest->IOSer.io_Command = CMD_WRITE;
- + SerReadRequest->IOSer.io_Length = 1;
- + SerReadRequest->IOSer.io_Data = &ser_inbuf[0];
- + SendIO(SerReadRequest);
- +
- + inputsig |= 1L << SerReadPort->mp_SigBit;
- + }
- + else _fail("No memory or serial.device missing");
- + }
- +
- + void cleanup_amiga_serial(void)
- + {
- + if (SerReadRequest)
- + {
- + AbortIO(SerReadRequest);
- + WaitIO(SerReadRequest);
- + DeleteIORequest(SerReadRequest);
- + }
- + if (SerReadPort) DeletePort(SerReadPort);
- + _device_close(SerWriteRequest);
- + }
- +
- + void check_serial(int force)
- + {
- + while (CheckIO(SerReadRequest))
- + {
- + int c = ser_inbuf[0];
- + SendIO(SerReadRequest);
- + enque(c, FALSE);
- + }
- + }
- +
- + void serial_puts(char *str, int len)
- + {
- +
- + SerWriteRequest->IOSer.io_Length = len;
- + SerWriteRequest->IOSer.io_Data = str;
- + DoIO(SerWriteRequest);
- + }
- +
- + unsigned long serial_baud_rate(void)
- + {
- + return SerWriteRequest->io_Baud;
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_sysdep.c emacs-18.59-amiga/src/amiga_sysdep.c
- *** emacs-18.59-fsf/src/amiga_sysdep.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_sysdep.c Sat Jun 5 11:39:12 1993
- ***************
- *** 0 ****
- --- 1,375 ----
- + /* Interfaces to system-dependent kernel and library entries.
- + Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY. No author or distributor
- + accepts responsibility to anyone for the consequences of using it
- + or for whether it serves any particular purpose or works at all,
- + unless he says so in writing. Refer to the GNU Emacs General Public
- + License for full details.
- +
- + Everyone is granted permission to copy, modify and redistribute
- + GNU Emacs, but only under the conditions described in the
- + GNU Emacs General Public License. A copy of this license is
- + supposed to have been given to you along with GNU Emacs so you
- + can know your rights and responsibilities. It should be in a
- + file named COPYING. Among other things, the copyright notice
- + and this notice must be preserved on all copies. */
- +
- + #include <exec/types.h>
- + #include <dos/dos.h>
- + #include <dos/dosextens.h>
- + #include <dos/var.h>
- + #include <exec/execbase.h>
- + #include <exec/tasks.h>
- + #include <utility/tagitem.h>
- + #include <workbench/startup.h>
- + #include <workbench/workbench.h>
- + #include <proto/exec.h>
- + #include <proto/dos.h>
- + #include <proto/icon.h>
- +
- + #include <string.h>
- + #include <ios1.h>
- + #include <stdio.h>
- + #include <sys/types.h>
- + #include <sys/stat.h>
- + #include <signal.h>
- + #include <setjmp.h>
- + #include <unistd.h>
- + #include <internal/vars.h>
- +
- + #undef LONGBITS
- + #undef NULL
- + #include "config.h"
- + #include "lisp.h"
- + #include "emacssignal.h"
- +
- + #define min(x,y) ((x) > (y) ? (y) : (x))
- +
- + #include "termhooks.h"
- + #include "termchar.h"
- + #include "termopts.h"
- + #include "dispextern.h"
- + #include "amiga.h"
- +
- + #define EMACS_TOOL_SIZE 128 /* Room for path to emacs executable */
- +
- + struct Library *IconBase;
- + extern struct ExecBase *SysBase;
- +
- + /*long __stack = 40000;*/ /* Minimum stack size, used by c.o */
- + int amiga_process_stack_size;
- +
- + int amiga_initialized;
- + int amiga_create_icons; /* If true, we create icons when saving files */
- + enum exit_method amiga_fail_exit = use_xcexit;
- + int selecting;
- +
- + /* Emacs sysdep routines */
- + /* --------------------- */
- +
- + set_exclusive_use(int fd) {}
- +
- + /* Suspend the Emacs process; give terminal to its superior. */
- + sys_suspend()
- + {
- + /* This could have been iconify, but:
- + a) Not good for serial lines.
- + b) emacs stays active while iconified */
- + }
- +
- + char *get_system_name()
- + {
- + static char sysname[32];
- +
- + gethostname(sysname, sizeof sysname);
- + return sysname;
- + }
- +
- + /*
- + * flush any pending output
- + * (may flush input as well; it does not matter the way we use it)
- + */
- +
- + flush_pending_output (channel)
- + int channel;
- + {
- + }
- +
- + wait_for_termination (pid)
- + int pid;
- + {
- + while (1)
- + {
- + sigsetmask (sigmask (SIGCHLD));
- + if (0 > kill (pid, 0))
- + {
- + sigsetmask (SIGEMPTYMASK);
- + break;
- + }
- + sigpause (SIGEMPTYMASK);
- + }
- + }
- +
- + /* A few general amiga support routines */
- + /* ------------------------------------ */
- +
- + char *expand_path(char *path, char *buf, int len)
- + {
- + BPTR dirlock;
- + APTR window;
- +
- + window = _us->pr_WindowPtr;
- + _us->pr_WindowPtr = (APTR)-1;
- + dirlock = Lock(path, ACCESS_READ);
- + _us->pr_WindowPtr = window;
- + if (dirlock) /* Expand lock name */
- + {
- + if (!NameFromLock(dirlock, buf, len)) buf = 0;
- + UnLock(dirlock);
- + return buf;
- + }
- + return 0;
- + }
- +
- + #undef select
- + int emacs_select(int nfds, int *rfds, int *wfds, int *efds, struct timeval *timeout)
- + {
- + int ret;
- +
- + selecting = TRUE;
- + ret = select(nfds, rfds, wfds, efds, timeout);
- + selecting = FALSE;
- + return ret;
- + }
- +
- + void no_memory(void)
- + {
- + _fail("No memory");
- + }
- +
- + char *amiga_path(void)
- + {
- + char *path, *pp, name[128];
- + int pathsize;
- + struct CommandLineInterface *cli;
- + BPTR lock;
- + long l, *lp, nlen;
- +
- + pathsize = 128;
- + path = (char *)xmalloc(pathsize);
- +
- + strcpy(path, ".");
- + pp = path + 1;
- +
- + if (!(cli = (struct CommandLineInterface *)((long)_us->pr_CLI << 2)))
- + return path;
- +
- + l = (long)cli->cli_CommandDir;
- + while (l) {
- + *pp++ = ',';
- + l <<= 2;
- + lp = (long *)l;
- + lock = (BPTR)*(lp + 1);
- + NameFromLock(lock, name, 128);
- + nlen = strlen(name);
- + if (pp + nlen + 5 >= path + pathsize)
- + {
- + char *newpath;
- +
- + pathsize = 2 * pathsize + nlen;
- + newpath = (char *)xrealloc(path, pathsize);
- + pp = newpath + (pp - path);
- + path = newpath;
- + }
- + memcpy(pp, name, nlen);
- + pp += nlen;
- + l = *lp;
- + }
- + /* Use of +5 above guarantees that there is enough space for c: */
- + strcpy(pp, ",c:");
- +
- + return path;
- + }
- +
- + /* Some general amiga commands */
- + /* --------------------------- */
- +
- + #define emacs_file_icon_width 54
- + #define emacs_file_icon_height 22
- + #define emacs_file_icon_num_planes 2
- +
- + static UWORD chip emacs_file_icon_data[2][22][4] = {
- + {
- + 0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0c00,
- + 0x0000,0x0000,0x0000,0x0c00,0x07ff,0xffff,0xffe0,0x0c00,
- + 0x0400,0x0000,0x0030,0x0c00,0x0400,0x0000,0x0028,0x0c00,
- + 0x04ff,0xffff,0xfe24,0x0c00,0x0400,0x0000,0x0022,0x0c00,
- + 0x04ff,0xffff,0xfe3f,0x0c00,0x0400,0x0000,0x0000,0x8c00,
- + 0x04ff,0xffc0,0x0000,0x8c00,0x0400,0x0000,0x0000,0x8c00,
- + 0x0400,0x0000,0x0000,0x8c00,0x0400,0x0000,0x0000,0x8c00,
- + 0x04ff,0xffff,0xfe00,0x8c00,0x0400,0x0000,0x0000,0x8c00,
- + 0x04ff,0xffff,0xfe00,0x8c00,0x0400,0x0000,0x0000,0x8c00,
- + 0x07ff,0xffff,0xffff,0x8c00,0x0000,0x0000,0x0000,0x0c00,
- + 0x0000,0x0000,0x0000,0x0c00,0x7fff,0xffff,0xffff,0xfc00
- + },
- + {
- + 0xffff,0xffff,0xffff,0xf800,0x8000,0x0000,0x0000,0x0000,
- + 0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,
- + 0x83ff,0xffff,0xffc0,0x0000,0x83ff,0xffff,0xffd0,0x0000,
- + 0x8300,0x0000,0x01d8,0x0000,0x83ff,0xffff,0xffdc,0x0000,
- + 0x8300,0x0000,0x01c0,0x0000,0x83ff,0xffff,0xffff,0x0000,
- + 0x8300,0x003f,0xffff,0x0000,0x83ff,0xffff,0xffff,0x0000,
- + 0x83ff,0xffff,0xffff,0x0000,0x83ff,0xffff,0xffff,0x0000,
- + 0x8300,0x0000,0x01ff,0x0000,0x83ff,0xffff,0xffff,0x0000,
- + 0x8300,0x0000,0x01ff,0x0000,0x83ff,0xffff,0xffff,0x0000,
- + 0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,
- + 0x8000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000
- + },
- + };
- + struct Image far emacs_file_icon_image = {
- + 0, 0,
- + emacs_file_icon_width, emacs_file_icon_height, emacs_file_icon_num_planes,
- + (UWORD *)emacs_file_icon_data,
- + 3, 0,
- + 0
- + };
- +
- + static char *far emacs_file_tooltypes[] = {
- + "FILETYPE=TEXT",
- + 0
- + };
- +
- + static char far emacs_tool[EMACS_TOOL_SIZE];
- +
- + static struct DiskObject far emacs_file_icon_object = {
- + WB_DISKMAGIC, WB_DISKVERSION,
- + { 0, 0, 0, emacs_file_icon_width, emacs_file_icon_height,
- + GFLG_GADGIMAGE | GADGBACKFILL, GACT_IMMEDIATE | GACT_RELVERIFY, GTYP_BOOLGADGET,
- + (APTR)&emacs_file_icon_image },
- + WBPROJECT, emacs_tool, emacs_file_tooltypes,
- + NO_ICON_POSITION, NO_ICON_POSITION,
- + 0, 0,
- + 40000 /* Stack size for emacs */
- + };
- +
- + DEFUN ("amiga-put-icon", Famiga_put_icon, Samiga_put_icon, 2, 2, 0,
- + "Create an icon for FILE.\n\
- + If FORCE is non-nil create it unconditionally, otherwise only if one doesn't exist.\n\
- + Returns t if an icon was created, nil otherwise.")
- + (file, force)
- + Lisp_Object file, force;
- + {
- + char *fname;
- + struct DiskObject *obj;
- +
- + CHECK_STRING(file, 0);
- + fname = XSTRING(file)->data;
- +
- + if (NULL (force) && (obj = GetDiskObject(fname)))
- + {
- + /* Icon exists, don't overwrite */
- + FreeDiskObject(obj);
- + return Qnil;
- + }
- + emacs_file_icon_object.do_StackSize = _stack_size;
- + if (PutDiskObject(fname, &emacs_file_icon_object)) return Qt;
- + error("Icon for %s couldn't be created", fname);
- + }
- +
- + /* Amiga initialisation routines */
- + /* ----------------------------- */
- +
- + syms_of_amiga ()
- + {
- + DEFVAR_BOOL("amiga-initialized", &amiga_initialized, "");
- + DEFVAR_INT("amiga-malloc-bytes-used", &malloc_bytes_used,
- + "Number of malloc bytes used when emacs was dumped");
- + DEFVAR_BOOL("amiga-create-icons", &amiga_create_icons,
- + "If non-nil, create icons when saving files.");
- + defsubr(&Samiga_put_icon);
- + amiga_process_stack_size = 0;
- + DEFVAR_INT("amiga-process-stack-size", &amiga_process_stack_size,
- + "Size of stack for called processes. 0 means same size as emacs stack.");
- + syms_of_amiga_tty();
- + syms_of_amiga_menu();
- + syms_of_amiga_clipboard();
- + }
- +
- + static void amiga_early_init(int *_argc, char ***_argv)
- + {
- + int argc = *_argc;
- + char **argv = *_argv;
- +
- + if (argc > 2 && !strcmp(argv[1], "-pure"))
- + {
- + puresize = atoi(argv[2]);
- + argc -= 2; argv += 2;
- + }
- + if (argc > 2 && !strcmp(argv[1], "-malloc"))
- + {
- + malloc_hunk_size = atoi(argv[2]);
- + argc -= 2; argv += 2;
- + }
- + if (argc > 2 && !strcmp(argv[1], "-prealloc"))
- + {
- + pre_alloc = atoi(argv[2]);
- + argc -= 2; argv += 2;
- + }
- + /* Handle the -dev switch, which specifies device & unit to use as terminal */
- + if (argc > 3 && !strcmp (argv[1], "-dev"))
- + {
- + extern char *far serial_device;
- + extern long far serial_unit;
- +
- + serial_device = argv[2];
- + serial_unit = atoi(argv[3]);
- + fprintf (stderr, "Using %s (unit %d)\n", serial_device ,serial_unit);
- + argc -= 3; argv += 3;
- + }
- + /* Patch real argc, argv to hide arguments we used */
- + argv[0] = (*_argv)[0];
- + *_argv = argv;
- + *_argc = argc;
- +
- + expand_path(argv[0], emacs_tool, EMACS_TOOL_SIZE);
- + }
- +
- + void cleanup_amiga(void)
- + {
- + cleanup_clipboard();
- + cleanup_amiga_tty();
- + if (IconBase) CloseLibrary(IconBase);
- + }
- +
- + void amiga_undump_reinit(void)
- + /* Post-undump initialisation */
- + {
- + extern struct WBStartup *_WBenchMsg;
- +
- + emacs_malloc_init();
- + early_amiga_tty();
- + early_clipboard();
- +
- + if (!onexit(cleanup_amiga)) _fail("Internal problem with onexit");
- +
- + make_environ();
- + IconBase = OpenLibrary("icon.library", 0);
- + if (!IconBase) _fail("Need icon.library");
- + amiga_create_icons = _WBenchMsg != 0;
- +
- + init_amiga_tty(); init_clipboard();
- + }
- +
- + #undef main
- + main(int argc, char **argv)
- + /* Effect: Call emacs_main after doing some early amiga initialisation for emacs.
- + */
- + {
- + /* This initialisation may steal some command line options */
- + amiga_early_init(&argc, &argv);
- + emacs_main(argc, argv);
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_term.c emacs-18.59-amiga/src/amiga_term.c
- *** emacs-18.59-fsf/src/amiga_term.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_term.c Tue Mar 23 09:45:12 1993
- ***************
- *** 0 ****
- --- 1,388 ----
- + /* Amiga terminal control routines.
- + Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is free software; you can redistribute it and/or modify
- + it under the terms of the GNU General Public License as published by
- + the Free Software Foundation; either version 1, or (at your option)
- + any later version.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + GNU General Public License for more details.
- +
- + You should have received a copy of the GNU General Public License
- + along with GNU Emacs; see the file COPYING. If not, write to
- + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
- +
- +
- + #include <stdio.h>
- + #include <ctype.h>
- + #include "config.h"
- + #include "termhooks.h"
- + #include "termchar.h"
- + #include "termopts.h"
- +
- + /* internal state */
- +
- + /* nonzero means supposed to write text in standout mode. */
- + static int standout_requested;
- +
- + static int standout_mode; /* Nonzero when in standout mode. */
- +
- + static char tens[100] = {
- + '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
- + '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
- + '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
- + '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
- + '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
- + '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
- + '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
- + '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
- + '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
- + '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
- + };
- +
- + static char ones[100] = {
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- + };
- +
- + #define addnum(str, num) if (num < 100) \
- + { *--str = ones[num]; *--str = tens[num]; } \
- + else do { *--str = '0' + num % 10; num /= 10; } while (num != 0)
- +
- + static background_highlight ();
- + static turn_off_highlight ();
- +
- +
- + /* Cursor motion stuff (from cm.c) */
- + static int curX, curY;
- +
- + /* Move to absolute position, specified origin 0 */
- +
- + Amove_cursor (row, col)
- + {
- + char buf[32], *pos = buf + 32;
- +
- + if (curY == row && curX == col)
- + return;
- +
- + curX = col; curY = row;
- + *--pos = 'H';
- + col = col + 1; row = row + 1;
- + addnum(pos, col);
- + *--pos = ';';
- + addnum(pos, row);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + if (pos < buf) abort();
- + }
- +
- +
- + Aring_bell ()
- + {
- + emacs_output("\07", 1);
- + }
- +
- + Aset_terminal_modes ()
- + {
- + }
- +
- + Areset_terminal_modes ()
- + {
- + turn_off_highlight ();
- + }
- +
- + Aupdate_begin ()
- + {
- + /* Hide cursor */
- + emacs_output("\x9b\x30\x20\x70", 4);
- + }
- +
- + Aupdate_end ()
- + {
- + background_highlight ();
- + standout_requested = 0;
- + emacs_output("\x9b\x20\x70", 3); /* Show cursor */
- + }
- +
- +
- + /* Handle highlighting when TN_standout_width (termcap sg) is not specified.
- + In these terminals, output is affected by the value of standout
- + mode when the output is written.
- +
- + These functions are called on all terminals, but do nothing
- + on terminals whose standout mode does not work that way. */
- +
- + static turn_off_highlight ()
- + {
- + if (standout_mode)
- + {
- + extern int background, foreground;
- + extern int inverse_fill_pen, inverse_text_pen;
- + int b = background + 40, f = foreground + 30;
- + if(inverse_fill_pen < 8 && inverse_text_pen < 8)
- + {
- + char buf[32], *pos = buf + 32;
- + /* UnDo inverse fill */
- + *--pos = '\0';
- + *--pos = 'm';
- + addnum(pos, b);
- + *--pos = ';';
- + /* UnDo inverse text */
- + addnum(pos, f);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + }
- + else
- + {
- + emacs_output("\x9b""27m", 4);
- + }
- + }
- + standout_mode = 0;
- + }
- +
- + static turn_on_highlight ()
- + {
- + if (!standout_mode)
- + {
- + extern int inverse_fill_pen, inverse_text_pen;
- + int b = inverse_fill_pen + 40, f = inverse_text_pen + 30;
- + if(inverse_fill_pen < 8 && inverse_text_pen < 8)
- + {
- + char buf[32], *pos = buf + 32;
- + /* Do inverse fill */
- + *--pos = '\0';
- + *--pos = 'm';
- + addnum(pos, b);
- + *--pos = ';';
- +
- + /* Do inverse text */
- + addnum(pos, f);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + }
- + else
- + {
- + emacs_output("\x9b\x37m", 3);
- + }
- + }
- + standout_mode = 1;
- + }
- +
- + /* Set standout mode to the state it should be in for
- + empty space inside windows. What this is,
- + depends on the user option inverse-video. */
- +
- + static background_highlight ()
- + {
- + if (inverse_video)
- + turn_on_highlight ();
- + else
- + turn_off_highlight ();
- + }
- +
- + /* Set standout mode to the mode specified for the text to be output. */
- +
- + static
- + highlight_if_desired ()
- + {
- + if (!inverse_video == !standout_requested)
- + turn_off_highlight ();
- + else
- + turn_on_highlight ();
- + }
- +
- + /* External interface to control of standout mode.
- + Call this when about to modify line at position VPOS
- + and not change whether it is highlighted. */
- +
- + Areassert_line_highlight (highlight, vpos)
- + int highlight;
- + int vpos;
- + {
- + standout_requested = highlight;
- + }
- +
- + /* Call this when about to modify line at position VPOS
- + and change whether it is highlighted. */
- +
- + Achange_line_highlight (new_highlight, vpos, first_unused_hpos)
- + int new_highlight, vpos, first_unused_hpos;
- + {
- + standout_requested = new_highlight;
- +
- + move_cursor (vpos, 0);
- +
- + background_highlight ();
- + clear_end_of_line (first_unused_hpos);
- + reassert_line_highlight (new_highlight, curY);
- + }
- +
- + /* Erase operations */
- +
- + /* clear from cursor to end of screen */
- + Aclear_to_end ()
- + {
- + background_highlight ();
- + emacs_output("\x9bJ", 2);
- + }
- +
- + /* Clear entire screen */
- +
- + Aclear_screen ()
- + {
- + background_highlight ();
- + emacs_output("\f", 1);
- + curX = curY = 0;
- + }
- +
- + /* Clear to end of line, but do not clear any standout marker.
- + Assumes that the cursor is positioned at a character of real text,
- + which implies it cannot be before a standout marker
- + unless the marker has zero width.
- +
- + Note that the cursor may be moved. */
- +
- + Aclear_end_of_line (first_unused_hpos)
- + int first_unused_hpos;
- + {
- + if (curX >= first_unused_hpos)
- + return;
- +
- + background_highlight ();
- + emacs_output("\x9bK", 2);
- + }
- +
- + Aoutput_chars (string, len)
- + register char *string;
- + int len;
- + {
- + highlight_if_desired ();
- +
- + curX += len;
- + emacs_output(string, len);
- + }
- +
- + /* If start is zero, insert blanks instead of a string at start */
- +
- + Ainsert_chars (start, len)
- + register char *start;
- + int len;
- + {
- + char buf[32], *pos = buf + 32;
- +
- + highlight_if_desired ();
- +
- + *--pos = '@';
- + addnum(pos, len);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + if (pos < buf) abort();
- + if (start) emacs_output(start, len);
- + }
- +
- + Adelete_chars (n)
- + register int n;
- + {
- + char buf[32], *pos = buf + 32;
- +
- + *--pos = 'P';
- + addnum(pos, n);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + if (pos < buf) abort();
- + }
- +
- + /* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
- +
- + Ains_del_lines (vpos, n)
- + int vpos, n;
- + {
- + register int i = n > 0 ? n : -n;
- + char buf[32], *pos = buf + 32;
- +
- + if (n > 0)
- + {
- + i = n;
- + *--pos = 'L';
- + }
- + else
- + {
- + i = -n;
- + *--pos = 'M';
- + }
- + if (vpos + i >= screen_height) return;
- +
- + move_cursor (vpos, 0);
- + background_highlight ();
- + addnum(pos, i);
- + *--pos = 0x9b;
- + emacs_output(pos, buf + 32 - pos);
- + if (pos < buf) abort();
- + }
- +
- + Acalculate_costs (extra, costvec, ncostvec)
- + int extra;
- + int *costvec, *ncostvec;
- + {
- + CalcLID(2, 40, extra, 0, costvec, ncostvec);
- + }
- +
- + Aset_terminal_window (size)
- + int size;
- + {
- + }
- +
- +
- + amiga_term_init ()
- + {
- + must_write_spaces = FALSE;
- + min_padding_speed = 0;
- + memory_below_screen = FALSE;
- + meta_key = TRUE;
- + scroll_region_ok = FALSE;
- + line_ins_del_ok = FALSE; /* much cleaner display when FALSE -ch3/19/93. */
- + char_ins_del_ok = FALSE;
- + fast_clear_end_of_line = TRUE;
- + no_redraw_on_reenter = FALSE;
- +
- + clear_screen_hook = Aclear_screen;
- + clear_end_of_line_hook = Aclear_end_of_line;
- + clear_to_end_hook = Aclear_to_end;
- + ins_del_lines_hook = Ains_del_lines;
- + change_line_highlight_hook = Achange_line_highlight;
- + insert_chars_hook = Ainsert_chars;
- + output_chars_hook = Aoutput_chars;
- + delete_chars_hook = Adelete_chars;
- + ring_bell_hook = Aring_bell;
- + reset_terminal_modes_hook = Areset_terminal_modes;
- + set_terminal_modes_hook = Aset_terminal_modes;
- + update_begin_hook = Aupdate_begin;
- + update_end_hook = Aupdate_end;
- + set_terminal_window_hook = Aset_terminal_window;
- + move_cursor_hook = Amove_cursor;
- + reassert_line_highlight_hook = Areassert_line_highlight;
- +
- + dont_calculate_costs = 1;
- + calculate_costs_hook = Acalculate_costs;
- +
- + /* Get screen size from system, or else from somewhere ... */
- + get_screen_size (&screen_width, &screen_height);
- + /* Random defaults to avoid any problems */
- + if (screen_width <= 0) screen_width = 80;
- + if (screen_height <= 0) screen_height = 23;
- +
- + init_baud_rate ();
- + }
- diff -rcP emacs-18.59-fsf/src/amiga_tty.c emacs-18.59-amiga/src/amiga_tty.c
- *** emacs-18.59-fsf/src/amiga_tty.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/amiga_tty.c Sat Jun 5 13:20:50 1993
- ***************
- *** 0 ****
- --- 1,305 ----
- + #include "config.h"
- + #undef NULL
- + #include "lisp.h"
- + #include "termchar.h"
- +
- + #include <stdio.h>
- + #include <errno.h>
- + #include <internal/files.h>
- + #include <internal/vars.h>
- +
- + #undef LONGBITS
- +
- + #include <exec/types.h>
- + #include <dos/dos.h>
- + #include <proto/exec.h>
- +
- + #include "amiga.h"
- + #include "termhooks.h"
- +
- + static int term_initialised;
- + ULONG inputsig;
- +
- + /* A few tty system dependent routines unused on the Amiga */
- +
- + setpgrp_of_tty(int pid) {}
- + init_sigio() {}
- + reset_sigio() {}
- + request_sigio() {}
- + unrequest_sigio() {}
- +
- + /* Return nonzero if safe to use tabs in output.
- + At the time this is called, init_sys_modes has not been done yet. */
- +
- + tabs_safe_p()
- + {
- + if (noninteractive)
- + return 1;
- +
- + return 0; /* Not safe on Amiga !? */
- + }
- +
- + /* Get terminal size from system.
- + Store number of lines into *heightp and width into *widthp.
- + If zero or a negative number is stored, the value is not valid. */
- +
- + get_screen_size (widthp, heightp)
- + int *widthp, *heightp;
- + {
- + if (term_initialised && !inhibit_window_system)
- + get_window_size(widthp, heightp);
- + else /* We don't known what size the terminal is */
- + {
- + *widthp = 0;
- + *heightp = 0;
- + }
- + }
- +
- + init_baud_rate ()
- + {
- + if (noninteractive || !term_initialised) baud_rate = 1200;
- + else if (!inhibit_window_system) baud_rate = 38400;
- + else baud_rate = serial_baud_rate();
- + }
- +
- + void check_intuition ()
- + {
- + if (noninteractive || inhibit_window_system)
- + error ("You aren't using a window.");
- + }
- +
- + #define TTYBUFSIZE 256 /* Same size as kbd_buffer */
- + static char ttybuf[TTYBUFSIZE];
- + static int tty_count;
- + #define TTYPUT(c) { if (tty_count < TTYBUFSIZE) ttybuf[tty_count++] = c; }
- +
- + static int interrupt_char;
- +
- + void enque(unsigned int c, int meta)
- + /* place input keys in keyboard buffer
- + If high bit is set, precede character with ^Q (hack).
- + If meta is true, set high bit.
- + If both the high bit & meta are true, we have a problem. Ignore it.
- + If c == AMIGASEQ (256) enqueue the amiga sequence introducer (C-x C-^)
- + */
- + {
- + /* Hack CSI to be AMIGASEQ (to allow defining function keys, etc) */
- + if (c == 0233 || c == AMIGASEQ)
- + {
- + TTYPUT('x' & 037);
- + TTYPUT('^' & 037);
- + }
- + else if (c >= 0200) /* Special character, precede with ^Q */
- + {
- + TTYPUT('q' & 037);
- + TTYPUT(c);
- + }
- + else
- + {
- + if (meta) c |= 0200;
- + if (c == interrupt_char) Signal(_us, SIGBREAKF_CTRL_C);
- + else TTYPUT(c);
- + }
- + }
- +
- + int get_ttycount(void)
- + {
- + return tty_count;
- + }
- +
- + init_sys_modes ()
- + {
- + extern int quit_char;
- +
- + if (noninteractive)
- + return;
- +
- + if (inhibit_window_system) clear_screen();
- +
- + interrupt_char = quit_char;
- + if (!inhibit_window_system) setup_intchar(interrupt_char);
- + }
- +
- + reset_sys_modes ()
- + {
- + if (noninteractive)
- + {
- + fflush (stdout);
- + return;
- + }
- + move_cursor (screen_height - 1, 0);
- + clear_end_of_line (screen_width);
- + /* clear_end_of_line may move the cursor */
- + move_cursor (screen_height - 1, 0);
- + }
- +
- + void amiga_consume_input(void)
- + {
- + extern int this_command_key_count;
- + int force = this_command_key_count == 0;
- + /* If force is TRUE & some non-keyboard (eg mouse events) input is pending,
- + insert the appropriate magic sequence in the input stream */
- +
- + if (term_initialised)
- + {
- + if (!inhibit_window_system) check_window(force);
- + else check_serial(force);
- + check_arexx(force, TRUE);
- + }
- + }
- +
- + discard_tty_input ()
- + {
- + if (noninteractive)
- + return;
- +
- + amiga_consume_input();
- + tty_count = 0;
- + chkabort();
- + }
- +
- + /* Code for the fd describing the emacs input (terminal or window) */
- +
- + static ULONG __regargs ttyin_select_start(void *userinfo, int rd, int wr)
- + {
- + if (!inhibit_window_system) force_window();
- +
- + return tty_count ? -1 : inputsig;
- + }
- +
- + static void __regargs ttyin_select_poll(void *userinfo, int *rd, int *wr)
- + {
- + amiga_consume_input();
- + if (!tty_count) *rd = 0;
- + }
- +
- + static int __regargs ttyin_read(void *userinfo, void *buffer, unsigned int length)
- + {
- + amiga_consume_input();
- + if (length > tty_count) length = tty_count;
- + memcpy(buffer, ttybuf, length);
- + tty_count -= length;
- + if (tty_count) memmove(ttybuf, ttybuf + length, tty_count - length);
- +
- + return (int)length;
- + }
- +
- + static int __regargs ttyin_write(void *userinfo, void *buffer, unsigned int length)
- + {
- + errno = EACCES;
- + return -1;
- + }
- +
- + static int __regargs ttyin_lseek(void *userinfo, long rpos, int mode)
- + {
- + errno = ESPIPE;
- + return -1;
- + }
- +
- + static int __regargs ttyin_close(void *userinfo, int internal)
- + {
- + return 0;
- + }
- +
- + static int __regargs ttyin_ioctl(void *userinfo, int request, void *data)
- + {
- + errno = EINVAL;
- + return -1;
- + }
- +
- + #define CBUFSIZE 1024
- + #undef fwrite
- + #undef fflush
- +
- + char cbuffer[CBUFSIZE + 16], *cbuffer_pos;
- +
- + int emacs_fflush(FILE *f)
- + {
- + if (noninteractive || f != stdout) return fflush(f);
- + else
- + {
- + int len;
- +
- + len = cbuffer_pos - cbuffer;
- + if (term_initialised)
- + if (!inhibit_window_system) screen_puts(cbuffer, len);
- + else serial_puts(cbuffer, len);
- + if (termscript) fwrite (cbuffer, 1, len, termscript);
- + cbuffer_pos = cbuffer;
- +
- + return 0;
- + }
- + }
- +
- + void emacs_putchar(int c)
- + {
- + if (cbuffer_pos >= cbuffer + CBUFSIZE) emacs_fflush(stdout);
- + *cbuffer_pos++ = c;
- + }
- +
- + void emacs_output(char *str, int size)
- + {
- + if (cbuffer_pos + size > cbuffer + CBUFSIZE) emacs_fflush(stdout);
- + if (size > CBUFSIZE)
- + {
- + if (term_initialised)
- + if (!inhibit_window_system) screen_puts(str, size);
- + else serial_puts(str, size);
- + }
- + else
- + {
- + memcpy(cbuffer_pos, str, size);
- + cbuffer_pos += size;
- + }
- + }
- +
- + void emacs_fwrite(char *str, unsigned int nblocks, unsigned int len, FILE *f)
- + {
- + if (noninteractive || f != stdout) fwrite (str, nblocks, len, f);
- + else
- + {
- + unsigned int size;
- +
- + if (nblocks == 1) size = len; /* Emacs always uses 1 "block" */
- + else size = nblocks * len;
- +
- + emacs_output(str, size);
- + }
- + }
- +
- + void syms_of_amiga_tty(void)
- + {
- + syms_of_amiga_screen();
- + syms_of_amiga_rexx();
- + }
- +
- + void init_amiga_tty()
- + {
- + inputsig = 0;
- + term_initialised = FALSE;
- + init_amiga_rexx();
- + }
- +
- + void cleanup_amiga_tty()
- + {
- + cleanup_amiga_rexx();
- + cleanup_amiga_serial();
- + cleanup_amiga_screen();
- + }
- +
- + void early_amiga_tty()
- + {
- + cbuffer_pos = cbuffer;
- + tty_count = 0;
- + }
- +
- + void amiga_term_open(void)
- + {
- + inhibit_window_system ? init_amiga_serial() : init_amiga_screen();
- + close(0);
- + if (_alloc_fd((void *)1, FI_READ, ttyin_select_start, ttyin_select_poll, ttyin_read,
- + ttyin_write, ttyin_lseek, ttyin_close, ttyin_ioctl) == 0)
- + term_initialised = TRUE;
- + else _fail("Failed to initialise I/O, no memory ?");
- + }
- +
- diff -rcP emacs-18.59-fsf/src/buffer.c emacs-18.59-amiga/src/buffer.c
- *** emacs-18.59-fsf/src/buffer.c Wed May 13 19:39:33 1992
- --- emacs-18.59-amiga/src/buffer.c Sun Nov 22 10:13:24 1992
- ***************
- *** 1137,1143 ****
- #ifndef VMS
- /* Maybe this should really use some standard subroutine
- whose definition is filename syntax dependent. */
- ! if (buf[strlen (buf) - 1] != '/')
- strcat (buf, "/");
- #endif /* not VMS */
- current_buffer->directory = build_string (buf);
- --- 1137,1147 ----
- #ifndef VMS
- /* Maybe this should really use some standard subroutine
- whose definition is filename syntax dependent. */
- ! if (buf[strlen (buf) - 1] != '/'
- ! #ifdef AMIGA
- ! && buf[strlen (buf) -1] != ':'
- ! #endif /*AMIGA */
- ! )
- strcat (buf, "/");
- #endif /* not VMS */
- current_buffer->directory = build_string (buf);
- diff -rcP emacs-18.59-fsf/src/callproc.c emacs-18.59-amiga/src/callproc.c
- *** emacs-18.59-fsf/src/callproc.c Sun Jul 12 03:26:01 1992
- --- emacs-18.59-amiga/src/callproc.c Sun Nov 22 10:13:32 1992
- ***************
- *** 124,134 ****
- CHECK_STRING (args[0], 0);
-
- if (nargs <= 1 || NULL (args[1]))
- ! #ifdef VMS
- ! args[1] = build_string ("NLA0:");
- ! #else
- ! args[1] = build_string ("/dev/null");
- ! #endif /* not VMS */
- else
- args[1] = Fexpand_file_name (args[1], current_buffer->directory);
-
- --- 124,130 ----
- CHECK_STRING (args[0], 0);
-
- if (nargs <= 1 || NULL (args[1]))
- ! args[1] = build_string (PATH_NULL);
- else
- args[1] = Fexpand_file_name (args[1], current_buffer->directory);
-
- ***************
- *** 177,186 ****
-
- if (XTYPE (buffer) == Lisp_Int)
- #ifdef VMS
- ! fd[1] = open ("NLA0:", 0), fd[0] = -1;
- #else
- ! fd[1] = open ("/dev/null", O_WRONLY), fd[0] = -1;
- ! #endif /* not VMS */
- else
- {
- pipe (fd);
- --- 173,181 ----
-
- if (XTYPE (buffer) == Lisp_Int)
- #ifdef VMS
- ! fd[1] = open (PATH_NULL, 0), fd[0] = -1;
- #else
- ! fd[1] = open (PATH_NULL, O_WRONLY), fd[0] = -1;
- else
- {
- pipe (fd);
- ***************
- *** 193,198 ****
- --- 188,209 ----
- synch_process_death = 0;
- synch_process_retcode = 0;
-
- + #ifdef AMIGA
- + {
- + register unsigned char *temp;
- +
- + if (XTYPE (current_buffer->directory) == Lisp_String)
- + {
- + register int i;
- +
- + i = XSTRING (current_buffer->directory)->size;
- + temp = (unsigned char *) alloca (i + 1);
- + bcopy (XSTRING (current_buffer->directory)->data, temp, i);
- + temp[i] = 0;
- + }
- + pid = exec(new_argv[0], new_argv, filefd, fd[1], temp, amiga_process_stack_size);
- + }
- + #else
- {
- /* child_setup must clobber environ in systems with true vfork.
- Protect it from permanent change. */
- ***************
- *** 230,235 ****
- --- 241,247 ----
- close (filefd);
- close (fd1);
- }
- + #endif /* not AMIGA */
-
- if (pid < 0)
- {
- ***************
- *** 302,308 ****
- register Lisp_Object filename_string, start, end, status;
- char tempfile[20];
-
- ! strcpy (tempfile, "/tmp/emacsXXXXXX");
- mktemp (tempfile);
-
- filename_string = build_string (tempfile);
- --- 314,320 ----
- register Lisp_Object filename_string, start, end, status;
- char tempfile[20];
-
- ! strcpy (tempfile, PATH_TEMP);
- mktemp (tempfile);
-
- filename_string = build_string (tempfile);
- ***************
- *** 318,323 ****
- --- 330,336 ----
- unlink (tempfile);
- return status;
- }
- + #ifndef AMIGA
-
- /* This is the last thing run in a newly forked inferior
- either synchronous or asynchronous.
- ***************
- *** 425,430 ****
- --- 438,444 ----
- write (1, new_argv[0], strlen (new_argv[0]));
- _exit (1);
- }
- + #endif /* not AMIGA */
-
- init_callproc ()
- {
- ***************
- *** 437,442 ****
- --- 451,465 ----
- Vexec_path = decode_env_path (0, PATH_EXEC);
- Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path));
- Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
- + #ifdef AMIGA
- + {
- + char *amiga_path(), *apath = amiga_path();
- +
- + Vexec_path = nconc2 (decode_env_path (0, apath), Vexec_path);
- + Vexec_path = nconc2 (decode_env_path (0, "GNUEmacs:c"), Vexec_path);
- + free(apath);
- + }
- + #endif
-
- execdir = Fdirectory_file_name (Vexec_directory);
- if (access (XSTRING (execdir)->data, 0) < 0)
- ***************
- *** 447,453 ****
- }
-
- sh = (char *) egetenv ("SHELL");
- ! Vshell_file_name = build_string (sh ? sh : "/bin/sh");
-
- #ifndef MAINTAIN_ENVIRONMENT
- /* The equivalent of this operation was done
- --- 470,476 ----
- }
-
- sh = (char *) egetenv ("SHELL");
- ! Vshell_file_name = build_string (sh ? sh : PATH_SHELL);
-
- #ifndef MAINTAIN_ENVIRONMENT
- /* The equivalent of this operation was done
- diff -rcP emacs-18.59-fsf/src/dired.c emacs-18.59-amiga/src/dired.c
- *** emacs-18.59-fsf/src/dired.c Mon Mar 23 04:16:41 1992
- --- emacs-18.59-amiga/src/dired.c Sun Nov 22 10:13:54 1992
- ***************
- *** 385,391 ****
- --- 385,395 ----
-
- bcopy (XSTRING (dirname)->data, fullname, pos);
- #ifndef VMS
- + #ifdef AMIGA
- + if ((fullname[pos - 1] != '/')&&(fullname[pos - 1] != ':'))
- + #else
- if (fullname[pos - 1] != '/')
- + #endif
- fullname[pos++] = '/';
- #endif
-
- diff -rcP emacs-18.59-fsf/src/dispnew.c emacs-18.59-amiga/src/dispnew.c
- *** emacs-18.59-fsf/src/dispnew.c Fri Jul 24 19:31:36 1992
- --- emacs-18.59-amiga/src/dispnew.c Sun Nov 22 10:14:00 1992
- ***************
- *** 674,684 ****
- --- 674,700 ----
- int preempt_count = baud_rate / 2400 + 1;
- extern input_pending;
-
- + start_count(0);
- +
- if (screen_height == 0) abort (); /* Some bug zeros some core */
-
- if (force_redisplay)
- force = 1;
-
- + #ifdef FAST_DISPLAY
- + /* Don't compute for i/d line if just want cursor motion. */
- + /* Don't allow preemption, etc either */
- + for (i = 0; i < screen_height; i++)
- + if (new_screen->enable[i])
- + break;
- +
- + if (i >= screen_height)
- + {
- + update_begin();
- + goto update_done;
- + }
- + #endif
- +
- if (!force)
- detect_input_pending ();
- if (!force
- ***************
- *** 695,704 ****
- if (!line_ins_del_ok)
- inhibit_hairy_id = 1;
-
- /* Don't compute for i/d line if just want cursor motion. */
- for (i = 0; i < screen_height; i++)
- ! if (new_screen->enable)
- break;
-
- /* Try doing i/d line, if not yet inhibited. */
- if (!inhibit_hairy_id && i < screen_height)
- --- 711,722 ----
- if (!line_ins_del_ok)
- inhibit_hairy_id = 1;
-
- + #ifndef FAST_DISPLAY
- /* Don't compute for i/d line if just want cursor motion. */
- for (i = 0; i < screen_height; i++)
- ! if (new_screen->enable[i])
- break;
- + #endif
-
- /* Try doing i/d line, if not yet inhibited. */
- if (!inhibit_hairy_id && i < screen_height)
- ***************
- *** 742,747 ****
- --- 760,768 ----
- update_line (i);
- }
- }
- + #ifdef FAST_DISPLAY
- + update_done:
- + #endif
- pause = (i < screen_height - 1) ? i + 1 : 0;
-
- /* Now just clean up termcap drivers and set cursor, etc. */
- ***************
- *** 781,786 ****
- --- 802,808 ----
- }
-
- bzero (new_screen->enable, screen_height);
- + stop_count(0);
- return pause;
- }
-
- ***************
- *** 894,899 ****
- --- 916,972 ----
- else
- reassert_line_highlight (new_screen->highlight[vpos], vpos);
-
- + #ifdef FAST_DISPLAY
- + if (current_screen->enable[vpos])
- + {
- + obody = current_screen->contents[vpos];
- + olen = current_screen->used[vpos];
- + }
- + else olen = 0;
- +
- + nbody = new_screen->contents[vpos];
- + nlen = new_screen->used[vpos];
- +
- + /* Pretend trailing spaces are not there at all,
- + unless for one reason or another we must write all spaces. */
- + /* We know that the previous character byte contains 0. */
- + if (! new_screen->highlight[vpos])
- + {
- + if (!must_write_spaces)
- + while (nbody[nlen - 1] == ' ')
- + nlen--;
- + }
- + else
- + {
- + /* For an inverse-video line, give it extra trailing spaces
- + all the way to the screen edge
- + so that the reverse video extends all the way across. */
- + while (nlen < screen_width - 1)
- + nbody[nlen++] = ' ';
- + }
- +
- + while (olen > 0 && nlen > 0 && *obody == *nbody)
- + {
- + olen--; nlen--; obody++; nbody++;
- + }
- + if (olen > 0 || nlen > 0)
- + move_cursor (vpos, nbody - new_screen->contents[vpos]);
- + if (nlen > 0) output_chars (nbody, nlen);
- +
- + if (olen > nlen && new_screen->used[vpos] != screen_width)
- + clear_end_of_line(current_screen->used[vpos]);
- + /* Exchange contents between current_screen and new_screen. */
- + temp = new_screen->contents[vpos];
- + new_screen->contents[vpos] = current_screen->contents[vpos];
- + current_screen->contents[vpos] = temp;
- +
- + /* One way or another, this will enable the line being updated. */
- + current_screen->enable[vpos] = 1;
- + current_screen->used[vpos] = new_screen->used[vpos];
- + current_screen->highlight[vpos] = new_screen->highlight[vpos];
- +
- + #else /* not FAST_DISPLAY */
- +
- /* ??? */
- if (! current_screen->enable[vpos])
- {
- ***************
- *** 1172,1177 ****
- --- 1245,1251 ----
- temp = new_screen->contents[vpos];
- new_screen->contents[vpos] = current_screen->contents[vpos];
- current_screen->contents[vpos] = temp;
- + #endif /* not FAST_DISPLAY */
- }
-
- count_blanks (str)
- ***************
- *** 1577,1584 ****
- --- 1651,1668 ----
- cursor_in_echo_area = 0;
- terminal_type = (char *) 0;
-
- + #ifdef AMIGA
- + amiga_term_open();
- + #endif
- if (!inhibit_window_system)
- {
- + #ifdef AMIGA
- + amiga_term_init();
- + /* Using Intuition V2.04 */
- + Vwindow_system = intern ("intuition");
- + Vwindow_system_version = make_number (2);
- + goto term_init_done;
- + #endif /* AMIGA */
- #ifdef HAVE_X_WINDOWS
- extern char *alternate_display;
- char *disp = (char *) egetenv ("DISPLAY");
- diff -rcP emacs-18.59-fsf/src/doc.c emacs-18.59-amiga/src/doc.c
- *** emacs-18.59-fsf/src/doc.c Tue Jan 8 17:25:38 1991
- --- emacs-18.59-amiga/src/doc.c Sun Nov 22 10:14:02 1992
- ***************
- *** 21,26 ****
- --- 21,27 ----
- #include "config.h"
- #include "lisp.h"
- #include "buffer.h"
- + #include "paths.h"
-
- #include <sys/types.h>
- #include <sys/file.h> /* Must be after sys/types.h for USG and BSD4_1*/
- ***************
- *** 188,194 ****
-
- #ifndef CANNOT_DUMP
- name = (char *) alloca (XSTRING (filename)->size + 8);
- ! strcpy (name, "../etc/");
- #else /* CANNOT_DUMP */
- CHECK_STRING (Vexec_directory, 0);
- name = (char *) alloca (XSTRING (filename)->size +
- --- 189,195 ----
-
- #ifndef CANNOT_DUMP
- name = (char *) alloca (XSTRING (filename)->size + 8);
- ! strcpy (name, RELPATH_DOC);
- #else /* CANNOT_DUMP */
- CHECK_STRING (Vexec_directory, 0);
- name = (char *) alloca (XSTRING (filename)->size +
- diff -rcP emacs-18.59-fsf/src/dostrip.c emacs-18.59-amiga/src/dostrip.c
- *** emacs-18.59-fsf/src/dostrip.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/dostrip.c Sun Nov 22 10:14:02 1992
- ***************
- *** 0 ****
- --- 1,23 ----
- + #include <stdio.h>
- +
- + #define SIZE 2048
- +
- + main(int argc, char **argv)
- + {
- + char buf[SIZE];
- +
- + buf[SIZE - 1] = 0;
- + while (fgets(buf, SIZE - 1, stdin))
- + {
- + if (buf[0] != '#')
- + {
- + char *p = buf, *e;
- +
- + while (*p && *p == ' ') p++;
- + e = p + strlen(p);
- + while (e > p && (e[-1] == ' ' || e[-1] == '\t' || e[-1] == '\n')) e--;
- + *e = '\0';
- + if (*p) puts(p);
- + }
- + }
- + }
- diff -rcP emacs-18.59-fsf/src/emacs.c emacs-18.59-amiga/src/emacs.c
- *** emacs-18.59-fsf/src/emacs.c Sat Oct 17 03:51:00 1992
- --- emacs-18.59-amiga/src/emacs.c Sun Nov 22 10:14:08 1992
- ***************
- *** 78,83 ****
- --- 78,87 ----
- #endif
- #endif
-
- + #ifdef AMIGA_DUMP
- + #define HAVE_SHM /* Simplifies the ifdefs */
- + #endif
- +
- #ifndef O_RDWR
- #define O_RDWR 2
- #endif
- ***************
- *** 323,328 ****
- --- 327,333 ----
- xargc = argc;
- #endif
-
- + #ifndef AMIGA
- /* Handle the -t switch, which specifies filename to use as terminal */
- if (skip_args + 2 < argc && !strcmp (argv[skip_args + 1], "-t"))
- {
- ***************
- *** 336,341 ****
- --- 341,347 ----
- inhibit_window_system = 1; /* -t => -nw */
- #endif
- }
- + #endif
- #ifdef HAVE_X_WINDOWS
- /* Handle the -d switch, which means use a different display for X */
- if (skip_args + 2 < argc && (!strcmp (argv[skip_args + 1], "-d") ||
- ***************
- *** 717,723 ****
- --- 723,733 ----
- #ifdef VMS
- #define SEPCHAR ','
- #else
- + #ifdef AMIGA /* Can't use : on Amiga */
- + #define SEPCHAR ','
- + #else
- #define SEPCHAR ':'
- + #endif
- #endif
-
- Lisp_Object
- diff -rcP emacs-18.59-fsf/src/exec.c emacs-18.59-amiga/src/exec.c
- *** emacs-18.59-fsf/src/exec.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/exec.c Sat Oct 24 12:59:54 1992
- ***************
- *** 0 ****
- --- 1,138 ----
- + #include "amiga.h"
- + #include "processes.h"
- + #include <amiga/ioctl.h>
- + #include <exec/memory.h>
- + #include <dos/dosextens.h>
- + #include <dos/dostags.h>
- + #include <string.h>
- +
- + int eexec(char *program, char **argv, int input, int output, int error,
- + char *dir, int stacksize)
- + /* input = -1 -> inherit Input()
- + output = -1 -> inherit Output()
- + error = -1 -> inherit pr_CES
- + error = -2 -> stderr = stdout */
- + {
- + int index, comsize, close_input, close_output, close_error;
- + char *combuf, *bp;
- + BPTR in, out, err, dirlock;
- + int _pseudo_close(int fd);
- +
- + comsize = 256;
- + combuf = malloc(comsize);
- +
- + if (input == -1)
- + {
- + in = Input();
- + close_input = FALSE;
- + }
- + else
- + {
- + if (ioctl(input, _AMIGA_GET_FH, &in) == -1) in = 0;
- + close_input = TRUE;
- + _pseudo_close(input);
- + }
- +
- + if (output == -1)
- + {
- + out = Output();
- + close_output = FALSE;
- + }
- + else
- + {
- + if (ioctl(output, _AMIGA_GET_FH, &out) == -1) out = 0;
- + close_output = out != in;
- + _pseudo_close(output);
- + }
- +
- + if (error == -1)
- + {
- + err = _us->pr_CES;
- + close_error = FALSE;
- + }
- + else if (error == -2)
- + {
- + err = out;
- + close_error = FALSE;
- + }
- + else
- + {
- + if (ioctl(error, _AMIGA_GET_FH, &err) == -1) err = 0;
- + close_error = err != out && err != in;
- + _pseudo_close(error);
- + }
- +
- + /* pr_CES is not always defined */
- + if (in && out && (err || error == -1))
- + if (combuf)
- + {
- + bp = combuf;
- + for (index = 0; argv[index] != 0; index++)
- + {
- + /* Use program as argv[0]. This loses some information, but ... */
- + char *arg = index == 0 ? program : argv[index];
- + char *s;
- + int len;
- +
- + len = 3;
- + s = arg;
- + while (*s)
- + {
- + len++;
- + if (*s == '*' || *s == '"' || *s == '\n') len++;
- + s++;
- + }
- + if (bp + len + 1 >= combuf + comsize)
- + {
- + char *newbuf;
- +
- + comsize += comsize + len;
- + newbuf = realloc(combuf, comsize);
- + if (!newbuf) { errno = ENOMEM; goto error; }
- + bp = newbuf + (bp - combuf);
- + combuf = newbuf;
- + }
- + *bp++ = ' ';
- + *bp++ = '"';
- + s = arg;
- + while (*s)
- + {
- + if (*s == '"' || *s == '*') *bp++ = '*';
- + else if (*s == '\n') *bp++ = '+';
- + *bp++ = *s++;
- + }
- + *bp++ = '"';
- + }
- + *bp = '\0';
- + if (dir) dirlock = Lock(dir, SHARED_LOCK);
- + else dirlock = 0;
- +
- + if (dirlock || !dir)
- + {
- + int pid = _start_process(combuf, in, close_input, out, close_output,
- + err, close_error, dirlock, stacksize);
- +
- + if (pid != -1)
- + {
- + free(combuf);
- + return pid;
- + }
- + }
- + else errno = convert_oserr(IoErr());
- + if (dirlock) UnLock(dirlock);
- + }
- + else errno = ENOMEM;
- +
- + error:
- + if (in && close_input) Close(in);
- + if (out && close_output) Close(out);
- + if (err && close_error) Close(err);
- + if (combuf) free(combuf);
- + return -1;
- + }
- +
- + int exec(char *program, char **argv, int input, int output,
- + char *dir, int stacksize)
- + {
- + return eexec(program, argv, input, output, -1, dir, stacksize);
- + }
- diff -rcP emacs-18.59-fsf/src/fileio.c emacs-18.59-amiga/src/fileio.c
- *** emacs-18.59-fsf/src/fileio.c Tue Oct 6 22:02:20 1992
- --- emacs-18.59-amiga/src/fileio.c Sun Nov 22 10:14:24 1992
- ***************
- *** 147,152 ****
- --- 147,155 ----
- p = beg + XSTRING (file)->size;
-
- while (p != beg && p[-1] != '/'
- + #ifdef AMIGA
- + && p[-1] != ':'
- + #endif /* AMIGA */
- #ifdef VMS
- && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
- #endif /* VMS */
- ***************
- *** 174,179 ****
- --- 177,185 ----
- end = p = beg + XSTRING (file)->size;
-
- while (p != beg && p[-1] != '/'
- + #ifdef AMIGA
- + && p[-1] != ':'
- + #endif /* AMIGA */
- #ifdef VMS
- && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
- #endif /* VMS */
- ***************
- *** 248,256 ****
- --- 254,268 ----
- out[size] = '\0';
- }
- #else /* not VMS */
- + #ifdef AMIGA
- + /* AmigaDOS syntax, append slash if the last char isn't a ':' or '/' */
- + if (out[size] != '/' && out[size] != ':' && size != 0)
- + strcat (out, "/");
- + #else /* not AMIGA */
- /* For Unix syntax, Append a slash if necessary */
- if (out[size] != '/')
- strcat (out, "/");
- + #endif /* not AMIGA */
- #endif /* not VMS */
- return out;
- }
- ***************
- *** 464,469 ****
- --- 476,585 ----
- (name, defalt)
- Lisp_Object name, defalt;
- {
- + #ifdef AMIGA
- + unsigned char *nm, *tilde, *newdir, *colon, *t_pos, *target;
- +
- + CHECK_STRING (name, 0);
- +
- + nm = XSTRING (name)->data;
- + /* Find base directory */
- + if (NULL (defalt))
- + defalt = current_buffer->directory;
- + CHECK_STRING (defalt, 1);
- + newdir = XSTRING (defalt)->data;
- +
- + /* Concat newdir w/ nm and canonicalize */
- + /* newdir always contains at least the device name.
- + It is assumed canonical */
- + target = (unsigned char *)alloca(strlen(nm) + strlen(newdir) + 2);
- + file_name_as_directory (target, newdir);
- + t_pos = target + strlen(target);
- +
- + while (*nm)
- + {
- + unsigned char *comp_end = nm;
- + int comp_len;
- +
- + /* Find next component of path (everything upto the next /) */
- + do comp_end++; while (comp_end[0] && comp_end[-1] != '/' && comp_end[-1] != ':');
- + comp_len = comp_end - nm;
- +
- + if (comp_len == 1 && nm[0] == '/' ||
- + nm[0] == '.' && nm[1] == '.' &&
- + (comp_len == 2 || comp_len == 3 && nm[2] == '/'))
- + {
- + /* Previous directory */
- + if (t_pos > target && t_pos[-1] != ':')
- + {
- + t_pos--; /* Back up over / */
- + while (t_pos > target &&
- + t_pos[-1] != ':' && t_pos[-1] != '/') t_pos--;
- + }
- + }
- + else if (comp_len == 2 && nm[0] == '.' && nm[1] == '/' ||
- + comp_len == 1 && nm[0] == '.') ; /* Ignore . */
- + else if (nm[0] == ':') /* Just keep disk name */
- + {
- + char *new_pos;
- +
- + *t_pos = 0; /* Limit search for : */
- + t_pos = index(target, ':');
- + if (t_pos) t_pos++;
- + else t_pos = target;
- + }
- + else if (nm[0] == '~' || index(nm, ':'))
- + {
- + char *exp_name;
- +
- + if (nm[0] == '~')
- + if (nm[1] == '/' || nm[1] == 0) /* Home directory */
- + {
- + newdir = (unsigned char *) egetenv ("HOME");
- + if (!newdir) newdir = (unsigned char *) "s:";
- + }
- + else
- + {
- + /* Handle ~ followed by user name. */
- + char lastc = nm[comp_len - 1];
- + int len = comp_len - 1;
- +
- + if (lastc == ':' || lastc == '/') len--;
- +
- + /* ~name becomes name: */
- + newdir = (unsigned char *) alloca (len + 2);
- + bcopy((char *) nm + 1, newdir, len);
- + newdir[len] = ':';
- + newdir[len + 1] = 0;
- + }
- + else /* we have name: */
- + {
- + newdir = (char *)alloca(comp_len + 1);
- + bcopy(nm, newdir, comp_len);
- + newdir[comp_len] = 0;
- + }
- + exp_name = (char *)alloca(1024);
- + if (expand_path(newdir, exp_name, 1024))
- + {
- + char *colon = strchr(exp_name, ':');
- +
- + /* Detect paths with multiple colons (eg from PATH:) and
- + leave them alone. They create confusion. */
- + if (!(colon && strchr(colon + 1, ':'))) newdir = exp_name;
- + }
- + target = (unsigned char *)alloca(strlen(nm) + strlen(newdir) + 2);
- + file_name_as_directory (target, newdir);
- + t_pos = target + strlen(target);
- + }
- + else /* Copy component */
- + {
- + bcopy(nm, t_pos, comp_len);
- + t_pos += comp_len;
- + }
- +
- + nm = comp_end;
- + }
- + return make_string (target, t_pos - target);
- + #else /* not AMIGA */
- unsigned char *nm;
-
- register unsigned char *newdir, *p, *o;
- ***************
- *** 795,800 ****
- --- 911,917 ----
- }
-
- return make_string (target, o - target);
- + #endif /* not AMIGA */
- }
-
- DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
- ***************
- *** 825,830 ****
- --- 942,964 ----
-
- for (p = nm; p != endp; p++)
- {
- + #ifdef AMIGA
- + if (p[0] == '~' && p != nm && p[-1] == '/')
- + {
- + nm = p;
- + substituted = 1;
- + }
- + else if (p[0] == ':')
- + {
- + char *p2 = p;
- + while (p2 > nm && p2[-1] != ':' && p2[-1] != '/') p2--;
- + if (p2 != nm)
- + {
- + nm = p2;
- + substituted = 1;
- + }
- + }
- + #else /* not AMIGA */
- if ((p[0] == '~' ||
- #ifdef APOLLO
- /* // at start of file name is meaningful in Apollo system */
- ***************
- *** 845,850 ****
- --- 979,985 ----
- nm = p;
- substituted = 1;
- }
- + #endif /* not AMIGA */
- }
-
- #ifdef VMS
- ***************
- *** 1353,1358 ****
- --- 1488,1500 ----
-
- CHECK_STRING (filename, 0);
- ptr = XSTRING (filename)->data;
- + #ifdef AMIGA
- + /* An absolute filename has a non-leading ':' in it */
- + if (*ptr != ':')
- + while (*ptr)
- + if (*ptr++ == ':') return Qt;
- + return Qnil;
- + #else /* not AMIGA */
- if (*ptr == '/' || *ptr == '~'
- #ifdef VMS
- /* ??? This criterion is probably wrong for '<'. */
- ***************
- *** 1364,1369 ****
- --- 1506,1512 ----
- return Qt;
- else
- return Qnil;
- + #endif /* not AMIGA */
- }
-
- DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
- diff -rcP emacs-18.59-fsf/src/firstfile.c emacs-18.59-amiga/src/firstfile.c
- *** emacs-18.59-fsf/src/firstfile.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/firstfile.c Sun Nov 22 10:14:28 1992
- ***************
- *** 0 ****
- --- 1,4 ----
- + int first_data = 1;
- + int first_bss;
- +
- + void first_function() { }
- diff -rcP emacs-18.59-fsf/src/indent.c emacs-18.59-amiga/src/indent.c
- *** emacs-18.59-fsf/src/indent.c Sat Apr 18 16:01:07 1992
- --- emacs-18.59-amiga/src/indent.c Sun Nov 22 10:14:38 1992
- ***************
- *** 35,40 ****
- --- 35,45 ----
- #define min(a, b) ((a) < (b) ? (a) : (b))
- #define max(a, b) ((a) > (b) ? (a) : (b))
-
- + #ifdef EIGHT_BIT
- + /* Visible characters */
- + extern char visible[];
- + #endif
- +
- /* These three values memoize the current column to avoid recalculation */
- /* Some things in set last_known_column_point to -1
- to mark the memoized value as invalid */
- ***************
- *** 115,121 ****
- --- 120,130 ----
- }
-
- c = *--ptr;
- + #ifdef EIGHT_BIT
- + if (visible[c])
- + #else
- if (c >= 040 && c < 0177)
- + #endif
- {
- col++;
- }
- ***************
- *** 326,332 ****
- --- 335,345 ----
- }
- else if (ctl_arrow && (c < 040 || c == 0177))
- col++;
- + #ifdef EIGHT_BIT
- + else if (!visible[c])
- + #else
- else if (c < 040 || c >= 0177)
- + #endif
- col += 3;
- }
-
- ***************
- *** 373,381 ****
- prev_hpos = hpos;
-
- c = FETCH_CHAR (pos);
- if (c >= 040 && c < 0177)
- ! hpos++;
- ! else if (c == '\t')
- {
- hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0)
- /* Add tab_width here to make sure positive.
- --- 386,442 ----
- prev_hpos = hpos;
-
- c = FETCH_CHAR (pos);
- + #ifdef EIGHT_BIT
- + if (visible[c])
- + #else
- if (c >= 040 && c < 0177)
- ! #endif
- ! {
- ! unsigned char *p;
- ! int gap_pos;
- ! int maxhpos;
- !
- ! if (vpos == tovpos)
- ! {
- ! maxhpos = tohpos;
- ! if (maxhpos > width) maxhpos = width;
- ! }
- ! else maxhpos = width;
- !
- ! if (pos < GPT)
- ! {
- ! gap_pos = GPT;
- ! p = BEG_ADDR + pos;
- ! }
- ! else
- ! {
- ! gap_pos = -1;
- ! p = GAP_SIZE + BEG_ADDR + pos;
- ! }
- ! do
- ! {
- ! hpos++;
- ! if (hpos >= maxhpos)
- ! {
- ! prev_hpos = hpos - 1;
- ! if (hpos >= width) goto check_hpos;
- ! /* We've reached the target pos */
- ! pos++;
- ! goto done;
- ! }
- ! pos++;
- ! if (pos >= to)
- ! {
- ! prev_hpos = hpos - 1;
- ! goto done;
- ! }
- ! if (gap_pos == pos) p += GAP_SIZE;
- ! c = *p++;
- ! }
- ! while (visible[c]);
- ! prev_hpos = hpos;
- ! }
- ! if (c == '\t')
- {
- hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0)
- /* Add tab_width here to make sure positive.
- ***************
- *** 433,438 ****
- --- 494,500 ----
- else
- hpos += (ctl_arrow && c < 0200) ? 2 : 4;
-
- + check_hpos:
- /* Handle right margin. */
- if (hpos >= width
- && (hpos > width
- ***************
- *** 462,467 ****
- --- 524,530 ----
-
- }
- }
- + done:
-
- val_compute_motion.bufpos = pos;
- val_compute_motion.hpos = hpos;
- diff -rcP emacs-18.59-fsf/src/keyboard.c emacs-18.59-amiga/src/keyboard.c
- *** emacs-18.59-fsf/src/keyboard.c Sun May 17 06:57:15 1992
- --- emacs-18.59-amiga/src/keyboard.c Sun Nov 22 10:14:48 1992
- ***************
- *** 1313,1319 ****
- --- 1313,1325 ----
- #endif
- fcntl (fileno (stdin), F_SETFL, 0);
- #else /* not USG */
- + #ifdef AMIGA /* This is where the input work finally gets done */
- + /* Note, The nread != 0 case isn't handled as it doesn't arise on the Amiga.
- + (Look carefully at calls to read_avail_input) */
- + nread = read(0, buf, sizeof buf);
- + #else /* not AMIGA */
- you lose
- + #endif /* not AMIGA */
- #endif /* not USG */
- #endif /* no FIONREAD */
-
- diff -rcP emacs-18.59-fsf/src/keymap.c emacs-18.59-amiga/src/keymap.c
- *** emacs-18.59-fsf/src/keymap.c Sat Jul 27 17:43:27 1991
- --- emacs-18.59-amiga/src/keymap.c Sun Nov 22 10:14:52 1992
- ***************
- *** 29,34 ****
- --- 29,38 ----
-
- /* Actually allocate storage for these variables */
-
- + #ifdef AMIGA
- + #define HAVE_X_WINDOWS /* We want the mouse map too */
- + #endif
- +
- #ifdef HAVE_X_WINDOWS
- Lisp_Object MouseMap; /* Keymap for mouse commands */
- #endif /* HAVE_X_WINDOWS */
- diff -rcP emacs-18.59-fsf/src/lastfile.c emacs-18.59-amiga/src/lastfile.c
- *** emacs-18.59-fsf/src/lastfile.c Sat Mar 30 23:05:55 1991
- --- emacs-18.59-amiga/src/lastfile.c Sat Dec 5 18:16:44 1992
- ***************
- *** 35,43 ****
- --- 35,57 ----
- coming from libraries.
- */
-
- + #ifdef AMIGA
- + /* I need to find the end of initialised and unitialised data, as well as of
- + executable code.
- + */
- + int last_data = 1;
- + int last_bss;
- +
- + void last_function() { }
- +
- + /* Some data that shouldn't be dumped */
- + #include "amiga_data.c"
- +
- + #else /* not AMIGA */
- #ifdef VMS
- /* Prevent the file from being totally empty. */
- static dummy () {}
- #endif
-
- char my_edata = 0;
- + #endif /* not AMIGA */
- diff -rcP emacs-18.59-fsf/src/lisp.h emacs-18.59-amiga/src/lisp.h
- *** emacs-18.59-fsf/src/lisp.h Thu Mar 5 23:11:31 1992
- --- emacs-18.59-amiga/src/lisp.h Sun Nov 22 10:14:58 1992
- ***************
- *** 287,293 ****
- (XUINT (a) | (XUINT (a) > PURESIZE ? DATA_SEG_BITS : PURE_SEG_BITS))
- #else /* not HAVE_SHM */
- #ifdef DATA_SEG_BITS
- ! /* This case is used for the rt-pc.
- In the diffs I was given, it checked for ptr = 0
- and did not adjust it in that case.
- But I don't think that zero should ever be found
- --- 287,293 ----
- (XUINT (a) | (XUINT (a) > PURESIZE ? DATA_SEG_BITS : PURE_SEG_BITS))
- #else /* not HAVE_SHM */
- #ifdef DATA_SEG_BITS
- ! /* This case is used for the rt-pc and the Amiga.
- In the diffs I was given, it checked for ptr = 0
- and did not adjust it in that case.
- But I don't think that zero should ever be found
- ***************
- *** 520,525 ****
- --- 520,532 ----
- { if (XTYPE ((x)) == Lisp_Marker) XFASTINT (x) = marker_position (x); \
- else if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qinteger_or_marker_p, (x)); }
-
- + #ifdef AMIGA_DUMP
- + #define CHECK_IMPURE(obj) \
- + { extern int *pure, puresize; \
- + if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + puresize) \
- + && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
- + pure_write_error (); }
- + #else /* not AMIGA_DUMP */
- #ifdef VIRT_ADDR_VARIES
-
- /* For machines like APOLLO where text and data can go anywhere
- ***************
- *** 529,535 ****
- if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
- && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
- pure_write_error (); }
- -
- #else /* not VIRT_ADDR_VARIES */
- #ifdef PNTR_COMPARISON_TYPE
-
- --- 536,541 ----
- ***************
- *** 548,553 ****
- --- 554,560 ----
-
- #endif /* PNTR_COMPARISON_TYPE */
- #endif /* VIRT_ADDRESS_VARIES */
- + #endif /* not AMIGA_DUMP */
-
- /* Cast pointers to this type to compare them. Some machines want int. */
- #ifndef PNTR_COMPARISON_TYPE
- diff -rcP emacs-18.59-fsf/src/lread.c emacs-18.59-amiga/src/lread.c
- *** emacs-18.59-fsf/src/lread.c Mon Mar 23 04:18:17 1992
- --- emacs-18.59-amiga/src/lread.c Sun Nov 22 10:15:02 1992
- ***************
- *** 240,250 ****
- --- 240,254 ----
- Lisp_Object pathname;
- {
- register unsigned char *s = XSTRING (pathname)->data;
- + #ifdef AMIGA
- + return (*s && index(s + 1, ':')); /* Non-leading : */
- + #else
- return (*s == '~' || *s == '/'
- #ifdef VMS
- || index (s, ':')
- #endif /* VMS */
- );
- + #endif /* not AMIGA */
- }
-
- /* Search for a file whose name is STR, looking in directories
- ***************
- *** 559,565 ****
- }
-
- static int read_buffer_size;
- ! static char *read_buffer;
-
- static Lisp_Object
- read1 (readcharfun)
- --- 563,569 ----
- }
-
- static int read_buffer_size;
- ! char *read_buffer;
-
- static Lisp_Object
- read1 (readcharfun)
- diff -rcP emacs-18.59-fsf/src/m-amiga.h emacs-18.59-amiga/src/m-amiga.h
- *** emacs-18.59-fsf/src/m-amiga.h Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/m-amiga.h Sun Nov 22 10:20:16 1992
- ***************
- *** 0 ****
- --- 1,129 ----
- + /* m- file for GNU Emacs running on AmigaDOS 2.04, SAS C compiler 5.10b
- + Copyright (C) 1985, 1986 Free Software Foundation, Inc.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY. No author or distributor
- + accepts responsibility to anyone for the consequences of using it
- + or for whether it serves any particular purpose or works at all,
- + unless he says so in writing. Refer to the GNU Emacs General Public
- + License for full details.
- +
- + Everyone is granted permission to copy, modify and redistribute
- + GNU Emacs, but only under the conditions described in the
- + GNU Emacs General Public License. A copy of this license is
- + supposed to have been given to you along with GNU Emacs so you
- + can know your rights and responsibilities. It should be in a
- + file named COPYING. Among other things, the copyright notice
- + and this notice must be preserved on all copies. */
- +
- +
- + /* The following three symbols give information on
- + the size of various data types. */
- + /* lisp.h doesn't make any concessions for INTBITS = 16 and
- + NO_UNION_TYPE (use int as lisp object) defined. The following is
- + assuming that the Manx 32 bit int. math package is faster than
- + bitfield implementation, overall. If you want to use INTBITS = 16,
- + you *cannot* define NO_UNION_TYPE. */
- +
- + #define SHORTBITS 16 /* Number of bits in a short */
- +
- + #define INTBITS 32 /* Number of bits in an int */
- +
- + #define LONGBITS 32 /* Number of bits in a long */
- +
- + #define VALBITS 26 /* Number of bits in an int or pointer offset */
- +
- + #define GCTYPEBITS 5 /* Number of bits in a type. */
- +
- + /* Define BIG_ENDIAN iff lowest-numbered byte in a word
- + is the most significant byte. */
- +
- + #define BIG_ENDIAN
- +
- + /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
- + * group of arguments and treat it as an array of the arguments. */
- +
- + /* #define NO_ARG_ARRAY */
- +
- + /* Define WORD_MACHINE if addresses and such have
- + * to be corrected before they can be used as byte counts. */
- +
- + #define WORD_MACHINE
- +
- + /* Define how to take a char and sign-extend into an int.
- + On machines where char is signed, this is a no-op. */
- +
- + #define SIGN_EXTEND_CHAR(c) (c)
- +
- + /* Now define a symbol for the cpu type, if your compiler
- + does not define it automatically:
- + Ones defined so far include vax, m68000, ns16000, pyramid,
- + orion, tahoe, APOLLO and many others */
- +
- + #ifndef m68000
- + #define m68000
- + #endif
- +
- + /* Use type int rather than a union, to represent Lisp_Object */
- + /* This is desirable for most machines. */
- +
- + #define NO_UNION_TYPE
- + /* Use a struct rather than an int. */
- +
- +
- + /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
- + the 24-bit bit field into an int. In other words, if bit fields
- + are always unsigned.
- +
- + If you use NO_UNION_TYPE, this flag does not matter. */
- +
- + #define EXPLICIT_SIGN_EXTEND
- +
- + /* We don't have /dev/kmem, so LOAD_AVE_TYPE and LOAD_AVE_CVT are
- + not defined. */
- +
- + /* Define CANNOT_DUMP on machines where unexec does not work.
- + Then the function dump-emacs will not be defined
- + and temacs will do (load "loadup") automatically unless told otherwise. */
- +
- + /* #define CANNOT_DUMP */
- +
- + /* Define VIRT_ADDR_VARIES if the virtual addresses of
- + pure and impure space as loaded can vary, and even their
- + relative order cannot be relied on.
- +
- + Otherwise Emacs assumes that text space precedes data space,
- + numerically. */
- +
- + /* #define VIRT_ADDR_VARIES */
- + /* I now rely on AMIGA_DUMP to make appropriate patches in the source */
- +
- + /* Define C_ALLOCA if this machine does not support a true alloca
- + and the one written in C should be used instead.
- + Define HAVE_ALLOCA to say that the system provides a properly
- + working alloca function and it should be used.
- + Define neither one if an assembler-language alloca
- + in the file alloca.s should be used. */
- +
- + #define C_ALLOCA
- + /* #define HAVE_ALLOCA */
- +
- + /* Define STACK_DIRECTION for alloca.c */
- + #define STACK_DIRECTION -1 /* Grows downward */
- +
- + /* Define NO_REMAP if memory segmentation makes it not work well
- + to change the boundary between the text section and data section
- + when Emacs is dumped. If you define this, the preloaded Lisp
- + code will not be sharable; but that's better than failing completely. */
- +
- + #define NO_REMAP
- +
- + /* Set high (32 - VALBITS) = 6 bits of every pointer to the same as those of
- + &pure[0].
- + */
- + #ifdef emacs
- + extern long far DataSegBits;
- + #endif
- + #define DATA_SEG_BITS DataSegBits
- diff -rcP emacs-18.59-fsf/src/paths.h-dist emacs-18.59-amiga/src/paths.h-dist
- *** emacs-18.59-fsf/src/paths.h-dist Wed Sep 12 00:51:18 1990
- --- emacs-18.59-amiga/src/paths.h-dist Sun Nov 22 10:16:24 1992
- ***************
- *** 17,19 ****
- --- 17,35 ----
- /* the name of the file !!!SuperLock!!! in the directory
- specified by PATH_LOCK. Yes, this is redundant. */
- #define PATH_SUPERLOCK "/usr/local/emacs/lock/!!!SuperLock!!!"
- +
- + /* The path to the file containing the termcap descriptions */
- + #define PATH_TERMCAP "/etc/termcap"
- +
- + /* The relative path (while dumping) to the directory containing
- + the DOC file */
- + #define RELPATH_DOC "../etc/"
- +
- + /* The path for a /dev/null-like device */
- + #define PATH_NULL "/dev/null"
- +
- + /* Path for temporary files (for call-process-region) */
- + #define PATH_TEMP "/tmp/emacsXXXXXX"
- +
- + /* Path to the shell (the one in shell-file-name) */
- + #define PATH_SHELL "/bin/sh"
- diff -rcP emacs-18.59-fsf/src/process.c emacs-18.59-amiga/src/process.c
- *** emacs-18.59-fsf/src/process.c Sun Oct 25 04:42:04 1992
- --- emacs-18.59-amiga/src/process.c Sun Nov 22 10:16:38 1992
- ***************
- *** 1203,1209 ****
- --- 1203,1226 ----
- If fork fails, remove_process will clear the bit. */
- FD_SET (inchannel, &input_wait_mask);
-
- + #ifdef AMIGA
- {
- + register unsigned char *temp;
- +
- + if (XTYPE (current_buffer->directory) == Lisp_String)
- + {
- + register int i;
- +
- + i = XSTRING (current_buffer->directory)->size;
- + temp = (unsigned char *) alloca (i + 1);
- + bcopy (XSTRING (current_buffer->directory)->data, temp, i);
- + temp[i] = 0;
- + }
- + pid = exec(new_argv[0], new_argv, forkin, forkout, temp,
- + amiga_process_stack_size);
- + }
- + #else /* not AMIGA */
- + {
- /* child_setup must clobber environ on systems with true vfork.
- Protect it from permanent change. */
- char **save_environ = environ;
- ***************
- *** 1305,1310 ****
- --- 1322,1328 ----
- }
- environ = save_environ;
- }
- + #endif /* not AMIGA */
-
- if (pid < 0)
- {
- ***************
- *** 1314,1319 ****
- --- 1332,1338 ----
-
- XFASTINT (XPROCESS (process)->pid) = pid;
-
- + #ifndef AMIGA
- /* If the subfork execv fails, and it exits,
- this close hangs. I don't know why.
- So have an interrupt jar it loose. */
- ***************
- *** 1326,1331 ****
- --- 1345,1351 ----
- start_polling ();
- if (forkin != forkout && forkout >= 0)
- close (forkout);
- + #endif
-
- #ifdef SIGCHLD
- #ifdef BSD4_1
- diff -rcP emacs-18.59-fsf/src/s-amiga.h emacs-18.59-amiga/src/s-amiga.h
- *** emacs-18.59-fsf/src/s-amiga.h Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/s-amiga.h Sat Oct 2 15:32:32 1993
- ***************
- *** 0 ****
- --- 1,215 ----
- + /* file for GNU Emacs running on AmigaDOS 2.04, SAS C compiler 5.10b
- + Copyright (C) 1985, 1986 Free Software Foundation, Inc.
- +
- + This file is part of GNU Emacs.
- +
- + GNU Emacs is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY. No author or distributor
- + accepts responsibility to anyone for the consequences of using it
- + or for whether it serves any particular purpose or works at all,
- + unless he says so in writing. Refer to the GNU Emacs General Public
- + License for full details.
- +
- + Everyone is granted permission to copy, modify and redistribute
- + GNU Emacs, but only under the conditions described in the
- + GNU Emacs General Public License. A copy of this license is
- + supposed to have been given to you along with GNU Emacs so you
- + can know your rights and responsibilities. It should be in a
- + file named COPYING. Among other things, the copyright notice
- + and this notice must be preserved on all copies. */
- +
- +
- + /*
- + * Define symbols to identify the version of Unix this is.
- + * Define all the symbols that apply correctly.
- + */
- +
- + #ifndef AMIGA
- + #define AMIGA
- + #endif /* AMIGA */
- +
- + /* SYSTEM_TYPE should indicate the kind of system you are using.
- + It sets the Lisp variable system-type. */
- +
- + #define SYSTEM_TYPE "amigados"
- +
- + /* Define this if you want a faster redisplay. This saves a lot of CPU
- + time at the expense of more characters to be redrawn.
- + On a bitmapped display you win, with a serial line you probably lose.
- + */
- + #define FAST_DISPLAY
- +
- + /* Define this to display eight bit characters. The actual characters
- + that are visible can be set in init_xdisp ().
- + */
- + #define EIGHT_BIT
- +
- + /* nomultiplejobs should be defined if your system's shell
- + does not have "job control" (the ability to stop a program,
- + run some other program, then continue the first one). */
- +
- + #define NOMULTIPLEJOBS
- +
- + /* Define this to include various patches that allow the Amiga to dump.
- + This *must* be defined on the Amiga!
- + */
- + #define AMIGA_DUMP
- +
- + /* Do not use interrupt_input = 1 by default, because in 4.3
- + we can make noninterrupt input work properly. */
- +
- + /* #undef INTERRUPT_INPUT */ /* This file borrowed from s-bsd4-3.h */
- +
- + /* First pty name is /dev/ptyp0. */
- +
- + /* #define FIRST_PTY_LETTER 'p' */
- + /*
- + * Define HAVE_TIMEVAL if the system supports the BSD style clock values.
- + * Look in <sys/time.h> for a timeval structure.
- + */
- +
- + #define HAVE_TIMEVAL
- + #define USE_UTIME
- +
- + /*
- + * Define HAVE_SELECT if the system supports the `select' system call.
- + */
- +
- + #define HAVE_SELECT
- +
- + /*
- + * Define HAVE_PTYS if the system supports pty devices.
- + */
- +
- + /* #define HAVE_PTYS */
- +
- + /* Define HAVE_SOCKETS if system supports 4.2-compatible sockets. */
- +
- + /* #define HAVE_SOCKETS */
- +
- + /* But we do have socket pairs for processes ... */
- + #define SKTPAIR
- +
- + /*
- + * Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate
- + * The 4.2 opendir, etc., library functions.
- + */
- +
- + /* #define NONSYSTEM_DIR_LIBRARY */
- + #define SYSV_SYSTEM_DIR
- +
- + /* Define this symbol if your system has the functions bcopy, etc. */
- +
- + #define BSTRING /* #define'ed later on */
- +
- + /* subprocesses should be defined if you want to
- + have code for asynchronous subprocesses
- + (as used in M-x compile and M-x shell).
- + This is generally OS dependent, and not supported
- + under most USG systems. */
- +
- + #define subprocesses
- +
- + #define DID_REMOTE /* Use 0 length write to send eof */
- +
- + /* If your system uses COFF (Common Object File Format) then define the
- + preprocessor symbol "COFF". */
- +
- + /* #define COFF */
- +
- + /* define MAIL_USE_FLOCK if the mailer uses flock
- + to interlock access to /usr/spool/mail/$USER.
- + The alternative is that a lock file named
- + /usr/spool/mail/$USER.lock. */
- +
- + /* #define MAIL_USE_FLOCK */
- +
- + /* Define CLASH_DETECTION if you want lock files to be written
- + so that Emacs can tell instantly when you try to modify
- + a file that someone else has modified in his Emacs. */
- +
- + /* #define CLASH_DETECTION */
- +
- + /* We use the Berkeley (and usg5.2.2) interface to nlist. */
- +
- + /* #define NLIST_STRUCT */
- +
- + /* The file containing the kernel's symbol table is called /vmunix. */
- +
- + /* #define KERNEL_FILE "/vmunix" */
- +
- + /* The symbol in the kernel where the load average is found
- + is named _avenrun. */
- +
- + /* #define LDAV_SYMBOL "_avenrun" */
- +
- + /* We use our own malloc for 2 reasons:
- + - To check that the 6 (INTBITS - VALBITS) of allocated data are
- + the same as &pure[0].
- + - To release unused memory to the system (SAS's malloc keeps it
- + till you quit)
- + */
- +
- + #define SYMS_SYSTEM syms_of_amiga()
- +
- + #define SYSTEM_MALLOC /* But I have replaced the system malloc ... */
- +
- + #define DEF_PURESIZE 132000 /* Leave space for extra code for Amiga */
- + #ifdef emacs
- + extern int puresize;
- + #endif
- + #define PURESIZE puresize /* Puresize is variable ... */
- +
- + #ifdef emacs
- + /* Stdio must be included before redefining putchar */
- + #include <stdio.h>
- + extern char cbuffer[], *cbuffer_pos;
- + #define PENDING_OUTPUT_COUNT(x) (cbuffer_pos - cbuffer)
- + #endif
- + /* We divert some calls to our routines */
- + #define putchar(c) do { extern int noninteractive; \
- + if (noninteractive) putc (c, stdout); \
- + else emacs_putchar(c); } while(0)
- + #define fwrite emacs_fwrite
- + #define fflush emacs_fflush
- + #define random rand
- + #define srandom srand
- + #define main emacs_main
- + #define select emacs_select
- +
- + #ifdef emacs
- + #include <string.h>
- + #undef index
- + #undef rindex
- + #define index strchr
- + #define rindex strrchr
- + #endif
- +
- + #define fsync(x) 0 /* Emulate fsync ... */
- +
- + #ifdef emacs
- + #include <sys/wait.h> /* process.c doesn't have appropriate #ifdef's */
- + extern int amiga_process_stack_size;
- + #endif
- +
- + /* Here are some symbols for ymakefile's benefit */
- +
- + #define LIB_STANDARD //unix/src/unix.lib lib:sc.lib lib:amiga.lib
- + #define START_FILES lib:c.o firstfile.o
- + #define C_DEBUG_SWITCH debug s
- + #define C_OPTIMIZE_SWITCH opt
- + #define LD_SWITCH_SYSTEM
- + #define C_SWITCH_SYSTEM
- + #define S_SWITCH_MACHINE /* Nothing! */
- + #define UNEXEC amiga_dump.o
- + #define OBJECTS_SYSTEM amiga_clipboard.o amiga_tty.o amiga_serial.o \
- + amiga_screen.o amiga_menu.o amiga_malloc.o \
- + amiga_rexx.o simplerexx.o amiga_term.o
- +
- +
- + /* Amiga window-specific stuff */
- +
- + #define VERS "1.28DG Beta"
- +
- + #define FALSE 0
- + #define TRUE 1
- diff -rcP emacs-18.59-fsf/src/scroll.c emacs-18.59-amiga/src/scroll.c
- *** emacs-18.59-fsf/src/scroll.c Tue Jan 8 18:04:52 1991
- --- emacs-18.59-amiga/src/scroll.c Sun Nov 22 10:17:30 1992
- ***************
- *** 55,60 ****
- --- 55,61 ----
- int *ILncost;
- int *DLncost;
-
- + #ifdef FAST_DISPLAY
- scrolling_1 (window_size, unchanged_at_top, unchanged_at_bottom,
- draw_cost, old_hash, new_hash, free_at_end)
- int window_size, unchanged_at_top, unchanged_at_bottom;
- ***************
- *** 63,68 ****
- --- 64,127 ----
- int *new_hash;
- int free_at_end;
- {
- + int lines, i;
- + int window_end = unchanged_at_top + window_size;
- +
- + /* Rebase arrays at line 0 */
- + old_hash -= unchanged_at_top - 1;
- + new_hash -= unchanged_at_top - 1;
- + draw_cost -= unchanged_at_top - 1;
- +
- + /* We can't allow un-enabled lines to be scrolled (they are not redrawable).
- + Restrict window to the first set of contiguous enabled lines
- + (an enabled line has draw_cost[x] != INFINITY) */
- + for (i = unchanged_at_top; i < window_end && draw_cost[i] != INFINITY; i++) ;
- + /*unchanged_at_bottom += window_size - i;*/
- + /*window_size = i - unchanged_at_top;*/
- + window_end = i;
- +
- + if (lines = calc_scroll(old_hash, new_hash, unchanged_at_top, window_end))
- + scroll_screen_lines(unchanged_at_top, window_end - lines, lines);
- + else if (lines = calc_scroll(new_hash, old_hash, unchanged_at_top, window_end))
- + scroll_screen_lines(unchanged_at_top + lines, window_end, -lines);
- + }
- +
- + int calc_scroll(int *old_hash, int *new_hash, int from, int to)
- + /* For insert attempt, the parameters are correct.
- + For delete attempt, swap the old & new hash parameters
- + */
- + {
- + int try = from + 1, lines, i;
- + int hash1 = old_hash[from];
- +
- + do
- + {
- + if (hash1 == new_hash[try])
- + {
- + /* Check if other lines match too */
- + lines = try - from; /* Amount to insert */
- + for (i = try + 1; i < to; i++)
- + if (old_hash[i - lines] != new_hash[i]) break;
- + if (i == to) /* It works ! */
- + return lines;
- + }
- + try++;
- + }
- + while (try < to);
- +
- + return 0;
- + }
- +
- + #else /* not FAST_DISPLAY */
- +
- + scrolling_1 (window_size, unchanged_at_top, unchanged_at_bottom,
- + draw_cost, old_hash, new_hash, free_at_end)
- + int window_size, unchanged_at_top, unchanged_at_bottom;
- + int *draw_cost;
- + int *old_hash;
- + int *new_hash;
- + int free_at_end;
- + {
- struct matrix_elt *matrix;
- matrix = ((struct matrix_elt *)
- alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix));
- ***************
- *** 320,325 ****
- --- 379,385 ----
- if (window)
- set_terminal_window (0);
- }
- + #endif /* not FAST_DISPLAY */
-
- /* Return number of lines in common between current screen contents
- and the text to be displayed,
- diff -rcP emacs-18.59-fsf/src/simplerexx.c emacs-18.59-amiga/src/simplerexx.c
- *** emacs-18.59-fsf/src/simplerexx.c Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/simplerexx.c Mon May 10 14:35:42 1993
- ***************
- *** 0 ****
- --- 1,416 ----
- + /*
- + * Simple ARexx interface by Michael Sinz
- + *
- + * This is a very "Simple" interface to the world of ARexx...
- + * For more complex interfaces into ARexx, it is best that you
- + * understand the functions that are provided by ARexx.
- + * In many cases they are more powerful than what is presented
- + * here.
- + *
- + * This code is fully re-entrant and self-contained other than
- + * the use of SysBase/AbsExecBase and the ARexx RVI support
- + * library which is also self-contained...
- + */
- +
- + #include <exec/types.h>
- + #include <exec/nodes.h>
- + #include <exec/lists.h>
- + #include <exec/ports.h>
- + #include <exec/memory.h>
- +
- + #include <proto/exec.h>
- +
- + #include <rexx/storage.h>
- + #include <rexx/rxslib.h>
- +
- + #include <string.h>
- + #include <ctype.h>
- +
- + /*
- + * The prototypes for the few ARexx functions we will call...
- + */
- + struct RexxMsg *CreateRexxMsg(struct MsgPort *,char *,char *);
- + void *CreateArgstring(char *,long);
- + void DeleteRexxMsg(struct RexxMsg *);
- + void DeleteArgstring(char *);
- + BOOL IsRexxMsg(struct Message *);
- +
- + /*
- + * Pragmas for the above functions... (To make this all self-contained...)
- + * If you use RexxGlue.o, this is not needed...
- + *
- + * These are for Lattice C 5.x (Note the use of RexxContext->RexxSysBase)
- + */
- + #pragma libcall RexxContext->RexxSysBase CreateRexxMsg 90 09803
- + #pragma libcall RexxContext->RexxSysBase CreateArgstring 7E 0802
- + #pragma libcall RexxContext->RexxSysBase DeleteRexxMsg 96 801
- + #pragma libcall RexxContext->RexxSysBase DeleteArgstring 84 801
- + #pragma libcall RexxContext->RexxSysBase IsRexxMsg A8 801
- +
- + /*
- + * Now, we have made the pragmas needed, let's get to work...
- + */
- +
- + /*
- + * A structure for the ARexx handler context
- + * This is *VERY* *PRIVATE* and should not be touched...
- + */
- + struct ARexxContext
- + {
- + struct MsgPort *ARexxPort; /* The port messages come in at... */
- + struct Library *RexxSysBase; /* We will hide the library pointer here... */
- + long Outstanding; /* The count of outstanding ARexx messages... */
- + char PortName[24]; /* The port name goes here... */
- + char ErrorName[28]; /* The name of the <base>.LASTERROR... */
- + char Extension[8]; /* Default file name extension... */
- + };
- +
- + #define AREXXCONTEXT struct ARexxContext *
- +
- + #include "SimpleRexx.h"
- +
- + /*
- + * This function returns the port name of your ARexx port.
- + * It will return NULL if there is no ARexx port...
- + *
- + * This string is *READ ONLY* You *MUST NOT* modify it...
- + */
- + char *ARexxName(AREXXCONTEXT RexxContext)
- + {
- + register char *tmp=NULL;
- +
- + if (RexxContext) tmp=RexxContext->PortName;
- + return(tmp);
- + }
- +
- + /*
- + * This function returns the signal mask that the Rexx port is
- + * using. It returns NULL if there is no signal...
- + *
- + * Use this signal bit in your Wait() loop...
- + */
- + ULONG ARexxSignal(AREXXCONTEXT RexxContext)
- + {
- + register ULONG tmp=NULL;
- +
- + if (RexxContext) tmp=1L << (RexxContext->ARexxPort->mp_SigBit);
- + return(tmp);
- + }
- +
- + /*
- + * This function returns a structure that contains the commands sent from
- + * ARexx or the results of commands you sent. You will need to parse it
- + * and return the structure back so that the memory can be freed.
- + *
- + * This returns NULL if there was no message.
- + */
- + struct RexxMsg *GetARexxMsg(AREXXCONTEXT RexxContext)
- + {
- + register struct RexxMsg *tmp=NULL;
- + register short flag;
- +
- + if (RexxContext) tmp=(struct RexxMsg *)GetMsg(RexxContext->ARexxPort);
- + return(tmp);
- + }
- +
- + /* Use this to delete a message sent via SendARexxMsg and that has now been
- + returned to you.
- + */
- + void DeleteARexxMsg(AREXXCONTEXT RexxContext, struct RexxMsg *rmsg)
- + {
- + /*
- + * Free the arguments and the message...
- + */
- + if(rmsg->rm_Action & RXFF_RESULT) {
- + if(rmsg->rm_Result1 == 0 && rmsg->rm_Result2) {
- + DeleteArgstring((STRPTR)rmsg->rm_Result2);
- + }
- + }
- + DeleteArgstring(rmsg->rm_Args[0]);
- + DeleteRexxMsg(rmsg);
- + RexxContext->Outstanding-=1;
- + }
- +
- + /*
- + * Use this to return a ARexx message...
- + *
- + * If you wish to return something, it must be in the RString.
- + * If you wish to return an Error, it must be in the Error.
- + * If there is an error, the RString is ignored.
- + */
- + void ReplyARexxMsg(AREXXCONTEXT RexxContext,struct RexxMsg *rmsg,
- + char *RString,LONG Error)
- + {
- + if (RexxContext) if (rmsg) if (rmsg!=REXX_RETURN_ERROR)
- + {
- + rmsg->rm_Result2=0;
- + if (!(rmsg->rm_Result1=Error))
- + {
- + /*
- + * if you did not have an error we return the string
- + */
- + if (rmsg->rm_Action & (1L << RXFB_RESULT)) if (RString)
- + {
- + rmsg->rm_Result2=(LONG)CreateArgstring(RString,
- + (LONG)strlen(RString));
- + }
- + }
- +
- + /*
- + * Reply the message to ARexx...
- + */
- + ReplyMsg((struct Message *)rmsg);
- + }
- + }
- +
- + /*
- + * This function will set an error string for the ARexx
- + * application in the variable defined as <appname>.LASTERROR
- + *
- + * Note that this can only happen if there is an ARexx message...
- + *
- + * This returns TRUE if it worked, FALSE if it did not...
- + */
- + short SetARexxLastError(AREXXCONTEXT RexxContext,struct RexxMsg *rmsg,
- + char *ErrorString)
- + {
- + register short OkFlag=FALSE;
- +
- + if (RexxContext) if (rmsg) if (CheckRexxMsg(rmsg))
- + {
- + /*
- + * Note that SetRexxVar() has more than just a TRUE/FALSE
- + * return code, but for this "basic" case, we just care if
- + * it works or not.
- + */
- + if (!SetRexxVar(rmsg,RexxContext->ErrorName,ErrorString,
- + (long)strlen(ErrorString)))
- + {
- + OkFlag=TRUE;
- + }
- + }
- + return(OkFlag);
- + }
- +
- + /*
- + * This function will send a string to ARexx...
- + *
- + * The default host port will be that of your task...
- + *
- + * If you set StringFile to TRUE, it will set that bit for the message...
- + *
- + * Returns the message sent, or NULL in case of error.
- + */
- + struct RexxMsg *SendARexxMsg(AREXXCONTEXT RexxContext,char *RString,
- + short StringFile, short results)
- + {
- + register struct MsgPort *RexxPort;
- + register struct RexxMsg *rmsg;
- + register short flag=FALSE;
- +
- + if (RexxContext) if (RString)
- + {
- + if (rmsg=CreateRexxMsg(RexxContext->ARexxPort,
- + RexxContext->Extension,
- + RexxContext->PortName))
- + {
- + rmsg->rm_Action=RXCOMM | (StringFile ?
- + (1L << RXFB_STRING):0);
- + rmsg->rm_Action |= (results ? RXFF_RESULT : 0);
- + if (rmsg->rm_Args[0]=CreateArgstring(RString,
- + (LONG)strlen(RString)))
- + {
- + /*
- + * We need to find the RexxPort and this needs
- + * to be done in a Forbid()
- + */
- + Forbid();
- + if (RexxPort=FindPort(RXSDIR))
- + {
- + /*
- + * We found the port, so put the
- + * message to ARexx...
- + */
- + PutMsg(RexxPort,(struct Message *)rmsg);
- + RexxContext->Outstanding+=1;
- + flag=TRUE;
- + }
- + else
- + {
- + /*
- + * No port, so clean up...
- + */
- + DeleteArgstring(rmsg->rm_Args[0]);
- + DeleteRexxMsg(rmsg);
- + }
- + Permit();
- + }
- + else DeleteRexxMsg(rmsg);
- + }
- + }
- + return flag ? rmsg : NULL;
- + }
- +
- + int PendingCommands(AREXXCONTEXT RexxContext)
- + {
- + if (RexxContext) return RexxContext->Outstanding;
- + else return 0;
- + }
- +
- + /*
- + * This function closes down the ARexx context that was opened
- + * with InitARexx...
- + */
- + void FreeARexx(AREXXCONTEXT RexxContext)
- + {
- + register struct RexxMsg *rmsg;
- +
- + if (RexxContext)
- + {
- + /*
- + * Clear port name so it can't be found...
- + */
- + RexxContext->PortName[0]='\0';
- +
- + /*
- + * Clean out any outstanding messages we had sent out...
- + */
- + while (RexxContext->Outstanding)
- + {
- + WaitPort(RexxContext->ARexxPort);
- + while (rmsg=GetARexxMsg(RexxContext))
- + {
- + if (rmsg!=REXX_RETURN_ERROR)
- + {
- + /*
- + * Any messages that come now are blown
- + * away...
- + */
- + SetARexxLastError(RexxContext,rmsg,
- + "99: Port Closed!");
- + /* removed ReplyARexxMsg() this was a bug that would */
- + /* obviously cause a loop (we would continue to reply and */
- + /* then get the message. It now deletes the message as */
- + /* should be done. -ch5/10/93. */
- + DeleteARexxMsg(RexxContext,rmsg);
- + }
- + }
- + }
- +
- + /*
- + * Clean up the port and delete it...
- + */
- + if (RexxContext->ARexxPort)
- + {
- + while (rmsg=GetARexxMsg(RexxContext))
- + {
- + /*
- + * Any messages that still are coming in are
- + * "dead" We just set the LASTERROR and
- + * reply an error of 100...
- + */
- + SetARexxLastError(RexxContext,rmsg,
- + "99: Port Closed!");
- + ReplyARexxMsg(RexxContext,rmsg,NULL,100);
- + }
- + RemPort(RexxContext->ARexxPort);
- + DeleteMsgPort(RexxContext->ARexxPort);
- + }
- +
- + /*
- + * Make sure we close the library...
- + */
- + if (RexxContext->RexxSysBase)
- + {
- + CloseLibrary(RexxContext->RexxSysBase);
- + }
- +
- + /*
- + * Free the memory of the RexxContext
- + */
- + FreeMem(RexxContext,sizeof(struct ARexxContext));
- + }
- + }
- +
- + /*
- + * This routine initializes an ARexx port for your process
- + * This should only be done once per process. You must call it
- + * with a valid application name and you must use the handle it
- + * returns in all other calls...
- + *
- + * NOTE: The AppName should not have spaces in it...
- + * Example AppNames: "MyWord" or "FastCalc" etc...
- + * The name *MUST* be less that 16 characters...
- + * If it is not, it will be trimmed...
- + * The name will also be UPPER-CASED...
- + *
- + * NOTE: The Default file name extension, if NULL will be
- + * "rexx" (the "." is automatic)
- + */
- + AREXXCONTEXT InitARexx(char *AppName,char *Extension)
- + {
- + register AREXXCONTEXT RexxContext=NULL;
- + register short loop;
- + register short count;
- + register char *tmp;
- +
- + if (RexxContext=AllocMem(sizeof(struct ARexxContext),
- + MEMF_PUBLIC|MEMF_CLEAR))
- + {
- + if (RexxContext->RexxSysBase=OpenLibrary("rexxsyslib.library", NULL))
- + {
- + /*
- + * Set up the extension...
- + */
- + if (!Extension) Extension="rexx";
- + tmp=RexxContext->Extension;
- + for (loop=0;(loop<7)&&(Extension[loop]);loop++)
- + {
- + *tmp++=Extension[loop];
- + }
- + *tmp='\0';
- +
- + /*
- + * Set up a port name...
- + */
- + tmp=RexxContext->PortName;
- + for (loop=0;(loop<16)&&(AppName[loop]);loop++)
- + {
- + *tmp++=toupper(AppName[loop]);
- + }
- + *tmp='\0';
- +
- + /*
- + * Set up the last error RVI name...
- + *
- + * This is <appname>.LASTERROR
- + */
- + strcpy(RexxContext->ErrorName,RexxContext->PortName);
- + strcat(RexxContext->ErrorName,".LASTERROR");
- +
- + /* We need to make a unique port name... */
- + Forbid();
- + for (count=1,RexxContext->ARexxPort=(VOID *)1;
- + RexxContext->ARexxPort;count++)
- + {
- + stci_d(tmp,count);
- + RexxContext->ARexxPort=
- + FindPort(RexxContext->PortName);
- + }
- +
- + /*RexxContext->ARexxPort=CreatePort(RexxContext->PortName,NULL);*/
- + RexxContext->ARexxPort=CreateMsgPort();
- + RexxContext->ARexxPort->mp_Node.ln_Name = RexxContext->PortName;
- + RexxContext->ARexxPort->mp_Node.ln_Pri = 0;
- + AddPort(RexxContext->ARexxPort);
- + Permit();
- + }
- +
- + if (!RexxContext->RexxSysBase || !RexxContext->ARexxPort)
- + {
- + FreeARexx(RexxContext);
- + RexxContext=NULL;
- + }
- + }
- + return(RexxContext);
- + }
- diff -rcP emacs-18.59-fsf/src/simplerexx.h emacs-18.59-amiga/src/simplerexx.h
- *** emacs-18.59-fsf/src/simplerexx.h Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/simplerexx.h Mon May 10 14:35:42 1993
- ***************
- *** 0 ****
- --- 1,119 ----
- + /*
- + * Simple ARexx interface by Michael Sinz
- + *
- + * This is a very "Simple" interface...
- + */
- +
- + #ifndef SIMPLE_REXX_H
- + #define SIMPLE_REXX_H
- +
- + #include <exec/types.h>
- + #include <exec/nodes.h>
- + #include <exec/lists.h>
- + #include <exec/ports.h>
- +
- + #include <rexx/storage.h>
- + #include <rexx/rxslib.h>
- +
- + /*
- + * This is the handle that SimpleRexx will give you
- + * when you initialize an ARexx port...
- + *
- + * The conditional below is used to skip this if we have
- + * defined it earlier...
- + */
- + #ifndef AREXXCONTEXT
- +
- + typedef void *AREXXCONTEXT;
- +
- + #endif /* AREXXCONTEXT */
- +
- + /*
- + * The value of RexxMsg (from GetARexxMsg) if there was an error returned
- + */
- + #define REXX_RETURN_ERROR ((struct RexxMsg *)-1L)
- + #define REXX_RETURN_OK ((struct RexxMsg *)-3L)
- +
- + /*
- + * This function closes down the ARexx context that was opened
- + * with InitARexx...
- + */
- + void FreeARexx(AREXXCONTEXT);
- +
- + /*
- + * This routine initializes an ARexx port for your process
- + * This should only be done once per process. You must call it
- + * with a valid application name and you must use the handle it
- + * returns in all other calls...
- + *
- + * NOTE: The AppName should not have spaces in it...
- + * Example AppNames: "MyWord" or "FastCalc" etc...
- + * The name *MUST* be less that 16 characters...
- + * If it is not, it will be trimmed...
- + * The name will also be UPPER-CASED...
- + *
- + * NOTE: The Default file name extension, if NULL will be
- + * "rexx" (the "." is automatic)
- + */
- + AREXXCONTEXT InitARexx(char *,char *);
- +
- + /*
- + * This function returns the port name of your ARexx port.
- + * It will return NULL if there is no ARexx port...
- + *
- + * This string is *READ ONLY* You *MUST NOT* modify it...
- + */
- + char *ARexxName(AREXXCONTEXT);
- +
- + /*
- + * This function returns the signal mask that the Rexx port is
- + * using. It returns NULL if there is no signal...
- + *
- + * Use this signal bit in your Wait() loop...
- + */
- + ULONG ARexxSignal(AREXXCONTEXT);
- +
- + /*
- + * This function returns a structure that contains the commands sent from
- + * ARexx... You will need to parse it and return the structure back
- + * so that the memory can be freed...
- + *
- + * This returns NULL if there was no message...
- + */
- + struct RexxMsg *GetARexxMsg(AREXXCONTEXT);
- +
- + /* Use this to delete a message sent via SendARexxMsg and that has now been
- + returned to you.
- + */
- + void DeleteARexxMsg(AREXXCONTEXT RexxContext, struct RexxMsg *rmsg);
- +
- + /*
- + * Use this to return a ARexx message...
- + *
- + * If you wish to return something, it must be in the RString.
- + * If you wish to return an Error, it must be in the Error.
- + */
- + void ReplyARexxMsg(AREXXCONTEXT,struct RexxMsg *,char *,LONG);
- +
- + /*
- + * This function will send a string to ARexx...
- + *
- + * The default host port will be that of your task...
- + *
- + * If you set StringFile to TRUE, it will set that bit for the message...
- + *
- + * Returns the message sent, or NULL in case of error.
- + */
- + struct RexxMsg *SendARexxMsg(AREXXCONTEXT,char *,short,short);
- +
- + /*
- + * This function will set an error string for the ARexx
- + * application in the variable defined as <appname>.LASTERROR
- + *
- + * Note that this can only happen if there is an ARexx message...
- + *
- + * This returns TRUE if it worked, FALSE if it did not...
- + */
- + short SetARexxLastError(AREXXCONTEXT,struct RexxMsg *,char *);
- +
- + #endif /* SIMPLE_REXX_H */
- diff -rcP emacs-18.59-fsf/src/smakefile emacs-18.59-amiga/src/smakefile
- *** emacs-18.59-fsf/src/smakefile Thu Jan 1 00:00:00 1970
- --- emacs-18.59-amiga/src/smakefile Sat Dec 5 16:43:56 1992
- ***************
- *** 0 ****
- --- 1,45 ----
- + CPP = /cpp/cpp -DAMIGA
- + MAKE = smake # BSD doesn't have it as a default.
- + #Note: an alternative is CPP = /lib/cpp
- +
- + all: xmakefile doall
- +
- + doall:
- + $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} all
- +
- + #This is used in making a distribution.
- + #Do not use it on development directories!
- + distclean:
- + -delete force paths.h config.h emacs-* temacs xemacs xmakefile \
- + *! @* *.o
- +
- + clean:
- + -delete force temacs xemacs xmakefile @* *.o
- +
- + xemacs: xmakefile doxemacs
- +
- + doxemacs:
- + $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} xemacs
- +
- + temacs: xmakefile dotemacs
- +
- + dotemacs:
- + $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} temacs
- +
- + demacs: xmakefile dodemacs
- +
- + dodemacs:
- + $(MAKE) $(MAKEOVERRIDES) -f xmakefile ${MFLAGS} demacs
- +
- + # If you have a problem with cc -E here, changing
- + # the definition of CPP above may fix it.
- + xmakefile: ymakefile config.h dostrip
- + -delete force xmakefile
- + ${CPP} ymakefile > t:ymkf
- + dostrip <t:ymkf >xmakefile
- +
- + dostrip: dostrip.c
- + sc link dostrip
- +
- + tags:
- + etags [a-z]*.h [a-z]*.c /lisp/[a-z]*.el
- diff -rcP emacs-18.59-fsf/src/term.c emacs-18.59-amiga/src/term.c
- *** emacs-18.59-fsf/src/term.c Fri Jan 3 07:46:47 1992
- --- emacs-18.59-amiga/src/term.c Sun Nov 22 10:18:02 1992
- ***************
- *** 161,167 ****
- or'd with 0100. Zero if no standout marker at all. */
- /* used iff TN_standout_width >= 0. */
- char *chars_wasted;
- ! static char *copybuf;
-
- /* nonzero means supposed to write text in standout mode. */
- int standout_requested;
- --- 161,167 ----
- or'd with 0100. Zero if no standout marker at all. */
- /* used iff TN_standout_width >= 0. */
- char *chars_wasted;
- ! char *copybuf;
-
- /* nonzero means supposed to write text in standout mode. */
- int standout_requested;
- diff -rcP emacs-18.59-fsf/src/termcap.c emacs-18.59-amiga/src/termcap.c
- *** emacs-18.59-fsf/src/termcap.c Tue Jan 8 18:08:50 1991
- --- emacs-18.59-amiga/src/termcap.c Sun Nov 22 10:18:04 1992
- ***************
- *** 30,35 ****
- --- 30,36 ----
-
- #ifdef emacs
- #include "config.h"
- + #include "paths.h"
- #endif
-
- #ifndef BUFSIZE
- ***************
- *** 344,350 ****
- --- 345,355 ----
- #ifdef VMS
- filep = tem && legal_filename_p (tem);
- #else
- + #ifdef AMIGA
- + filep = tem != 0; /* Always assume that it is a file */
- + #else
- filep = tem && (*tem == '/');
- + #endif
- #endif /* VMS */
-
- /* If tem is non-null and starts with / (in the un*x case, that is),
- ***************
- *** 374,384 ****
- indirect = (char *) 0;
-
- if (!tem)
- ! #ifdef VMS
- ! tem = "emacs_library:[etc]termcap.dat";
- ! #else
- ! tem = "/etc/termcap";
- ! #endif
-
- /* Here we know we must search a file and tem has its name. */
-
- --- 379,385 ----
- indirect = (char *) 0;
-
- if (!tem)
- ! tem = PATH_TERMCAP;
-
- /* Here we know we must search a file and tem has its name. */
-
- diff -rcP emacs-18.59-fsf/src/tparam.c emacs-18.59-amiga/src/tparam.c
- *** emacs-18.59-fsf/src/tparam.c Tue Jan 8 18:09:27 1991
- --- emacs-18.59-amiga/src/tparam.c Sun Nov 22 10:18:10 1992
- ***************
- *** 258,264 ****
- return outstring;
- }
-
- ! #ifdef DEBUG
-
- main (argc, argv)
- int argc;
- --- 258,264 ----
- return outstring;
- }
-
- ! #ifdef TPARAM_DEBUG
-
- main (argc, argv)
- int argc;
- ***************
- *** 274,277 ****
- return 0;
- }
-
- ! #endif /* DEBUG */
- --- 274,277 ----
- return 0;
- }
-
- ! #endif /* TPARAM_DEBUG */
- diff -rcP emacs-18.59-fsf/src/xdisp.c emacs-18.59-amiga/src/xdisp.c
- *** emacs-18.59-fsf/src/xdisp.c Fri Jul 24 19:08:13 1992
- --- emacs-18.59-amiga/src/xdisp.c Sun Nov 22 10:19:14 1992
- ***************
- *** 31,36 ****
- --- 31,47 ----
- #include "commands.h"
- #include "macros.h"
-
- + #define MAX_WIN_LINE 64
- + static int win_line_bufpos[MAX_WIN_LINE];
- + static int win_line_modified;
- + static struct buffer *win_line_buffer;
- + #define CLEAR_WIN_LINE() (win_line_buffer = 0)
- +
- + #ifdef EIGHT_BIT
- + char visible[256]; /* visible[i] is true if character i is
- + displayable */
- + #endif
- +
- extern int interrupt_input;
- extern int command_loop_level;
-
- ***************
- *** 275,281 ****
- windows_or_buffers_changed++;
-
- if (EQ (minibuf_window, selected_window))
- ! this_line_bufpos = 0;
-
- prev_echo_area_contents = echo_area_contents;
- }
- --- 286,295 ----
- windows_or_buffers_changed++;
-
- if (EQ (minibuf_window, selected_window))
- ! {
- ! this_line_bufpos = 0;
- ! CLEAR_WIN_LINE();
- ! }
-
- prev_echo_area_contents = echo_area_contents;
- }
- ***************
- *** 327,332 ****
- --- 341,348 ----
- must_finish = 1;
- }
-
- + if (windows_or_buffers_changed) CLEAR_WIN_LINE();
- +
- if (clip_changed || windows_or_buffers_changed)
- update_mode_lines++;
-
- ***************
- *** 453,458 ****
- --- 469,475 ----
- Also, don't forget to check every line to update the arrow. */
- if (pause)
- {
- + CLEAR_WIN_LINE();
- this_line_bufpos = 0;
- if (!NULL (last_arrow_position))
- {
- ***************
- *** 709,717 ****
- && (just_this_one || XFASTINT (w->width) == screen_width)
- && !EQ (window, minibuf_window))
- {
- ! pos = *compute_motion (startp, 0, (hscroll ? 1 - hscroll : 0),
- point, height + 1, 10000, width, hscroll,
- ! pos_tab_offset (w, startp));
-
- if (pos.vpos < height)
- {
- --- 726,754 ----
- && (just_this_one || XFASTINT (w->width) == screen_width)
- && !EQ (window, minibuf_window))
- {
- ! int *wlb;
- ! int line, best_startp, best_vpos;
- !
- ! best_startp = startp; best_vpos = 0;
- ! if (win_line_buffer && BUF_MODIFF(win_line_buffer) > win_line_modified)
- ! CLEAR_WIN_LINE();
- ! if (current_buffer == win_line_buffer && current_buffer == XBUFFER (w->buffer))
- ! {
- ! /* Try & find line to start from */
- ! wlb = win_line_bufpos; line = 0;
- ! while (line < MAX_WIN_LINE)
- ! {
- ! if (*wlb && point > *wlb && *wlb > best_startp)
- ! {
- ! best_startp = *wlb;
- ! best_vpos = line;
- ! }
- ! line++; wlb++;
- ! }
- ! }
- ! pos = *compute_motion (best_startp, best_vpos, (hscroll ? 1 - hscroll : 0),
- point, height + 1, 10000, width, hscroll,
- ! pos_tab_offset (w, best_startp));
-
- if (pos.vpos < height)
- {
- ***************
- *** 843,848 ****
- --- 880,887 ----
-
- struct position val;
-
- + if (XBUFFER(w->buffer) == win_line_buffer) CLEAR_WIN_LINE();
- +
- Fset_marker (w->start, make_number (pos), Qnil);
-
- point_vpos = -1;
- ***************
- *** 908,913 ****
- --- 947,954 ----
- int delta;
- int tab_offset, epto;
-
- + if (XBUFFER(w->buffer) == win_line_buffer) CLEAR_WIN_LINE();
- +
- if (GPT - BEG < beg_unchanged)
- beg_unchanged = GPT - BEG;
- if (Z - GPT < end_unchanged)
- ***************
- *** 1334,1339 ****
- --- 1375,1381 ----
- pause = pos;
- while (p1 < endp)
- {
- + restart:
- p1prev = p1;
- if (pos == pause)
- {
- ***************
- *** 1354,1366 ****
- p = &FETCH_CHAR (pos);
- }
- c = *p++;
- if (c >= 040 && c < 0177)
- ! {
- if (p1 >= startp)
- ! *p1 = c;
- ! p1++;
- ! }
- ! else if (c == '\n')
- {
- invis = 0;
- while (pos < end
- --- 1396,1439 ----
- p = &FETCH_CHAR (pos);
- }
- c = *p++;
- + #ifdef EIGHT_BIT
- + if (visible[c])
- + #else
- if (c >= 040 && c < 0177)
- ! #endif
- ! /* This optimises the frequent part (displayable characters) of
- ! this inner loop. If the conditions aren't met, return to old
- ! inner loop. */
- ! {
- if (p1 >= startp)
- ! {
- ! do
- ! {
- ! *p1++ = c;
- ! pos++;
- ! if (p1 >= endp)
- ! {
- ! p1prev = p1 - 1;
- ! goto done;
- ! }
- ! if (pos == pause) goto restart;
- ! c = *p++;
- ! }
- ! #ifdef EIGHT_BIT
- ! while (visible[c]);
- ! #else
- ! while (c >= 040 && c < 0177);
- ! #endif
- ! p1prev = p1;
- ! }
- ! else
- ! {
- ! p1++;
- ! pos++;
- ! goto restart;
- ! }
- ! }
- ! if (c == '\n')
- {
- invis = 0;
- while (pos < end
- ***************
- *** 1434,1439 ****
- --- 1507,1513 ----
- }
- pos++;
- }
- + done:
-
- val.hpos = - XINT (w->hscroll);
- if (val.hpos)
- ***************
- *** 1525,1530 ****
- --- 1599,1623 ----
- this_line_bufpos = 0;
- }
- }
- + /* Save positions of all lines of current window */
- + if (w == XWINDOW(selected_window) && vpos < MAX_WIN_LINE)
- + {
- + /* Line is not continued and did not start in middle of character */
- + if (hpos == (XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0)
- + && val.vpos)
- + {
- + if (current_buffer != win_line_buffer ||
- + !(win_line_modified >= MODIFF))
- + {
- + win_line_buffer = current_buffer;
- + win_line_modified = MODIFF;
- + bzero(win_line_bufpos, sizeof win_line_bufpos);
- + }
- + win_line_bufpos[vpos - XINT (w->top)] = start;
- + }
- + else
- + win_line_bufpos[vpos - XINT (w->top)] = 0;
- + }
-
- /* If hscroll and line not empty, insert truncation-at-left marker */
- if (hscroll && lastpos != start)
- ***************
- *** 1994,2000 ****
- --- 2087,2097 ----
- {
- c = *string++;
- if (!c) break;
- + #ifdef EIGHT_BIT
- + if (visible[c])
- + #else
- if (c >= 040 && c < 0177)
- + #endif
- {
- if (p1 >= start)
- *p1 = c;
- ***************
- *** 2109,2115 ****
- --- 2206,2216 ----
- register
- #endif COMPILER_REGISTER_BUG
- struct window *mini_w;
- + #ifdef EIGHT_BIT
- + int i;
- + #endif
-
- + CLEAR_WIN_LINE();
- this_line_bufpos = 0;
-
- mini_w = XWINDOW (minibuf_window);
- ***************
- *** 2128,2131 ****
- --- 2229,2238 ----
- XFASTINT (XWINDOW (root_window)->width) = screen_width;
- XFASTINT (mini_w->width) = screen_width;
- }
- + #ifdef EIGHT_BIT
- + for (i = 040; i < 0177; i++) visible[i] = 1;
- + #ifdef AMIGA
- + for (i = 0240; i <= 0377; i++) visible[i] = 1;
- + #endif
- + #endif
- }
- diff -rcP emacs-18.59-fsf/src/ymakefile emacs-18.59-amiga/src/ymakefile
- *** emacs-18.59-fsf/src/ymakefile Tue Oct 6 18:44:28 1992
- --- emacs-18.59-amiga/src/ymakefile Thu Sep 30 20:52:04 1993
- ***************
- *** 18,24 ****
- --- 18,32 ----
- the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
- + #ifdef amiga
- + #undef amiga
- + #endif
- +
- + #ifdef AMIGA
- + dot =
- + #else
- dot = .
- + #endif
- /* on Xenix, replace double-dot below with $(dot)$(dot) */
- lispdir = $(dot)$(dot)/lisp/
- etcdir = $(dot)$(dot)/etc/
- ***************
- *** 161,167 ****
- #define LINKER gcc -nostdlib
- #else
- #define LINKER ld
- ! #endif
- #endif /* not ORDINARY_LINK */
- #endif /* no LINKER */
-
- --- 169,175 ----
- #define LINKER gcc -nostdlib
- #else
- #define LINKER ld
- ! #endif
- #endif /* not ORDINARY_LINK */
- #endif /* no LINKER */
-
- ***************
- *** 191,197 ****
- --- 199,209 ----
- SHORT= shortnames
- #endif /* SHORTNAMES */
-
- + #ifdef AMIGA
- + CFLAGS= C_DEBUG_SWITCH def emacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
- + #else
- CFLAGS= C_DEBUG_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
- + #endif
- /* DO NOT use -R. There is a special hack described in lastfile.c
- which is used instead. Some initialized data areas are modified
- at initial startup, then labeled as part of the text area when
- ***************
- *** 258,264 ****
- GNULIB_VAR = `if [ -f LIB_GCC ] ; then echo LIB_GCC; else echo; fi`
- #endif /* __GNUC__ <= 1 */
- #else
- ! GNULIB_VAR =
- #endif
-
- #ifdef MAINTAIN_ENVIRONMENT
- --- 270,276 ----
- GNULIB_VAR = `if [ -f LIB_GCC ] ; then echo LIB_GCC; else echo; fi`
- #endif /* __GNUC__ <= 1 */
- #else
- ! GNULIB_VAR =
- #endif
-
- #ifdef MAINTAIN_ENVIRONMENT
- ***************
- *** 270,280 ****
- #define UNEXEC unexec.o
- #endif
-
- /* lastfile must follow all files
- whose initialized data areas should be dumped as pure by dump-emacs. */
- obj= dispnew.o scroll.o xdisp.o window.o \
- ! term.o cm.o $(XOBJ) \
- ! emacs.o keyboard.o macros.o keymap.o sysdep.o \
- buffer.o filelock.o insdel.o marker.o \
- minibuf.o fileio.o dired.o filemode.o \
- cmds.o casefiddle.o indent.o search.o regex.o undo.o \
- --- 282,300 ----
- #define UNEXEC unexec.o
- #endif
-
- + termobjs= term.o cm.o
- +
- + #ifdef AMIGA
- + SYSDEP= amiga_sysdep.o
- + #else
- + SYSDEP= sysdep.o
- + #endif
- +
- /* lastfile must follow all files
- whose initialized data areas should be dumped as pure by dump-emacs. */
- obj= dispnew.o scroll.o xdisp.o window.o \
- ! $(termobjs) $(XOBJ) \
- ! emacs.o keyboard.o macros.o keymap.o $(SYSDEP) \
- buffer.o filelock.o insdel.o marker.o \
- minibuf.o fileio.o dired.o filemode.o \
- cmds.o casefiddle.o indent.o search.o regex.o undo.o \
- ***************
- *** 360,376 ****
- --- 380,422 ----
- #ifdef CANNOT_DUMP
- mv temacs xemacs
- #else
- + #ifdef AMIGA
- + -delete ${etcdir}EMACS-DATA xemacs force
- + temacs -nl -batch -l inc-vers
- + temacs -nl -batch -l loadup.el dump
- + -touch xemacs
- + -delete /temacs force
- + makelink from /temacs temacs
- + #else
- ./temacs -batch -l inc-vers
- ./temacs -batch -l loadup.el dump
- + #endif /* not AMIGA */
- #endif /* not CANNOT_DUMP */
- #endif /* not HAVE_SHM */
-
- ${etcdir}DOC: ${etcdir}make-docfile ${obj} ${lisp}
- + #ifdef AMIGA
- + REDIRECT_IN= <
- + -delete force ${etcdir}DOC
- + ${etcdir}make-docfile >${etcdir}DOC $(REDIRECT_IN) < <
- + ${obj}
- + ${lisp}
- + ${lispdir}version.el
- + ${lispdir}amiga-menu.elc ${lispdir}amiga-init.elc ${lispdir}amiga-mouse.elc
- + OBJECTS_SYSTEM
- + <
- + #else
- rm -f ${etcdir}DOC
- ${etcdir}make-docfile ${obj} ${lisp} ${lispdir}version.el > ${etcdir}DOC
- + #endif
-
- + #ifdef AMIGA
- + ${etcdir}make-docfile: ${etcdir}make-docfile.c
- + sc link /etc/make-docfile
- + #else
- ${etcdir}make-docfile:
- cd ${etcdir}; ${MAKE} ${MFLAGS} make-docfile
- + #endif
-
- /* Some systems define this to cause parallel Make-ing. */
- #ifndef MAKE_PARALLEL
- ***************
- *** 378,384 ****
- --- 424,453 ----
- #endif
-
- temacs: MAKE_PARALLEL $(LOCALCPP) $(SHORT) $(STARTFILES) $(OLDXMENU) ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE
- + #ifdef AMIGA
- + slink <with <
- + from ${STARTFILES} $(obj) OBJECTS_SYSTEM OBJECTS_MACHINE $(otherobj)
- + to temacs
- + lib LIB_STANDARD
- + nodebug
- + batch
- + <
- + #endif
- +
- + demacs: MAKE_PARALLEL $(LOCALCPP) $(SHORT) $(STARTFILES) $(OLDXMENU) ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE
- + #ifdef AMIGA
- + slink <with <
- + from ${STARTFILES} $(obj) OBJECTS_SYSTEM OBJECTS_MACHINE $(otherobj)
- + to demacs
- + lib LIB_STANDARD
- + map ram:emacs.map,h,x
- + addsym
- + swidth 16
- + batch
- + <
- + #else
- $(LD) ${STARTFLAGS} ${LDFLAGS} -o temacs ${STARTFILES} ${obj} ${otherobj} OBJECTS_SYSTEM OBJECTS_MACHINE ${LIBES}
- + #endif
-
- /* These are needed for C compilation, on the systems that need them */
- #ifdef NEED_CPP
- ***************
- *** 460,510 ****
- it is so often changed in ways that do not require any recompilation
- and so rarely changed in ways that do require any. */
-
- ! abbrev.o : abbrev.c buffer.h commands.h config.h
- ! buffer.o : buffer.c syntax.h buffer.h commands.h window.h config.h
- ! callint.o : callint.c window.h commands.h buffer.h config.h
- ! callproc.o : callproc.c paths.h buffer.h commands.h config.h
- ! casefiddle.o : casefiddle.c syntax.h commands.h buffer.h config.h
- cm.o : cm.c cm.h termhooks.h config.h
- ! cmds.o : cmds.c syntax.h buffer.h commands.h config.h
- crt0.o : crt0.c config.h
- $(CC) -c $(CFLAGS) C_SWITCH_ASM crt0.c
- dired.o : dired.c commands.h buffer.h config.h regex.h
- dispnew.o : dispnew.c commands.h window.h buffer.h dispextern.h termchar.h termopts.h cm.h config.h lisp.h
- doc.o : doc.c buffer.h config.h paths.h
- doprnt.o : doprnt.c
- ! editfns.o : editfns.c window.h buffer.h config.h
- ! emacs.o : emacs.c commands.h config.h
- #ifdef MAINTAIN_ENVIRONMENT
- environ.o : environ.c buffer.h commands.h config.h
- #endif /* MAINTAIN_ENVIRONMENT */
- ! fileio.o : fileio.c window.h buffer.h config.h
- filelock.o : filelock.c buffer.h paths.h config.h
- ! filemode.o : filemode.c
- indent.o : indent.c window.h indent.h buffer.h config.h termchar.h termopts.h
- ! insdel.o : insdel.c window.h buffer.h config.h
- ! keyboard.o : keyboard.c termchar.h termhooks.h termopts.h buffer.h commands.h window.h macros.h config.h
- ! keymap.o : keymap.c buffer.h commands.h config.h
- ! lastfile.o : lastfile.c
- macros.o : macros.c window.h buffer.h commands.h macros.h config.h
- malloc.o : malloc.c config.h
- ! marker.o : marker.c buffer.h config.h
- ! minibuf.o : minibuf.c syntax.h window.h buffer.h commands.h config.h
- mocklisp.o : mocklisp.c buffer.h config.h
- ! process.o : process.c process.h buffer.h window.h termhooks.h termopts.h commands.h dispextern.h config.h
- ! regex.o : regex.c syntax.h buffer.h config.h regex.h
- scroll.o : scroll.c termchar.h config.h dispextern.h termhooks.h
- ! search.o : search.c regex.h commands.h buffer.h syntax.h config.h
- ! syntax.o : syntax.c syntax.h buffer.h commands.h config.h
- sysdep.o : sysdep.c config.h dispextern.h termhooks.h termchar.h termopts.h window.h
- term.o : term.c termchar.h termhooks.h termopts.h config.h cm.h
- termcap.o : termcap.c config.h
- terminfo.o : terminfo.c config.h
- tparam.o : tparam.c config.h
- ! undo.o : undo.c buffer.h commands.h config.h
- UNEXEC : config.h getpagesize.h
- window.o : window.c indent.h commands.h window.h buffer.h config.h termchar.h
- ! xdisp.o : xdisp.c macros.h commands.h indent.h buffer.h dispextern.h termchar.h window.h config.h
- xfns.o : xfns.c xterm.h window.h config.h
- xmenu.o : xmenu.c xterm.h window.h config.h
- xterm.o : xterm.c xterm.h termhooks.h termopts.h termchar.h \
- --- 529,579 ----
- it is so often changed in ways that do not require any recompilation
- and so rarely changed in ways that do require any. */
-
- ! abbrev.o : abbrev.c buffer.h commands.h config.h
- ! buffer.o : buffer.c syntax.h buffer.h commands.h window.h config.h
- ! callint.o : callint.c window.h commands.h buffer.h config.h
- ! callproc.o : callproc.c paths.h buffer.h commands.h config.h
- ! casefiddle.o : casefiddle.c syntax.h commands.h buffer.h config.h
- cm.o : cm.c cm.h termhooks.h config.h
- ! cmds.o : cmds.c syntax.h buffer.h commands.h config.h
- crt0.o : crt0.c config.h
- $(CC) -c $(CFLAGS) C_SWITCH_ASM crt0.c
- dired.o : dired.c commands.h buffer.h config.h regex.h
- dispnew.o : dispnew.c commands.h window.h buffer.h dispextern.h termchar.h termopts.h cm.h config.h lisp.h
- doc.o : doc.c buffer.h config.h paths.h
- doprnt.o : doprnt.c
- ! editfns.o : editfns.c window.h buffer.h config.h
- ! emacs.o : emacs.c commands.h config.h
- #ifdef MAINTAIN_ENVIRONMENT
- environ.o : environ.c buffer.h commands.h config.h
- #endif /* MAINTAIN_ENVIRONMENT */
- ! fileio.o : fileio.c window.h buffer.h config.h
- filelock.o : filelock.c buffer.h paths.h config.h
- ! filemode.o : filemode.c
- indent.o : indent.c window.h indent.h buffer.h config.h termchar.h termopts.h
- ! insdel.o : insdel.c window.h buffer.h config.h
- ! keyboard.o : keyboard.c termchar.h termhooks.h termopts.h buffer.h commands.h window.h macros.h config.h
- ! keymap.o : keymap.c buffer.h commands.h config.h
- ! lastfile.o : lastfile.c
- macros.o : macros.c window.h buffer.h commands.h macros.h config.h
- malloc.o : malloc.c config.h
- ! marker.o : marker.c buffer.h config.h
- ! minibuf.o : minibuf.c syntax.h window.h buffer.h commands.h config.h
- mocklisp.o : mocklisp.c buffer.h config.h
- ! process.o : process.c process.h buffer.h window.h termhooks.h termopts.h commands.h dispextern.h config.h
- ! regex.o : regex.c syntax.h buffer.h config.h regex.h
- scroll.o : scroll.c termchar.h config.h dispextern.h termhooks.h
- ! search.o : search.c regex.h commands.h buffer.h syntax.h config.h
- ! syntax.o : syntax.c syntax.h buffer.h commands.h config.h
- sysdep.o : sysdep.c config.h dispextern.h termhooks.h termchar.h termopts.h window.h
- term.o : term.c termchar.h termhooks.h termopts.h config.h cm.h
- termcap.o : termcap.c config.h
- terminfo.o : terminfo.c config.h
- tparam.o : tparam.c config.h
- ! undo.o : undo.c buffer.h commands.h config.h
- UNEXEC : config.h getpagesize.h
- window.o : window.c indent.h commands.h window.h buffer.h config.h termchar.h
- ! xdisp.o : xdisp.c macros.h commands.h indent.h buffer.h dispextern.h termchar.h window.h config.h
- xfns.o : xfns.c xterm.h window.h config.h
- xmenu.o : xmenu.c xterm.h window.h config.h
- xterm.o : xterm.c xterm.h termhooks.h termopts.h termchar.h \
- ***************
- *** 517,529 ****
-
- /* The files of Lisp proper */
-
- ! alloc.o : alloc.c window.h buffer.h config.h
- ! bytecode.o : bytecode.c buffer.h config.h
- ! data.o : data.c buffer.h config.h
- eval.o : eval.c commands.h config.h
- fns.o : fns.c buffer.h commands.h config.h
- ! print.o : print.c process.h window.h buffer.h dispextern.h termchar.h config.h
- ! lread.o : lread.c buffer.h paths.h config.h
-
- /* System-specific programs to be made.
- OTHER_FILES, OBJECTS_SYSTEM and OBJECTS_MACHINE
- --- 586,598 ----
-
- /* The files of Lisp proper */
-
- ! alloc.o : alloc.c window.h buffer.h config.h
- ! bytecode.o : bytecode.c buffer.h config.h
- ! data.o : data.c buffer.h config.h
- eval.o : eval.c commands.h config.h
- fns.o : fns.c buffer.h commands.h config.h
- ! print.o : print.c process.h window.h buffer.h dispextern.h termchar.h config.h
- ! lread.o : lread.c buffer.h paths.h config.h
-
- /* System-specific programs to be made.
- OTHER_FILES, OBJECTS_SYSTEM and OBJECTS_MACHINE
- ***************
- *** 533,535 ****
- --- 602,619 ----
-
- ${etcdir}emacstool: ${etcdir}emacstool.c
- cd ${etcdir}; ${MAKE} ${MFLAGS} emacstool
- +
- + SimpleRexx.o: SimpleRexx.c SimpleRexx.h
- + amiga_clipboard.o: amiga_clipboard.c termchar.h amiga.h config.h
- + amiga_dump.o: amiga_dump.c termchar.h buffer.h dispextern.h regex.h amiga.h config.h
- + amiga_menu.o: amiga_menu.c amiga.h config.h
- + amiga_processes.o: amiga_processes.c amiga.h config.h
- + amiga_rexx.o: amiga_rexx.c SimpleRexx.h amiga.h config.h
- + amiga_screen.o: amiga_screen.c termchar.h dispextern.h amiga.h config.h
- + amiga_serial.o: amiga_serial.c amiga.h config.h
- + amiga_sysdep.o: amiga_sysdep.c termopts.h termhooks.h termchar.h dispextern.h \
- + amiga.h config.h
- + amiga_term.o: amiga_term.c termopts.h termhooks.h termchar.h config.h
- + amiga_tty.o: amiga_tty.c termhooks.h termchar.h amiga.h config.h
- + amiga_malloc.o: amiga_malloc.c amiga.h config.h
- + $(CC) $(CFLAGS) parms=both amiga_malloc.c
-