blarson@skat.usc.edu (Bob Larson) (07/10/88)
Here are the changes I have made to Larry Wall's patch 2.0 patchlevel 12 to get it to work on os9/68k. I don't know of any reason this wouldn't work on a 6809 system, but this hasn't been tested. I have sent this to Larry for possible inclusion with future versions. Patch applies diffs (preferably context) to make new versions of programs. This is usful in combination with the public domain diff program I and others posted to comp.sources.misc. Patch is available from comp.sources.unix archives, and for ftp from devvax.jpl.nasa.gov. Patches to bring it up to the current version are available from the latter and via Larry's automatic mail request server. (See any of Larry's patches for any of his programs for how to use the mail server.) # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Makefile.OSK # Readme.OSK # config.h.OSK # common.h.diff # inp.c.diff # pch.c.diff # util.c.diff # This archive created: Tue Jul 5 15:11:13 1988 # By: blarson cat << \SHAR_EOF > Makefile.OSK # makefile for Larry Wall's patch program, addapted for Os9/68k by Bob Larson # FLEXFILENAMES isn't really true, but ~ and # arn't leagal os9 file name # characters and the file name limit is 28 not 14. CC = cc CFLAGS = -k2w -dFLEXFILENAMES LFLAGS = -i public = patch private = util = c = patch.c pch.c inp.c version.c util.c obj = patch.r pch.r inp.r util.r version.r all: $(public) $(private) $(util) touch all patch: $(obj) $(CC) $(LFLAGS) $(obj) -f=patch clean: del *.r patch.r: config.h common.h patch.c inp.h pch.h util.h version.h pch.r: config.h common.h pch.c pch.h util.h inp.r: config.h common.h inp.c inp.h util.h util.r: config.h common.h util.c util.h version.r: config.h common.h version.c version.h patchlevel.h util.h SHAR_EOF cat << \SHAR_EOF > Readme.OSK This is Larry Wall's patch 2.0 patchlevel 12, adapted to os9/68k (OSK) by Robert A. Larson. Rename config.h.OSK to config.h and Makefile.OSK to Makefile . If you don't want to use /r0 as your temporary directory, edit common.h to use something else. Ed file diffs are not supported. (Os9 doesn't have unix ed.) The FLEXNAMES code is used despite the fact OSK doesn't have them. 28 characters are usually enough, and # and ~ are not legal characters in os9 filenames. Signals are not disabled like they are in the unix version, so it probably possible to leave a nasty mess if you ^C at the wrong point. SHAR_EOF cat << \SHAR_EOF > config.h.OSK /* config.h * This file was produced by running the Configure script. * Feel free to modify any of this as the need arises. */ /* #undef EUNICE /* no file linking? */ /* #undef VMS /* */ /* #undef index strchr /* cultural */ /* #undef rindex strrchr /* differences? */ #define void int /* is void to be avoided? */ /* How many register declarations are paid attention to? */ #define Reg1 register #define Reg2 register #define Reg3 register #define Reg4 register #define Reg5 register #define Reg6 register #define Reg7 register #define Reg8 register #define Reg9 register #define Reg10 #define Reg11 #define Reg12 #define Reg13 #define Reg14 #define Reg15 #define Reg16 SHAR_EOF cat << \SHAR_EOF > common.h.diff *** common.h.orig --- common.h ************** *** 34,39 #define Strcat (void)strcat #include <stdio.h> #include <assert.h> #include <sys/types.h> #include <sys/stat.h> --- 34,44 ----- #define Strcat (void)strcat #include <stdio.h> + #ifdef OSK + #define assert(arg) + #include <direct.h> + #include <modes.h> + #else #include <assert.h> #include <sys/types.h> #include <sys/stat.h> ************** *** 37,42 #include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <ctype.h> #include <signal.h> --- 42,48 ----- #include <assert.h> #include <sys/types.h> #include <sys/stat.h> + #endif #include <ctype.h> #include <signal.h> ************** *** 89,94 EXT int Argc_last; /* for restarting plan_b */ EXT char **Argv_last; EXT struct stat filestat; /* file statistics area */ EXT int filemode INIT(0644); --- 95,104 ----- EXT int Argc_last; /* for restarting plan_b */ EXT char **Argv_last; + #ifdef OSK + EXT struct fildes filestat; + EXT int filemode INIT(S_IREAD | S_IWRITE | S_IOREAD); + #else EXT struct stat filestat; /* file statistics area */ EXT int filemode INIT(0644); #endif ************** *** 91,96 EXT struct stat filestat; /* file statistics area */ EXT int filemode INIT(0644); EXT char buf[MAXLINELEN]; /* general purpose buffer */ EXT FILE *ofp INIT(Nullfp); /* output file pointer */ --- 101,107 ----- #else EXT struct stat filestat; /* file statistics area */ EXT int filemode INIT(0644); + #endif EXT char buf[MAXLINELEN]; /* general purpose buffer */ EXT FILE *ofp INIT(Nullfp); /* output file pointer */ ************** *** 111,116 EXT char *origext INIT(Nullch); EXT char *origprae INIT(Nullch); EXT char TMPOUTNAME[] INIT("/tmp/patchoXXXXXX"); EXT char TMPINNAME[] INIT("/tmp/patchiXXXXXX"); /* might want /usr/tmp here */ EXT char TMPREJNAME[] INIT("/tmp/patchrXXXXXX"); --- 122,133 ----- EXT char *origext INIT(Nullch); EXT char *origprae INIT(Nullch); + #ifdef OSK + EXT char TMPOUTNAME[] INIT("/r0/patchoXXXXXX"); + EXT char TMPINNAME[] INIT("/r0/patchiXXXXXX"); /* might want /usr/tmp here */ + EXT char TMPREJNAME[] INIT("/r0/patchrXXXXXX"); + EXT char TMPPATNAME[] INIT("/r0/patchpXXXXXX"); + #else EXT char TMPOUTNAME[] INIT("/tmp/patchoXXXXXX"); EXT char TMPINNAME[] INIT("/tmp/patchiXXXXXX"); /* might want /usr/tmp here */ EXT char TMPREJNAME[] INIT("/tmp/patchrXXXXXX"); ************** *** 115,120 EXT char TMPINNAME[] INIT("/tmp/patchiXXXXXX"); /* might want /usr/tmp here */ EXT char TMPREJNAME[] INIT("/tmp/patchrXXXXXX"); EXT char TMPPATNAME[] INIT("/tmp/patchpXXXXXX"); EXT bool toutkeep INIT(FALSE); EXT bool trejkeep INIT(FALSE); --- 132,138 ----- EXT char TMPINNAME[] INIT("/tmp/patchiXXXXXX"); /* might want /usr/tmp here */ EXT char TMPREJNAME[] INIT("/tmp/patchrXXXXXX"); EXT char TMPPATNAME[] INIT("/tmp/patchpXXXXXX"); + #endif EXT bool toutkeep INIT(FALSE); EXT bool trejkeep INIT(FALSE); ************** *** 144,149 EXT char end_defined[128]; /* #endif xyzzy */ EXT char *revision INIT(Nullch); /* prerequisite revision, if any */ char *malloc(); char *realloc(); --- 162,177 ----- EXT char end_defined[128]; /* #endif xyzzy */ EXT char *revision INIT(Nullch); /* prerequisite revision, if any */ + + #ifdef OSK + #define CREATMODE (S_IREAD | S_IWRITE) + #define READMODE S_IREAD + #define READWRITEMODE (S_IREAD | S_IWRITE) + #else + #define CREATMODE 0666 + #define READMODE 0 + #define READWRITEMODE 2 + #endif char *malloc(); char *realloc(); SHAR_EOF cat << \SHAR_EOF > inp.c.diff *** inp.c.orig --- inp.c ************** *** 80,86 Reg1 char *s; Reg2 LINENUM iline; ! if (ok_to_create_file && stat(filename, &filestat) < 0) { if (verbose) say2("(Creating file %s...)\n",filename); makedirs(filename, TRUE); --- 80,89 ----- Reg1 char *s; Reg2 LINENUM iline; ! #ifdef OSK ! Reg3 int f; ! ! if (ok_to_create_file && access(filename, 0) < 0) { if (verbose) say2("(Creating file %s...)\n",filename); makedirs(filename, TRUE); ************** *** 84,90 if (verbose) say2("(Creating file %s...)\n",filename); makedirs(filename, TRUE); ! close(creat(filename, 0666)); } if (stat(filename, &filestat) < 0) { Sprintf(buf, "RCS/%s%s", filename, RCSSUFFIX); --- 87,93 ----- if (verbose) say2("(Creating file %s...)\n",filename); makedirs(filename, TRUE); ! close(creat(filename, CREATMODE)); } if((ifd = open(filename, READMODE)) < 0) fatal2("Can't find (or is directory) %s.\n", filename); ************** *** 86,91 makedirs(filename, TRUE); close(creat(filename, 0666)); } if (stat(filename, &filestat) < 0) { Sprintf(buf, "RCS/%s%s", filename, RCSSUFFIX); if (stat(buf, &filestat) >= 0 || stat(buf+4, &filestat) >= 0) { --- 89,107 ----- makedirs(filename, TRUE); close(creat(filename, CREATMODE)); } + if((ifd = open(filename, READMODE)) < 0) + fatal2("Can't find (or is directory) %s.\n", filename); + if(_gs_gfd(ifd, &filestat, sizeof filestat) < 0) + fatal2("Can't get file descriptor of %s.\n", filename); + filemode = filestat.fd_att; + i_size = _gs_size(ifd); + #else + if (ok_to_create_file && stat(filename, &filestat) < 0) { + if (verbose) + say2("(Creating file %s...)\n",filename); + makedirs(filename, TRUE); + close(creat(filename, CREATMODE)); + } if (stat(filename, &filestat) < 0) { Sprintf(buf, "RCS/%s%s", filename, RCSSUFFIX); if (stat(buf, &filestat) >= 0 || stat(buf+4, &filestat) >= 0) { ************** *** 115,120 if ((filemode & S_IFMT) & ~S_IFREG) fatal2("%s is not a normal file--can't patch.\n", filename); i_size = filestat.st_size; if (out_of_mem) { set_hunkmax(); /* make sure dynamic arrays are allocated */ out_of_mem = FALSE; --- 131,137 ----- if ((filemode & S_IFMT) & ~S_IFREG) fatal2("%s is not a normal file--can't patch.\n", filename); i_size = filestat.st_size; + #endif if (out_of_mem) { set_hunkmax(); /* make sure dynamic arrays are allocated */ out_of_mem = FALSE; ************** *** 128,134 #endif if (i_womp == Nullch) return FALSE; ! if ((ifd = open(filename, 0)) < 0) fatal2("Can't open file %s\n", filename); #ifndef lint if (read(ifd, i_womp, (int)i_size) != i_size) { --- 145,152 ----- #endif if (i_womp == Nullch) return FALSE; ! #ifndef OSK /* opened earlier for OSK */ ! if ((ifd = open(filename, READMODE)) < 0) fatal2("Can't open file %s\n", filename); #endif #ifndef lint ************** *** 130,135 return FALSE; if ((ifd = open(filename, 0)) < 0) fatal2("Can't open file %s\n", filename); #ifndef lint if (read(ifd, i_womp, (int)i_size) != i_size) { Close(ifd); /* probably means i_size > 15 or 16 bits worth */ --- 148,154 ----- #ifndef OSK /* opened earlier for OSK */ if ((ifd = open(filename, READMODE)) < 0) fatal2("Can't open file %s\n", filename); + #endif #ifndef lint if (read(ifd, i_womp, (int)i_size) != i_size) { Close(ifd); /* probably means i_size > 15 or 16 bits worth */ ************** *** 208,214 using_plan_a = FALSE; if ((ifp = fopen(filename, "r")) == Nullfp) fatal2("Can't open file %s\n", filename); ! if ((tifd = creat(TMPINNAME, 0666)) < 0) fatal2("Can't open file %s\n", TMPINNAME); while (fgets(buf, sizeof buf, ifp) != Nullch) { if (revision != Nullch && !found_revision && rev_in_string(buf)) --- 227,233 ----- using_plan_a = FALSE; if ((ifp = fopen(filename, "r")) == Nullfp) fatal2("Can't open file %s\n", filename); ! if ((tifd = creat(TMPINNAME, CREATMODE)) < 0) fatal2("Can't open file %s\n", TMPINNAME); while (fgets(buf, sizeof buf, ifp) != Nullch) { if (revision != Nullch && !found_revision && rev_in_string(buf)) ************** *** 258,264 } Fclose(ifp); Close(tifd); ! if ((tifd = open(TMPINNAME, 0)) < 0) { fatal2("Can't reopen file %s\n", TMPINNAME); } } --- 277,283 ----- } Fclose(ifp); Close(tifd); ! if ((tifd = open(TMPINNAME, READMODE)) < 0) { fatal2("Can't reopen file %s\n", TMPINNAME); } } SHAR_EOF cat << \SHAR_EOF > pch.c.diff *** pch.c.orig --- pch.c ************** *** 91,96 pfp = fopen(filename, "r"); if (pfp == Nullfp) fatal2("patch file %s not found\n", filename); Fstat(fileno(pfp), &filestat); p_filesize = filestat.st_size; next_intuit_at(0L,1L); /* start at the beginning */ --- 91,99 ----- pfp = fopen(filename, "r"); if (pfp == Nullfp) fatal2("patch file %s not found\n", filename); + #ifdef OSK + p_filesize = _gs_size(fileno(pfp)); + #else Fstat(fileno(pfp), &filestat); p_filesize = filestat.st_size; #endif ************** *** 93,98 fatal2("patch file %s not found\n", filename); Fstat(fileno(pfp), &filestat); p_filesize = filestat.st_size; next_intuit_at(0L,1L); /* start at the beginning */ set_hunkmax(); } --- 96,102 ----- #else Fstat(fileno(pfp), &filestat); p_filesize = filestat.st_size; + #endif next_intuit_at(0L,1L); /* start at the beginning */ set_hunkmax(); } ************** *** 1063,1068 void do_ed_script() { Reg1 char *t; Reg2 long beginning_of_this_line; Reg3 bool this_line_is_command = FALSE; --- 1067,1075 ----- void do_ed_script() { + #ifdef OSK + fatal1("Os9/68k does not support Unix ed.\n"); + #else Reg1 char *t; Reg2 long beginning_of_this_line; Reg3 bool this_line_is_command = FALSE; ************** *** 1120,1123 else chmod(outname, filemode); set_signals(1); } --- 1127,1131 ----- else chmod(outname, filemode); set_signals(1); + #endif } SHAR_EOF cat << \SHAR_EOF > util.c.diff *** util.c.orig --- util.c ************** *** 21,27 if (debug & 4) say2("Moving %s to stdout.\n", from); #endif ! fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) --- 21,27 ----- if (debug & 4) say2("Moving %s to stdout.\n", from); #endif ! fromfd = open(from, READMODE); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) ************** *** 38,43 Strcpy(bakname, to); Strcat(bakname, origext?origext:ORIGEXT); } if (stat(to, &filestat) >= 0) { /* output file exists */ dev_t to_device = filestat.st_dev; ino_t to_inode = filestat.st_ino; --- 38,77 ----- Strcpy(bakname, to); Strcat(bakname, origext?origext:ORIGEXT); } + #ifdef OSK + if (access(to, 0) >= 0 || access(to, S_IFDIR) >= 0) { /* exists */ + char *simplename = bakname; + char *argv[4]; + int p; + int st; + extern char **environ; + int os9fork(); + + for(s=bakname; *s; s++) { + if (*s == '/') + simplename = s+1; + } + unlink(bakname); + #ifdef DEBUGGING + if (debug & 4) + say3("Moving %s to %s.\n", to, bakname); + #endif + argv[0] = "rename"; + argv[1] = to; + argv[2] = bakname; + argv[3] = (char *)NULL; + if((p = os9exec(os9fork, argv[0], argv, environ, 0, 0)) < 0) { + say3("patch: can't backup %s, output is in %s\n", to, from); + return -1; + } + while(wait(&st) != p) {} + if((st & 0xffff) != 0) { + say3("patch: can't backup %s, output is in %s\n", to, from); + return -1; + } + unlink(to); + } + #else if (stat(to, &filestat) >= 0) { /* output file exists */ dev_t to_device = filestat.st_dev; ino_t to_inode = filestat.st_ino; ************** *** 68,73 } while (unlink(to) >= 0) ; } #ifdef DEBUGGING if (debug & 4) say3("Moving %s to %s.\n", from, to); --- 102,108 ----- } while (unlink(to) >= 0) ; } + #endif #ifdef DEBUGGING if (debug & 4) say3("Moving %s to %s.\n", from, to); ************** *** 72,77 if (debug & 4) say3("Moving %s to %s.\n", from, to); #endif if (link(from, to) < 0) { /* different file system? */ Reg4 int tofd; --- 107,115 ----- if (debug & 4) say3("Moving %s to %s.\n", from, to); #endif + #ifdef OSK + { + #else if (link(from, to) < 0) { /* different file system? */ #endif Reg4 int tofd; ************** *** 73,78 say3("Moving %s to %s.\n", from, to); #endif if (link(from, to) < 0) { /* different file system? */ Reg4 int tofd; tofd = creat(to, 0666); --- 111,117 ----- { #else if (link(from, to) < 0) { /* different file system? */ + #endif Reg4 int tofd; tofd = creat(to, CREATMODE); ************** *** 75,81 if (link(from, to) < 0) { /* different file system? */ Reg4 int tofd; ! tofd = creat(to, 0666); if (tofd < 0) { say3("patch: can't create %s, output is in %s.\n", to, from); --- 114,120 ----- #endif Reg4 int tofd; ! tofd = creat(to, CREATMODE); if (tofd < 0) { say3("patch: can't create %s, output is in %s.\n", to, from); ************** *** 81,87 to, from); return -1; } ! fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) --- 120,126 ----- to, from); return -1; } ! fromfd = open(from, READMODE); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) ************** *** 104,110 Reg2 int fromfd; Reg1 int i; ! tofd = creat(to, 0666); if (tofd < 0) fatal2("patch: can't create %s.\n", to); fromfd = open(from, 0); --- 143,149 ----- Reg2 int fromfd; Reg1 int i; ! tofd = creat(to, CREATMODE); if (tofd < 0) fatal2("patch: can't create %s.\n", to); fromfd = open(from, READMODE); ************** *** 107,113 tofd = creat(to, 0666); if (tofd < 0) fatal2("patch: can't create %s.\n", to); ! fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) --- 146,152 ----- tofd = creat(to, CREATMODE); if (tofd < 0) fatal2("patch: can't create %s.\n", to); ! fromfd = open(from, READMODE); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) ************** *** 201,207 write(1, buf, strlen(buf)); r = read(1, buf, sizeof buf); } ! else if ((ttyfd = open("/dev/tty", 2)) >= 0 && isatty(ttyfd)) { /* might be deleted or unwriteable */ write(ttyfd, buf, strlen(buf)); r = read(ttyfd, buf, sizeof buf); --- 240,251 ----- write(1, buf, strlen(buf)); r = read(1, buf, sizeof buf); } ! #ifdef OSK ! else if ((ttyfd = open(getenv("PORT"), READWRITEMODE)) >= 0 ! && isatty(ttyfd)) { ! #else ! else if ((ttyfd = open("/dev/tty", READWRITEMODE)) >= 0 && isatty(ttyfd)) { ! #endif /* might be deleted or unwriteable */ write(ttyfd, buf, strlen(buf)); r = read(ttyfd, buf, sizeof buf); ************** *** 231,236 set_signals(reset) int reset; { void my_exit(); #ifndef lint #ifdef VOIDSIG --- 275,281 ----- set_signals(reset) int reset; { + #ifndef OSK void my_exit(); #ifndef lint #ifdef VOIDSIG ************** *** 258,263 Signal(SIGHUP, hupval); Signal(SIGINT, intval); #endif } /* How to handle certain events when in a critical region. */ --- 303,309 ----- Signal(SIGHUP, hupval); Signal(SIGINT, intval); #endif + #endif } /* How to handle certain events when in a critical region. */ ************** *** 265,270 void ignore_signals() { #ifndef lint Signal(SIGHUP, SIG_IGN); Signal(SIGINT, SIG_IGN); --- 311,317 ----- void ignore_signals() { + #ifndef OSK #ifndef lint Signal(SIGHUP, SIG_IGN); Signal(SIGINT, SIG_IGN); ************** *** 269,274 Signal(SIGHUP, SIG_IGN); Signal(SIGINT, SIG_IGN); #endif } /* Make sure we'll have the directories to create a file. */ --- 316,322 ----- Signal(SIGHUP, SIG_IGN); Signal(SIGINT, SIG_IGN); #endif + #endif } /* Make sure we'll have the directories to create a file. */ ************** *** 333,340 if (debug & 128) say4("fetchname %s %d %d\n",name,strip_leading,assume_exists); #endif ! if (strnEQ(name, "/dev/null", 9)) /* so files can be created by diffing */ ! return Nullch; /* against /dev/null. */ for (; *t && !isspace(*t); t++) if (*t == '/') if (--strip_leading >= 0) --- 381,389 ----- if (debug & 128) say4("fetchname %s %d %d\n",name,strip_leading,assume_exists); #endif ! if (strnEQ(name, "/dev/null", 9) || strnEQ(name, "/null", 5)) ! /* so files can be created by diffing */ ! return Nullch; /* against /dev/null or OSK /null. */ for (; *t && !isspace(*t); t++) if (*t == '/') if (--strip_leading >= 0) ************** *** 342,347 *t = '\0'; if (name != s && *s != '/') { name[-1] = '\0'; if (stat(s, &filestat) && filestat.st_mode & S_IFDIR) { name[-1] = '/'; name=s; --- 391,399 ----- *t = '\0'; if (name != s && *s != '/') { name[-1] = '\0'; + #ifdef OSK + if (access(s, S_IFDIR) >= 0) { + #else if (stat(s, &filestat) && filestat.st_mode & S_IFDIR) { #endif name[-1] = '/'; ************** *** 343,348 if (name != s && *s != '/') { name[-1] = '\0'; if (stat(s, &filestat) && filestat.st_mode & S_IFDIR) { name[-1] = '/'; name=s; } --- 395,401 ----- if (access(s, S_IFDIR) >= 0) { #else if (stat(s, &filestat) && filestat.st_mode & S_IFDIR) { + #endif name[-1] = '/'; name=s; } ************** *** 348,354 } } name = savestr(name); - Sprintf(tmpbuf, "RCS/%s", name); free(s); if (stat(name, &filestat) < 0 && !assume_exists) { Strcat(tmpbuf, RCSSUFFIX); --- 401,406 ----- } } name = savestr(name); free(s); #ifndef OSK Sprintf(tmpbuf, "RCS/%s", name); ************** *** 350,355 name = savestr(name); Sprintf(tmpbuf, "RCS/%s", name); free(s); if (stat(name, &filestat) < 0 && !assume_exists) { Strcat(tmpbuf, RCSSUFFIX); if (stat(tmpbuf, &filestat) < 0 && stat(tmpbuf+4, &filestat) < 0) { --- 402,409 ----- } name = savestr(name); free(s); + #ifndef OSK + Sprintf(tmpbuf, "RCS/%s", name); if (stat(name, &filestat) < 0 && !assume_exists) { Strcat(tmpbuf, RCSSUFFIX); if (stat(tmpbuf, &filestat) < 0 && stat(tmpbuf+4, &filestat) < 0) { ************** *** 360,364 } } } return name; } --- 414,420 ----- } } } + #endif return name; } ************** *** 362,364 } return name; } --- 417,433 ----- #endif return name; } + + #ifdef OSK + /* assume all SCF (sequential character files) are ttys on OSK */ + + #include <sgstat.h> + + int isatty(fd) + int fd; + { + struct sgbuf sg; + + return _gs_opt(fd, &sg) >= 0 && sg.sg_class == 0; + } + #endif SHAR_EOF # End of shell archive exit 0 Bob Larson Arpa: Blarson@Ecla.Usc.Edu blarson@skat.usc.edu Uucp: {sdcrdcf,cit-vax}!oberon!skat!blarson Prime mailing list: info-prime-request%ais1@ecla.usc.edu oberon!ais1!info-prime-request