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