/* * Open input file with given define for C-preprocessor */ static void open_input(const char *infile, const char *define) { int pd[2]; int usevp; infilename = (infile == NULL) ? "<stdin>" : infile; pipe(pd); switch (childpid = fork()) { case 0: usevp = find_cpp(); putarg(0, CPP); putarg(1, CPPFLAGS); addarg(define); if (infile) addarg(infile); addarg(NULL); close(1); dup2(pd[1], 1); close(pd[0]); if (usevp) execvp(arglist[0], arglist); else execv(arglist[0], arglist); err(1, "execv(%s)", arglist[0]); case -1: err(1, "fork"); } close(pd[1]); fin = fdopen(pd[0], "r"); if (fin == NULL) { warn("%s", infilename); crash(); } }
/* * Open input file with given define for C-preprocessor */ static void open_input(char *infile, char *define) { int pd[2]; infilename = (infile == NULL) ? "<stdin>" : infile; (void) pipe(pd); switch (fork()) { case 0: putarg(0, "cpp"); putarg(1, CPPFLAGS); addarg(define); addarg(infile); addarg((char *)NULL); (void) close(1); (void) dup2(pd[1], 1); (void) close(pd[0]); if (cppDefined) execv(CPP, arglist); else { execvp("cpp", arglist); if (errno == ENOENT) execvp(SVR4_CPP, arglist); if (errno == ENOENT) execvp(SUNOS_CPP, arglist); } perror("execv"); exit(1); case -1: perror("fork"); exit(1); } (void) close(pd[1]); fin = fdopen(pd[0], "r"); if (fin == NULL) { f_print(stderr, "%s: ", cmdname); perror(infilename); crash(); } }
/* * Open input file with given define for C-preprocessor */ static void open_input (char *infile, char *define) { int pd[2]; infilename = (infile == NULL) ? "<stdin>" : infile; #ifdef __MSDOS__ #define DOSCPP "\\prog\\bc31\\bin\\cpp.exe" { int retval; char drive[MAXDRIVE], dir[MAXDIR], name[MAXFILE], ext[MAXEXT]; char cppfile[MAXPATH]; char *cpp; if ((cpp = searchpath ("cpp.exe")) == NULL && (cpp = getenv ("RPCGENCPP")) == NULL) cpp = DOSCPP; putarg (0, cpp); putarg (1, "-P-"); putarg (2, CPPFLAGS); addarg (define); addarg (infile); addarg (NULL); retval = spawnvp (P_WAIT, arglist[0], arglist); if (retval != 0) { fprintf (stderr, "%s: C PreProcessor failed\n", cmdname); crash (); } fnsplit (infile, drive, dir, name, ext); fnmerge (cppfile, drive, dir, name, ".i"); fin = fopen (cppfile, "r"); if (fin == NULL) { f_print (stderr, "%s: ", cmdname); perror (cppfile); crash (); } dos_cppfile = strdup (cppfile); if (dos_cppfile == NULL) { fprintf (stderr, "%s: out of memory\n", cmdname); crash (); } } #else (void) pipe (pd); switch (fork ()) { case 0: putarg (0, CPP); putarg (1, CPPFLAGS); addarg (define); addarg (infile); addarg ((char *) NULL); (void) close (1); (void) dup2 (pd[1], 1); (void) close (pd[0]); execv (arglist[0], arglist); perror ("execv"); exit (1); case -1: perror ("fork"); exit (1); } (void) close (pd[1]); fin = fdopen (pd[0], "r"); #endif if (fin == NULL) { f_print (stderr, "%s: ", cmdname); perror (infilename); crash (); } }
void _setargv__(void) { unsigned char far *cmdtail; unsigned char *firstarg; unsigned char far *cmdarg; int wild; int c; unsigned char buffer[129]; unsigned char *p, *q; unsigned char *lastdir; char **wargv; int i; struct ffblk ffb; cmdtail = MK_FP(_psp, 0x81); cmdtail[cmdtail[-1]] = '\0'; /* make sure null at end */ firstarg = (unsigned char *) sbrk(0); _C0argc = 1; while (*cmdtail != '\0') { /* skip white space */ while (isascii(*cmdtail) && isspace(*cmdtail)) ++cmdtail; /* done with command loop if end of command tail */ if (*cmdtail == '\0') break; /* if quoted string, just save the argument */ if ((c = *cmdtail) == '"' || c == '\'') { cmdarg = ++cmdtail; while (*cmdtail != c && *cmdtail != '\0') ++cmdtail; putarg(cmdarg, cmdtail, 0); if (*cmdtail != '\0') ++cmdtail; continue; } /* find word */ cmdarg = cmdtail; wild = FALSE; p = lastdir = buffer; while ((c = *cmdtail) != '\0' && (!isascii(c) || !isspace(c))) { /* wild is TRUE if word contains * or ? */ wild |= (c == '*' || c == '?'); /* Next line was added to make the treatment of / and \ alike */ if (c == '/') c = '\\'; *(p++) = c; /* lastdir points to the first character of the base file name */ if (c == '\\' || c == ':') lastdir = p; ++cmdtail; } *p = '\0'; if (*cmdarg == '-' || *cmdarg == '+') putarg(cmdarg, cmdtail, 0); else if (wild) { c = findfirst((char *) buffer, &ffb, 0); if (c) putarg(cmdarg, cmdtail, 0); else while (!c) { for (p = lastdir, q = (unsigned char *) FILENAME(ffb); *q != '\0';) *(p++) = *(q++); putarg(buffer, p, 1); /* use lowercase for filenames */ c = findnext(&ffb); } } else putarg(cmdarg, cmdtail, 1); /* use lowercase for filenames */ } /* allocate argv */ if ((wargv = (char **) sbrk(sizeof(char *) * (_C0argc + 1))) == (char **) -1) abort(); _C0argv = wargv; /* store program name */ if (_osmajor < 3) *(wargv++) = "C"; else { cmdtail = cmdarg = MK_FP(_envseg, _envLng + 2); # if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) *(wargv++) = sbrk(0); while (*cmdtail != '\0') ++cmdtail; putarg(cmdarg, cmdtail, 0); --_C0argc; # else *(wargv++) = (char *) cmdarg; (void) sbrk(15); /* kludge for TC++ library bug */ # endif } /* store arguments */ for (i = _C0argc; --i;) { *(wargv++) = (char *) firstarg; while(*++firstarg != '\0') ; ++firstarg; } *wargv = (char *) 0; errno = 0; }