ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/lib/libdgl/scanargs.c

This is scanargs.c in view mode; [Download] [Up]

/*
 * scanbuf - carve up a character array containing comma- or blank-separated
 * arguments.  It puts a pointer to the head of each argument in the
 * array of char *pn, which you pass it.  It puts a NULL (possibly several)
 * at the end of each argument.  It modifies the array args to do this.
 * It quits when it scans more than
 * nargs arguments (which is presumably set to the boundary of pn[]).
 * It returns the number of arguments it found.
 * The sb parameter will, if true, cause semicolons to break the scan,
 * returning the number of fields scanned up to that point.  The global
 * variable scan_rem will then contain a pointer to the remainder
 * of the un-scanned string (it is otherwise NULL).
 * Note: pass the address of the first element of the pn array.
 * See example main program below.
 */

#include <stdio.h>
#include <ctype.h>
#include <carl/dglib.h>

char *scan_rem;

scanargs(args, pn, nargs, sb)
	char *args;
	char **pn;
	int nargs, sb;
{
	register char *c, *d;
	register int trigger = 0, i = 0;

	scan_rem = NULL;
	while (isspace(*args)) args++;
	for (c = args; *c != NULL; c++) {
		if (sb && *c == ';') {
			*c++ = '\0';
			scan_rem = c;
			break;
		}
		if (!isspace(*c)) { 
			if (!trigger) { 
				if (*c == ',') {
					if (i >= nargs)
						break;
					pn[i++] = c;	/* null p field */
					continue;
				}
				if (i >= nargs)
					break;
				pn[i++] = c; 
				trigger++; 
			} else {
				if (*c == ',' || *c == ';') {
					*c = '\0';
					trigger = 0;
				}
			}
		} else {
			*c = NULL; 
			trigger = 0; 
		}
	}
	return(i);
}

/*
 * main(argc, argv)
 * 	char **argv;
 * {
 * 	static char *line="one two, three four; five six;";
 * 	char *pn[32];
 * 	int cnt, i;
 * 
 * 	cnt = scanargs(line, &pn[0], 32, SEMIBREAK);
 * 	for (i = 0; i < cnt; i++)
 * 		printf("%s\n", pn[i]);
 * 	if (scan_rem != NULL)
 * 		printf("scan_rem=%s\n", scan_rem);
 * }
 */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.