Category : C Source Code
Archive   : PATCH12.ZIP
Filename : TCPATCH3.DIF

 
Output of file : TCPATCH3.DIF contained in archive : PATCH12.ZIP
TurboC2.0 Patches to enable ed scripts and fix TMP env var
Prereq: 2
*** tcpatlev.h Wed Jul 18 10:37:44 1990
--- tcpatlev.new Wed Jul 18 10:38:10 1990
***************
*** 1,1 ****
! #define TCPATCHLEVEL 2
--- 1,1 ----
! #define TCPATCHLEVEL 3
*** readme Wed Jul 18 09:53:56 1990
--- readme.new Wed Jul 18 09:53:22 1990
***************
*** 90,92 ****
--- 90,165 ----
improved (more descriptive) usage message
temp files go in directory specified by TMP env var (or current dir if no TMP)
ed scripts still disabled
+
+
+ *** OFFICIAL PATCHLEVEL 12, TurboC2.0 PATCHLEVEL 3
+
+ Path: uwvax!ub.d.umn.edu!rutgers!usc!samsung!munnari.oz.au!bunyip!brolga!aas
+ From: [email protected] (Alex Sergejew)
+ Date: 15 Jul 90 11:03:51 GMT
+
+ The following are comments and patches to the patches to Larry Wall's patch
+ program (patchlevel 12) recently submitted by [email protected]
+ (Michael Ward) to allow compilation with Turbo C 2.0 and to run under MSDOS.
+
+ I have addressed a couple of recent bug reports and also re-enabled the
+ use of ed scripts (given a working MSDOS ed program, of which simtel20
+ has several that are compatible with unix V7 ed).
+
+ New files are:
+ popen c 10579 7-15-90 3:58p
+ popen h 69 3-08-88 8:08p
+ getswitc c 290 3-08-88 8:08p
+ popentst mak 303 7-15-90 3:43p
+
+ These provide the popen() functionality and were snarfed from simtel20
+ in `pd1:popen.arc'. The original author's name is not given.
+ Try `make -fpopentst' to check-out the DEMO mode (see popen.c) but
+ remember to delete popen.obj and getswitc.obj from this trial before
+ compiling the merged/patched version of patch.
+
+ Alex A Sergejew
+ University of Queensland Neuro-Psychiatric Institute
+ [email protected]
+
+ ---------------------------
+ [email protected] (Neil Weisenfeld) reports getting a run-time
+ error of the form:
+ patch: couldn't create D:\/patchpxxxxxx
+
+ This is due to having the TMP environment variable set to "D:\"
+ (note that a lot of MSDOS software actually wants the trailing "\").
+ Patch as distributed blindly concatenates /patch?xxxxxx strings and the
+ "\/" juxtaposition causes strife to MSDOS. The problem does not arise using
+ other shells such as ms_sh or ksh. A temporary workaround is to re-set the
+ TMP environment variable without the trailing "\".
+
+ This has been repaired in the appended patches.
+
+ ---------------------------
+ [email protected] correctly observes that:
+ >>In file INP.C, there is a procedure called rev_in_string() at the bottom.
+
+ >>This procedure declares a local variable "s", which is then used without
+ >>first being given a value. This instance of "s" should be replaced with
+ >>the parameter "string" instead on that one line.
+
+ This has also been repaired in the appended patches.
+
+ ---------------------------
+ There are still warnings reported by Turbo C in compiling the distribution:
+
+ In pch.c:
+ 243: Possible use of 'fcntl_line' before definition ...
+ the variable concerned is not in fact used before definition and the warning
+ can be safely ignored.
+
+ In popen.c there appear 3 warnings of the type:
+ xxx: 'lineno' is assigned a value which is never used in function ...
+ which can also be ignored (the variable is used in DEMO mode).
+
+ In util.c:
+ 177: possibly incorrect assignment ....
+ the message is misleading (see the Turbo C User Manual).
+
+
*** makefile Sat Jun 02 16:13:34 1990
--- makefile.new Sun Jul 15 15:59:34 1990
***************
*** 1,8 ****
CC = tcc
CFLAGS = -N -ml -DTURBOC20

! c = patch.c pch.c inp.c version.c util.c
! obj = patch.obj pch.obj inp.obj util.obj version.obj

.c.obj:
$(CC) -c $(CFLAGS) $(LARGE) $*.c
--- 1,8 ----
CC = tcc
CFLAGS = -N -ml -DTURBOC20

! c = patch.c pch.c inp.c version.c util.c popen.c getswitc.c
! obj = patch.obj pch.obj inp.obj version.obj util.obj popen.obj getswitc.obj

.c.obj:
$(CC) -c $(CFLAGS) $(LARGE) $*.c
***************
*** 12,18 ****

patch.obj: config.h common.h patch.c inp.h pch.h util.h version.h

! pch.obj: config.h common.h pch.c pch.h util.h

inp.obj: config.h common.h inp.c inp.h util.h

--- 12,18 ----

patch.obj: config.h common.h patch.c inp.h pch.h util.h version.h

! pch.obj: config.h common.h pch.c pch.h util.h popen.h

inp.obj: config.h common.h inp.c inp.h util.h

***************
*** 19,21 ****
--- 19,25 ----
util.obj: config.h common.h util.c util.h

version.obj: config.h common.h version.c version.h patchlevel.h util.h
+
+ popen.obj: popen.c popen.h
+
+ getswitc.obj: getswitc.c
*** inp.c Sun Jul 15 12:41:14 1990
--- inp.new Sun Jul 15 13:50:30 1990
***************
*** 1,6 ****
! /* $Header: inp.c,v 2.0.1.2 90/05/30 11:30:00 mward $
*
* $Log: inp.c,v $
* Revision 2.0.1.2 90/05/30 11:30:00 mward
* if TURBOC20 have plan_a check against MAXMEMBLK before mallocs
* if TURBOC20 have plan_b use binary mode io for tmp file
--- 1,10 ----
! /* $Header: inp.c,v 2.0.1.3 90/07/15 13:52:00 aas $
*
* $Log: inp.c,v $
+ * Revision 2.0.1.3 90/07/15 13:52:00 aas
+ * include bugfix reported by [email protected] in rev_in_string()
+ * regarding parameter string[] typo in first strnEQ() line
+ *
* Revision 2.0.1.2 90/05/30 11:30:00 mward
* if TURBOC20 have plan_a check against MAXMEMBLK before mallocs
* if TURBOC20 have plan_b use binary mode io for tmp file
***************
*** 323,329 ****
if (revision == Nullch)
return TRUE;
patlen = strlen(revision);
! if (strnEQ(string,revision,patlen) && isspace(s[patlen]))
return TRUE;
for (s = string; *s; s++) {
if (isspace(*s) && strnEQ(s+1, revision, patlen) &&
--- 327,333 ----
if (revision == Nullch)
return TRUE;
patlen = strlen(revision);
! if (strnEQ(string,revision,patlen) && isspace(string[patlen]))
return TRUE;
for (s = string; *s; s++) {
if (isspace(*s) && strnEQ(s+1, revision, patlen) &&
*** patch.c Sun Jul 15 12:46:42 1990
--- patch.new Sun Jul 15 14:02:18 1990
***************
*** 1,5 ****
char rcsid[] =
! "$Header: patch.c,v 2.0.1.7 90/05/30 11:30:00 mward $";

/* patch - a program to apply diffs to original files
*
--- 1,5 ----
char rcsid[] =
! "$Header: patch.c,v 2.0.1.8 90/07/15 14:00:00 aas $";

/* patch - a program to apply diffs to original files
*
***************
*** 9,14 ****
--- 9,17 ----
* money off of it, or pretend that you wrote it.
*
* $Log: patch.c,v $
+ * Revision 2.0.1.7 90/07/15 14:00:00 aas
+ * made init temp file names a little more MS-DOS aware
+ *
* Revision 2.0.1.7 90/05/30 11:30:00 mward
* Added usage message vars and routines: use_msg, progname, usage, fname
* Check environment for TMP and init temp file names
***************
*** 206,212 ****
int i;
char tmpdir[MAXPATH];
char *tmpenv;
!

progname = (*argv[0]?argv[0]:"patch");
setbuf(stderr, serrbuf);
--- 209,215 ----
int i;
char tmpdir[MAXPATH];
char *tmpenv;
! char c;

progname = (*argv[0]?argv[0]:"patch");
setbuf(stderr, serrbuf);
***************
*** 216,222 ****
/* initialize temp file names */
tmpenv = getenv("TMP");
strcpy(tmpdir,(tmpenv!=NULL?tmpenv:""));
! if (strlen(tmpdir) && tmpdir[strlen(tmpdir)-1]!='/') strcat(tmpdir,"/");
TMPOUTNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPOUTNAME));
TMPINNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPINNAME));
TMPREJNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPREJNAME));
--- 219,227 ----
/* initialize temp file names */
tmpenv = getenv("TMP");
strcpy(tmpdir,(tmpenv!=NULL?tmpenv:""));
! if (strlen(tmpdir))
! if((c=tmpdir[strlen(tmpdir)-1])!='/' && c!='\\')
! strcat(tmpdir,"/");
TMPOUTNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPOUTNAME));
TMPINNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPINNAME));
TMPREJNAME = strcat(strcpy(malloc(MAXPATH),tmpdir),fname(TMPREJNAME));
*** pch.c Sun Jul 15 12:41:50 1990
--- pch.new Sun Jul 15 15:23:00 1990
***************
*** 1,6 ****
! /* $Header: pch.c,v 2.0.1.7 90/05/30 11:30:00 mward $
*
* $Log: pch.c,v $
* Revision 2.0.1.8 90/05/30 11:30:00 mward
* replace do_ed_script with stub
* modify calls to read, write to detect error on return value of -1
--- 1,9 ----
! /* $Header: pch.c,v 2.0.1.9 90/07/15 15:27:00 aas $
*
* $Log: pch.c,v $
+ * Revision 2.0.1.9 90/07/15 15:27:00 aas
+ * put do_ed_script() back the way it was and slot-in MSDOS popen/pclose
+ *
* Revision 2.0.1.8 90/05/30 11:30:00 mward
* replace do_ed_script with stub
* modify calls to read, write to detect error on return value of -1
***************
*** 38,43 ****
--- 41,49 ----
#include "util.h"
#include "INTERN.h"
#include "pch.h"
+ #ifdef TURBOC20
+ #include "popen.h"
+ #endif

/* Patch (diff listing) abstract type. */

