summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/v/getfields.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/ape/lib/v/getfields.c136
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