xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/9wait.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include "lib.h"
2*9a747e4fSDavid du Colombier #include <stdio.h>
3*9a747e4fSDavid du Colombier #include <string.h>
4*9a747e4fSDavid du Colombier #include <stdlib.h>
5*9a747e4fSDavid du Colombier #include "sys9.h"
6*9a747e4fSDavid du Colombier #include "dir.h"
7*9a747e4fSDavid du Colombier 
8*9a747e4fSDavid du Colombier static char qsep[] = " \t\r\n";
9*9a747e4fSDavid du Colombier 
10*9a747e4fSDavid du Colombier static char*
qtoken(char * s)11*9a747e4fSDavid du Colombier qtoken(char *s)
12*9a747e4fSDavid du Colombier {
13*9a747e4fSDavid du Colombier 	int quoting;
14*9a747e4fSDavid du Colombier 	char *t;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	quoting = 0;
17*9a747e4fSDavid du Colombier 	t = s;	/* s is output string, t is input string */
18*9a747e4fSDavid du Colombier 	while(*t!='\0' && (quoting || strchr(qsep, *t)==nil)){
19*9a747e4fSDavid du Colombier 		if(*t != '\''){
20*9a747e4fSDavid du Colombier 			*s++ = *t++;
21*9a747e4fSDavid du Colombier 			continue;
22*9a747e4fSDavid du Colombier 		}
23*9a747e4fSDavid du Colombier 		/* *t is a quote */
24*9a747e4fSDavid du Colombier 		if(!quoting){
25*9a747e4fSDavid du Colombier 			quoting = 1;
26*9a747e4fSDavid du Colombier 			t++;
27*9a747e4fSDavid du Colombier 			continue;
28*9a747e4fSDavid du Colombier 		}
29*9a747e4fSDavid du Colombier 		/* quoting and we're on a quote */
30*9a747e4fSDavid du Colombier 		if(t[1] != '\''){
31*9a747e4fSDavid du Colombier 			/* end of quoted section; absorb closing quote */
32*9a747e4fSDavid du Colombier 			t++;
33*9a747e4fSDavid du Colombier 			quoting = 0;
34*9a747e4fSDavid du Colombier 			continue;
35*9a747e4fSDavid du Colombier 		}
36*9a747e4fSDavid du Colombier 		/* doubled quote; fold one quote into two */
37*9a747e4fSDavid du Colombier 		t++;
38*9a747e4fSDavid du Colombier 		*s++ = *t++;
39*9a747e4fSDavid du Colombier 	}
40*9a747e4fSDavid du Colombier 	if(*s != '\0'){
41*9a747e4fSDavid du Colombier 		*s = '\0';
42*9a747e4fSDavid du Colombier 		if(t == s)
43*9a747e4fSDavid du Colombier 			t++;
44*9a747e4fSDavid du Colombier 	}
45*9a747e4fSDavid du Colombier 	return t;
46*9a747e4fSDavid du Colombier }
47*9a747e4fSDavid du Colombier 
48*9a747e4fSDavid du Colombier static int
tokenize(char * s,char ** args,int maxargs)49*9a747e4fSDavid du Colombier tokenize(char *s, char **args, int maxargs)
50*9a747e4fSDavid du Colombier {
51*9a747e4fSDavid du Colombier 	int nargs;
52*9a747e4fSDavid du Colombier 
53*9a747e4fSDavid du Colombier 	for(nargs=0; nargs<maxargs; nargs++){
54*9a747e4fSDavid du Colombier 		while(*s!='\0' && strchr(qsep, *s)!=nil)
55*9a747e4fSDavid du Colombier 			s++;
56*9a747e4fSDavid du Colombier 		if(*s == '\0')
57*9a747e4fSDavid du Colombier 			break;
58*9a747e4fSDavid du Colombier 		args[nargs] = s;
59*9a747e4fSDavid du Colombier 		s = qtoken(s);
60*9a747e4fSDavid du Colombier 	}
61*9a747e4fSDavid du Colombier 
62*9a747e4fSDavid du Colombier 	return nargs;
63*9a747e4fSDavid du Colombier }
64*9a747e4fSDavid du Colombier 
65*9a747e4fSDavid du Colombier Waitmsg*
_WAIT(void)66*9a747e4fSDavid du Colombier _WAIT(void)
67*9a747e4fSDavid du Colombier {
68*9a747e4fSDavid du Colombier 	int n, l;
69*9a747e4fSDavid du Colombier 	char buf[512], *fld[5];
70*9a747e4fSDavid du Colombier 	Waitmsg *w;
71*9a747e4fSDavid du Colombier 
72*9a747e4fSDavid du Colombier 	n = _AWAIT(buf, sizeof buf-1);
73*9a747e4fSDavid du Colombier 	if(n < 0)
74*9a747e4fSDavid du Colombier 		return nil;
75*9a747e4fSDavid du Colombier 	buf[n] = '\0';
76*9a747e4fSDavid du Colombier 	if(tokenize(buf, fld, 5) != 5){
77*9a747e4fSDavid du Colombier 		strcpy(buf, "couldn't parse wait message");
78*9a747e4fSDavid du Colombier 		_ERRSTR(buf, sizeof buf);
79*9a747e4fSDavid du Colombier 		return nil;
80*9a747e4fSDavid du Colombier 	}
81*9a747e4fSDavid du Colombier 	l = strlen(fld[4])+1;
82*9a747e4fSDavid du Colombier 	w = malloc(sizeof(Waitmsg)+l);
83*9a747e4fSDavid du Colombier 	if(w == nil)
84*9a747e4fSDavid du Colombier 		return nil;
85*9a747e4fSDavid du Colombier 	w->pid = atoi(fld[0]);
86*9a747e4fSDavid du Colombier 	w->time[0] = atoi(fld[1]);
87*9a747e4fSDavid du Colombier 	w->time[1] = atoi(fld[2]);
88*9a747e4fSDavid du Colombier 	w->time[2] = atoi(fld[3]);
89*9a747e4fSDavid du Colombier 	w->msg = (char*)&w[1];
90*9a747e4fSDavid du Colombier 	memmove(w->msg, fld[4], l);
91*9a747e4fSDavid du Colombier 	return w;
92*9a747e4fSDavid du Colombier }
93*9a747e4fSDavid du Colombier 
94