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