***************
*** 1062,1077 ****
return p_hunk_beg;
}

- #ifdef TURBOC20
- /* Ignore an ed script. */
-
- void
- do_ed_script()
- {
- say1("Sorry, can't do ed scripts yet!\n");
- say1("Use ed to do this one yourself!\n");
- }
- #else
/* Apply an ed script by feeding ed itself. */

void
--- 1068,1073 ----
***************
*** 1086,1095 ****
--- 1082,1095 ----
if (!skip_rest_of_patch) {
Unlink(TMPOUTNAME);
copy_file(filearg[0], TMPOUTNAME);
+ #ifdef TURBOC20
+ Sprintf(buf, "ed %s", TMPOUTNAME);
+ #else
if (verbose)
Sprintf(buf, "/bin/ed %s", TMPOUTNAME);
else
Sprintf(buf, "/bin/ed - %s", TMPOUTNAME);
+ #endif
pipefp = popen(buf, "w");
}
for (;;) {
***************
*** 1135,1138 ****
chmod(outname, filemode);
set_signals(1);
}
! #endif
--- 1135,1138 ----
chmod(outname, filemode);
set_signals(1);
}

!
*** /dev/null
--- popen.h Tue Mar 08 20:08:36 1988
***************
*** 0 ****
--- 1,2 ----
+ extern FILE *popen( char *, char * );
+ extern int pclose( FILE * );
*** /dev/null
--- popen.c Sun Jul 15 15:58:08 1990
***************
*** 0 ****
--- 1,339 ----
+ /* popen/pclose:
+ *
+ * simple MS-DOS piping scheme to imitate UNIX pipes
+ *
+ * $Log: popen.c,v $
+ * Revision 1.0.1 90/07/15 14:05:00 aas
+ * fix assumption of trailing "/" in popen()
+ *
+ * Revision 1.0.0 88/08/03 20:08:00 ???
+ * original distribution: author unknown
+ * found on simtel20 as pd1:popen.arc
+ *
+ */
+
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #include "popen.h"
+
+ extern char *getenv( char * );
+
+ #ifndef _NFILE
+ # define _NFILE OPEN_MAX /* Number of open files */
+ #endif _NFILE
+
+ #define READIT 1 /* Read pipe */
+ #define WRITEIT 2 /* Write pipe */
+
+ static char *prgname[ _NFILE ]; /* program name if write pipe */
+ static int pipetype[ _NFILE ]; /* 1=read 2=write */
+ static char *pipename[ _NFILE ]; /* pipe file name */
+
+ /*
+ *------------------------------------------------------------------------
+ * stoupper: Convert string to uppercase (in place)
+ *------------------------------------------------------------------------
+ */
+
+ static void
+ stoupper( s )
+ char *s;
+ {
+ int c;
+ for( ; (c = *s) != '\0'; ++s ) {
+ if( islower( c ) ) *s = _toupper( c );
+ }
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * strsave: Copy string into malloc'ed memory and return address
+ *------------------------------------------------------------------------
+ */
+
+ static char *
+ strsave( s )
+ char *s;
+ {
+ char *sp = malloc( strlen( s ) + 1 );
+ if( sp != (char *) NULL ) (void) strcpy( sp, s );
+ return( sp );
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * strfree: Returm strsave'd string memory
+ *------------------------------------------------------------------------
+ */
+
+ static void
+ strfree( s )
+ char *s;
+ {
+ if( s != (char *) NULL ) free( s );
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * run: Execute command via SHELL or COMSPEC
+ *------------------------------------------------------------------------
+ */
+
+ static int
+ run( command )
+ char *command;
+ {
+ jmp_buf panic; /* How to recover from errors */
+ int lineno; /* Line number where panic happened */
+ char *shell; /* Command processor */
+ char *s = (char *) NULL; /* Holds the command */
+ int s_is_malloced = 0; /* True if need to free 's' */
+ static char *command_com = "COMMAND.COM";
+ int status; /* Return codes */
+ char *shellpath; /* Full command processor path */
+ char *bp; /* Generic string pointer */
+ static char dash_c[ 3 ] = { '?', 'c', '\0' };
+ if( (lineno = setjmp( panic )) != 0 ) {
+ int E = errno;
+ #ifdef DEMO
+ fprintf( stderr, "RUN panic on line %d: %d\n", lineno, E );
+ #endif DEMO
+ if( s_is_malloced && (s != (char *) NULL) ) strfree( s );
+ errno = E;
+ return( -1 );
+ }
+ if( (s = strsave( command )) == (char *) NULL ) longjmp( panic, __LINE__ );
+ /* Determine the command processor */
+ if( ((shell = getenv( "SHELL" )) == (char *) NULL) &&
+ ((shell = getenv( "COMSPEC" )) == (char *) NULL) ) shell = command_com;
+ stoupper( shell );
+ shellpath = shell;
+ /* Strip off any leading backslash directories */
+ shell = strrchr( shellpath, '\\' );
+ if( shell != (char *) NULL ) ++shell;
+ else shell = shellpath;
+ /* Strip off any leading slash directories */
+ bp = strrchr( shell, '/' );
+ if( bp != (char *) NULL ) shell = ++bp;
+ if( strcmp( shell, command_com ) != 0 ) {
+ /* MKS Shell needs quoted argument */
+ char *bp;
+ if( (bp = s = malloc( strlen( command ) + 3 )) == (char *) NULL )
+ longjmp( panic, __LINE__ );
+ *bp++ = '\'';
+ while( (*bp++ = *command++) != '\0' );
+ *(bp - 1) = '\'';
+ *bp = '\0';
+ s_is_malloced = 1;
+ } else s = command;
+ dash_c[ 0 ] = getswitch();
+ /* Run the program */
+ #ifdef DEMO
+ fprintf( stderr, "Running: (%s) %s %s %s\n", shellpath, shell, dash_c, s );
+ #endif DEMO
+ status = spawnl( P_WAIT, shellpath, shell, dash_c, s, (char *) NULL );
+ if( s_is_malloced ) free( s );
+ return( status );
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * uniquepipe: returns a unique file name
+ *------------------------------------------------------------------------
+ */
+
+ static char *
+ uniquepipe()
+ {
+ static char name[ 14 ];
+ static short int num = 0;
+ (void) sprintf( name, "pipe%05d.tmp", num++ );
+ return( name );
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * resetpipe: Private routine to cancel a pipe
+ *------------------------------------------------------------------------
+ */
+
+ static void
+ resetpipe( fd )
+ int fd;
+ {
+ char *bp;
+ if( (fd >= 0) && (fd < _NFILE) ) {
+ pipetype[ fd ] = 0;
+ if( (bp = pipename[ fd ]) != (char *) NULL ) {
+ (void) unlink( bp );
+ strfree( bp );
+ pipename[ fd ] = (char *) NULL;
+ }
+ if( (bp = prgname[ fd ]) != (char *) NULL ) {
+ strfree( bp );
+ prgname[ fd ] = (char *) NULL;
+ }
+ }
+ }
+
+ /*
+ *------------------------------------------------------------------------
+ * popen: open a pipe
+ *------------------------------------------------------------------------
+ */
+
+ FILE *popen( prg, type )
+ char *prg; /* The command to be run */

+ char *type; /* "w" or "r" */
+ {
+ FILE *p = (FILE *) NULL; /* Where we open the pipe */
+ int ostdin; /* Where our stdin is now */
+ int pipefd = -1; /* fileno( p ) -- for convenience */
+ char tmpfile[ BUFSIZ ]; /* Holds name of pipe file */
+ char *tmpdir; /* Points to directory prefix of pipe */
+ jmp_buf panic; /* Where to go if there's an error */
+ int lineno; /* Line number where panic happened */
+ char c; /* aas */
+ /* Find out where we should put temporary files */
+ if( (tmpdir = getenv( "TMPDIR" )) == (char *) NULL )
+ tmpdir = getenv( "TMP" );
+ if( tmpdir != (char *) NULL ) {
+ /* Use temporary directory if available */
+ (void) strcpy( tmpfile, tmpdir );
+ if((c=tmpfile[strlen(tmpfile)-1])!='/' && c!='\\') /* aas */
+ (void) strcat( tmpfile, "/" );
+ } else *tmpfile = '\0';
+ /* Get a unique pipe file name */
+ (void) strcat( tmpfile, uniquepipe() );
+ if( (lineno = setjmp( panic )) != 0 ) {
+ /* An error has occurred, so clean up */
+ int E = errno;
+ #ifdef DEMO
+ fprintf( stderr, "POPEN panic on line %d: %d\n", lineno, E );
+ #endif DEMO
+ if( p != (FILE *) NULL ) (void) fclose( p );
+ resetpipe( pipefd );
+ errno = E;
+ return( (FILE *) NULL );
+ }
+ if( strcmp( type, "w" ) == 0 ) {
+ /* for write style pipe, pclose handles program execution */
+ if( (p = fopen( tmpfile, "w" )) != (FILE *) NULL ) {
+ pipefd = fileno( p );
+ pipetype[ pipefd ] = WRITEIT;
+ pipename[ pipefd ] = strsave( tmpfile );
+ prgname[ pipefd ] = strsave( prg );
+ if( !pipename[ pipefd ] || !prgname[ pipefd ] ) longjmp( panic, __LINE__ );
+ }
+ } else if( strcmp( type, "r" ) == 0 ) {
+ /* read pipe must create tmp file, set up stdout to point to the temp
+ * file, and run the program. note that if the pipe file cannot be
+ * opened, it'll return a condition indicating pipe failure, which is
+ * fine.
+ */
+ if( (p = fopen( tmpfile, "w" )) != (FILE *) NULL ) {
+ int ostdout;
+ pipefd = fileno( p );
+ pipetype[ pipefd ]= READIT;
+ if( (pipename[ pipefd ] = strsave( tmpfile )) == (char *) NULL )
+ longjmp( panic, __LINE__ );
+ /* Redirect stdin for the new command */
+ ostdout = dup( fileno( stdout ) );
+ if( dup2( fileno( stdout ), pipefd ) < 0 ) {
+ int E = errno;
+ (void) dup2( fileno( stdout ), ostdout );
+ errno = E;
+ longjmp( panic, __LINE__ );
+ }
+ if( run( prg ) != 0 ) longjmp( panic, __LINE__ );
+ if( dup2( fileno( stdout ), ostdout ) < 0 ) longjmp( panic, __LINE__ );
+ if( fclose( p ) < 0 ) longjmp( panic, __LINE__ );
+ if( (p = fopen( tmpfile, "r" )) == (FILE *) NULL ) longjmp( panic, __LINE__ );
+ }
+ } else {
+ /* screwy call or unsupported type */
+ errno = EINVFNC;
+ longjmp( panic, __LINE__ );
+ }
+ return( p );
+ }
+
+ /* close a pipe */
+
+ int
+ pclose( p )
+ FILE *p;
+ {
+ int pipefd = -1; /* Fildes where pipe is opened */
+ int ostdout; /* Where our stdout points now */
+ int ostdin; /* Where our stdin points now */
+ jmp_buf panic; /* Context to return to if error */
+ int lineno; /* Line number where panic happened */
+ if( (lineno = setjmp( panic )) != 0 ) {
+ /* An error has occurred, so clean up and return */
+ int E = errno;
+ #ifdef DEMO
+ fprintf( stderr, "POPEN panic on line %d: %d\n", lineno, E );
+ #endif DEMO
+ if( p != (FILE *) NULL ) (void) fclose( p );
+ resetpipe( pipefd );
+ errno = E;
+ return( -1 );
+ }
+ pipefd = fileno( p );
+ if( fclose( p ) < 0 ) longjmp( panic, __LINE__ );
+ switch( pipetype[ pipefd ] ) {
+ case WRITEIT:
+ /* open the temp file again as read, redirect stdin from that
+ * file, run the program, then clean up.
+ */
+ if( (p = fopen( pipename[ pipefd ],"r" )) == (FILE *) NULL )
+ longjmp( panic, __LINE__ );
+ ostdin = dup( fileno( stdin ));
+ if( dup2( fileno( stdin ), fileno( p ) ) < 0 ) longjmp( panic, __LINE__ );
+ if( run( prgname[ pipefd ] ) != 0 ) longjmp( panic, __LINE__ );
+ if( dup2( fileno( stdin ), ostdin ) < 0 ) longjmp( panic, __LINE__ );
+ if( fclose( p ) < 0 ) longjmp( panic, __LINE__ );
+ resetpipe( pipefd );
+ break;
+ case READIT:
+ /* close the temp file and remove it */
+ resetpipe( pipefd );
+ break;
+ default:
+ errno = EINVFNC;
+ longjmp( panic, __LINE__ );
+ /*NOTREACHED*/
+ }
+ return( 0 );
+ }
+
+ #ifdef DEMO
+ int
+ main( argc, argv )
+ int argc;
+ char **argv;
+ {
+ FILE *pipe;
+ char buf[ BUFSIZ ];
+ int n;
+ *buf = '\0';
+ for( n = 1; n < argc; ++n ) {
+ (void) strcat( buf, argv[ n ] );
+ (void) strcat( buf, " " );
+ }
+ if( (pipe = popen( buf, "r" )) != (FILE *) NULL ) {
+ while( fgets( buf, sizeof( buf ), pipe ) != (char *) NULL )
+ (void) fputs( buf, stdout );
+ if( pclose( pipe ) != 0 ) fprintf( stderr, "error closing pipe!\n" );
+ } else fprintf( stderr, "it didn't work!\n" );
+ exit( 0 );
+ /*NOTREACHED*/
+ }
+ #endif DEMO
*** /dev/null
--- getswitc.c Tue Mar 08 20:08:04 1988
***************
*** 0 ****
--- 1,16 ----
+ #include
+ #include
+
+ static char SW = 0; /* DOS switch character, either '-' or '/' */
+
+ int
+ getswitch()
+ {
+ if (SW == 0) {
+ /* get SW using dos call 0x37 */
+ _AX = 0x3700;
+ geninterrupt(0x21);
+ SW = _DL;
+ }
+ return( SW & 0xFF );
+ }
*** /dev/null
--- popentst.mak Sun Jul 15 15:43:08 1990
***************
*** 0 ****
--- 1,18 ----
+ popen.exe: popen.obj getswitch.obj
+ tcc -epopen popen.obj getswitch.obj
+
+ popen.obj: popen.c popen.h
+ tcc -c -DDEMO popen.c
+
+ getswitch.obj: getswitch.c
+ tcc -c getswitch.c
+
+ clean:
+ rm -f *.obj core *.map

+
+ clobber: clean
+ rm -f *.exe install
+
+ install:
+ tcc -c popen.c
+ @echo What next?




  3 Responses to “Category : C Source Code
Archive   : PATCH12.ZIP
Filename : TCPATCH3.DIF

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/