|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 2529 (0x9e1)
Types: TextFile
Names: »breakargs.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/ease/maketd/breakargs.c«
/* breakargs - break a string into a string vector for execv.
* Returns NULL if can't malloc space for vector, else vector.
* Note, when done with the vector, mearly "free" the vector.
* Written by Stephen Uitti, PUCC, Nov '85 for the new version
* of "popen" - "nshpopen", that doesn't use a shell.
* (used here for the as filters, a newer option).
*
* breakargs is copyright (C) Purdue University, 1985
*
* put in a fix for cmds lines with "string string" in them
* Mon Aug 25 13:34:27 EST 1986 (ksb)
*
* Permission is hereby given for its free reproduction and
* modification for non-commercial purposes, provided that this
* notice and all embedded copyright notices be retained.
* Commercial organisations may give away copies as part of their
* systems provided that they do so without charge, and that they
* acknowledge the source of the software.
*/
#ifdef BSD2_9
#include <sys/types.h>
#endif
#include <stdio.h> /* for nothing, really */
#define SPC '\040' /* ascii space */
char *
mynext(pch)
register char *pch;
{
register int fQuote;
for (fQuote = 0; (*pch != '\000' && *pch != SPC && *pch != '\t')||fQuote; ++pch) {
if ('\\' == *pch) {
continue;
}
switch (fQuote) {
default:
case 0:
if ('"' == *pch) {
fQuote = 1;
} else if ('\'' == *pch) {
fQuote = 2;
}
break;
case 1:
if ('"' == *pch)
fQuote = 0;
break;
case 2:
if ('\'' == *pch)
fQuote = 0;
break;
}
}
return pch;
}
char **
breakargs(cmd)
char *cmd;
{
register char *p; /* tmp */
register char **v; /* vector of commands returned */
register unsigned sum; /* bytes for malloc */
register int i; /* number of args */
register char *s; /* save old position */
char *malloc(), *strcpy();
p = cmd;
while (*p == SPC || *p == '\t')
p++;
cmd = p; /* no leading spaces */
sum = sizeof(char *);
i = 0;
while (*p != '\0') { /* space for argv[]; */
++i;
s = p;
p = mynext(p);
sum += sizeof(char *) + 1 + (unsigned)(p - s);
while (*p == SPC || *p == '\t')
p++;
}
++i;
/* vector starts at v, copy of string follows NULL pointer */
v = (char **)malloc(sum+1);
if (v == NULL)
return (char **)NULL;
p = (char *)v + i * sizeof(char *); /* after NULL pointer */
i = 0; /* word count, vector index */
while (*cmd != '\0') {
v[i++] = p;
s = cmd;
cmd = mynext(cmd);
if (*cmd != '\0')
*cmd++ = '\0';
strcpy(p, s);
p += strlen(p);
++p;
while (*cmd == SPC || *cmd == '\t')
++cmd;
}
v[i] = (char *)NULL;
return v;
}