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