]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/gettok.c
ea0a8e38b05192b5719bbb324359162cd1ed7c9f
[netatalk.git] / etc / afpd / gettok.c
1 /*
2  * Copyright (c) 1990,1994 Regents of The University of Michigan.
3  * All Rights Reserved.  See COPYRIGHT.
4  */
5
6 #include <sys/param.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <pwd.h>
10
11 #include "globals.h"
12
13 static char     *l_curr;
14 static char     *l_end;
15
16 void initline( len, line )
17     int         len;
18     char        *line;
19 {
20     l_curr = line;
21     l_end = line + len;
22 }
23
24 #define ST_QUOTE        0
25 #define ST_WORD         1
26 #define ST_BEGIN        2
27
28     int
29 parseline( len, token )
30     int         len;
31     char        *token;
32 {
33     char        *p, *e;
34     int         state;
35
36     state = ST_BEGIN;
37     p = token;
38     e = token + len;
39
40     for (;;) {
41         if ( l_curr > l_end ) {                 /* end of line */
42             *token = '\0';
43             return( -1 );
44         }
45
46         switch ( *l_curr ) {
47         case '"' :
48             if ( state == ST_QUOTE ) {
49                 state = ST_WORD;
50             } else {
51                 state = ST_QUOTE;
52             }
53             break;
54
55         case '\0' :
56         case '\t' :
57         case '\n' :
58         case ' ' :
59             if ( state == ST_WORD ) {
60                 *p = '\0';
61                 return( p - token );
62             }
63             if ( state != ST_QUOTE ) {
64                 break;
65             }
66             /* FALL THROUGH */
67
68         default :
69             if ( state == ST_BEGIN ) {
70                 state = ST_WORD;
71             }
72             if ( p > e ) {                      /* end of token */
73                 *token = '\0';
74                 return( -1 );
75             }
76             *p++ = *l_curr;
77             break;
78         }
79
80         l_curr++;
81     }
82 }
83
84 #ifdef notdef
85 void parseline( token, user )
86     char        *token, *user;
87 {
88     char                *p = pos, *t = token, *u, *q, buf[ MAXPATHLEN ];
89     struct passwd       *pwent;
90     int                 quoted = 0;
91
92     while ( isspace( *p )) {
93         p++;
94     }
95
96     /*
97      * If we've reached the end of the line, or a comment,
98      * don't return any more tokens.
99      */
100     if ( *p == '\0' || *p == '#' ) {
101         *token = '\0';
102         return;
103     }
104
105     if ( *p == '"' ) {
106         p++;
107         quoted = 1;
108     }
109     while ( *p != '\0' && ( quoted || !isspace( *p ))) {
110         if ( *p == '"' ) {
111             if ( quoted ) {
112                 *t = '\0';
113                 break;
114             }
115             quoted = 1;
116             p++;
117         } else {
118             *t++ = *p++;
119         }
120     }
121     pos = p;
122     *t = '\0';
123
124     /*
125      * We got to the end of the line without closing an open quote
126      */
127     if ( *p == '\0' && quoted ) {
128         *token = '\0';
129         return;
130     }
131
132     t = token;
133     if ( *t == '~' ) {
134         t++;
135         if ( *t == '\0' || *t == '/' ) {
136             u = user;
137             if ( *t == '/' ) {
138                 t++;
139             }
140         } else {
141             u = t;
142             if (( q = strchr( t, '/' )) == NULL ) {
143                 t = "";
144             } else {
145                 *q = '\0';
146                 t = q + 1;
147             }
148         }
149         if ( u == NULL || ( pwent = getpwnam( u )) == NULL ) {
150             *token = '\0';
151             return;
152         }
153         strcpy( buf, pwent->pw_dir );
154         if ( *t != '\0' ) {
155             strcat( buf, "/" );
156             strcat( buf, t );
157         }
158         strcpy( token, buf );
159     }
160     return;
161 }
162 #endif notdef