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