archie/prospero/lib/pfs/qtokenize.c
2024-05-27 16:13:40 +02:00

65 lines
2.1 KiB
C

/*
* Copyright (c) 1992, 1993 by the University of Southern California
*
* For copying and distribution information, please see the file <usc-copyr.h>
*/
#include <usc-copyr.h>
/* Written, 9/18/92, swa@isi.edu */
/* Made use 'previous' member 6/14/93, swa@isi.edu */
/* Got rid of double invocation of stcopy() for efficiency,. 5/15/94,
swa@ISI.EDU */
/* Break up a string into space-separated tokens and recognize Prospero
quoting. This strips off the quoting in the process. This function could
also be called p__tokenize_newstyle_mcomp(), and it serves that function.
It assumes the input string is correctly quoted.
*/
#include <pfs.h>
#include <pprot.h>
TOKEN
qtokenize(const char *s)
{
TOKEN retval;
int tmp;
AUTOSTAT_CHARPP(bufp);
/* We need a new interface to tkalloc() so we can avoid doing two stcopy()
operations on the same data. */
/* swa, 5/15/94: I decided to just make the code a bit longer, but used the
existing TKALLOC interface instead. This seems like less hassle than a
new interface, since it is not used very frequently. */
if (!s) return NULL;
retval = NULL;
for (;;) {
#if 1 /* 5/15/94 change --swa */
TOKEN tmptok;
#endif
tmp = qsscanf(s, "%'&s %r", bufp, &s);
assert(tmp >= 0); /* no possible error, I hope! */
if (tmp == 0)
return retval;
#if 1
tmptok = tkalloc((char *) NULL);
tmptok->token = *bufp;
*bufp = NULL; /* Leaving out this step cost almost a day's
work. Since *bufp sticks around, we should
mark it as free so that it is not reused
inappropriately. I now understand what
broke and why. --swa, 5/16/94 */
APPEND_ITEM(/* new */ tmptok, /* head */ retval);
/* This version just avoided the stcopy(). */
#else
/* This is the old less efficient version: --swa, 5/15/94 */
retval = tkappend(*bufp, retval);
#endif
if (tmp == 1) return retval; /* no more to tokenize. */
}
}