diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/v/getfields.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/v/getfields.c')
-rwxr-xr-x | sys/src/ape/lib/v/getfields.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/sys/src/ape/lib/v/getfields.c b/sys/src/ape/lib/v/getfields.c new file mode 100755 index 000000000..da59216d9 --- /dev/null +++ b/sys/src/ape/lib/v/getfields.c @@ -0,0 +1,136 @@ +#define _RESEARCH_SOURCE +#include <libv.h> +#include <string.h> + +static char is_sep[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +static char is_field[256] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static char last_sep[256]; + +char * +setfields(char *arg) +{ + register unsigned char *s; + register i; + + for(i = 1, s = (unsigned char *)last_sep; i < 256; i++) + if(is_sep[i]) + *s++ = i; + *s = 0; + memset(is_sep, 0, sizeof is_sep); + memset(is_field, 1, sizeof is_field); + for(s = (unsigned char *)arg; *s;){ + is_sep[*s] = 1; + is_field[*s++] = 0; + } + is_field[0] = 0; + return(last_sep); +} + +int +getfields(char *ss, char **sp, int nptrs) +{ + register unsigned char *s = (unsigned char *)ss; + register unsigned char **p = (unsigned char **)sp; + register unsigned c; + + for(;;){ + if(--nptrs < 0) break; + *p++ = s; + while(is_field[c = *s++]) + ; + if(c == 0) break; + s[-1] = 0; + } + if(nptrs > 0) + *p = 0; + else if(--s >= (unsigned char *)ss) + *s = c; + return(p - (unsigned char **)sp); +} + +int +getmfields(char *ss, char **sp, int nptrs) +{ + register unsigned char *s = (unsigned char *)ss; + register unsigned char **p = (unsigned char **)sp; + register unsigned c; + + if(nptrs <= 0) + return(0); + goto flushdelim; + for(;;){ + *p++ = s; + if(--nptrs == 0) break; + while(is_field[c = *s++]) + ; + /* + * s is now pointing 1 past the delimiter of the last field + * c is the delimiter + */ + if(c == 0) break; + s[-1] = 0; + flushdelim: + while(is_sep[c = *s++]) + ; + /* + * s is now pointing 1 past the beginning of the next field + * c is the first letter of the field + */ + if(c == 0) break; + s--; + /* + * s is now pointing to the beginning of the next field + * c is the first letter of the field + */ + } + if(nptrs > 0) + *p = 0; + return(p - (unsigned char **)sp); +} + +#ifdef MAIN +#include <fio.h> + +main() +{ + char *fields[256]; + char *s; + int n, i; + char buf[1024]; + + print("go:\n"); + while(s = Frdline(0)){ + strcpy(buf, s); + Fprint(1, "getf:"); + n = getfields(s, fields, 4); + for(i = 0; i < n; i++) + Fprint(1, " >%s<", fields[i]); + Fputc(1, '\n'); + Fprint(1, "getmf:"); + n = getmfields(buf, fields, 4); + for(i = 0; i < n; i++) + Fprint(1, " >%s<", fields[i]); + Fputc(1, '\n'); + Fflush(1); + } + exit(0); +} +#endif |