recstr.c revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/***********************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* This software is part of the ast package *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* and is licensed under the *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Common Public License, Version 1.0 *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* by AT&T Knowledge Ventures *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* A copy of the License is available at *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* http://www.opensource.org/licenses/cpl1.0.txt *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Information and Software Systems Research *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* AT&T Research *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Florham Park NJ *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Glenn Fowler <gsf@research.att.com> *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* David Korn <dgk@research.att.com> *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Phong Vo <kpv@research.att.com> *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan***********************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#pragma prototyped
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * return the record format descriptor given a format string
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * e!=0 set to the first unrecognized char after the format
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * REC_N_TYPE() returned on error
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * d[0xNN|delimiter] (delimited, newline default)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * [f][+]size (fixed length)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * v hN oN zN b|l i|n (variable length with size header)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * h header size in bytes (ibm V 4)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * o size offset in bytes (ibm V 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * z size length in bytes (ibm V 2)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * l|b little-endian or big-endian size (ibm V b (0))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * i|n header included/not-included in size (ibm V i (1))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <recfmt.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <ctype.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRecfmt_t
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanrecstr(register const char* s, char** e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char* t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int n;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan long v;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int a[6];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (*s == ' ' || *s == '\t' || *s == ',')
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan s++;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (*s)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'd':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'D':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (!*s)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = '\n';
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = (int)strtol(s, &t, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = chresc(s, &t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan s = (const char*)t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = (char*)s;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_D_TYPE(n);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'f':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'F':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (*++s == ' ' || *s == '\t' || *s == ',');
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*FALLTHROUGH*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '+':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '0': case '1': case '2': case '3': case '4':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '5': case '6': case '7': case '8': case '9':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = strton(s, &t, NiL, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (n > 0 && t > (char*)s)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_F_TYPE(n);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'm':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'M':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (*++s == ' ' || *s == '\t' || *s == ',');
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (t = (char*)s; *t && *t != ' ' && *t != '\t' && *t != ','; t++);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((t - s) == 4)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (strneq(s, "data", 4))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_M_TYPE(REC_M_data);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else if (strneq(s, "path", 4))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_M_TYPE(REC_M_path);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * TBD: look up name in method libraries
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and assign an integer index
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'u':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'U':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (*++s == ' ' || *s == '\t' || *s == ',');
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = strtol(s, &t, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (n < 0 || n > 15 || *t++ != '.')
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan v = strtol(t, &t, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (*t)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = t;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_U_TYPE(n, v);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'v':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'V':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[0] = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[1] = 4;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[2] = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[3] = 2;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[4] = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[5] = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (;;)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (*++s)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 0:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'm':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'M':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'h':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'H':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'o':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'O':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 2;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'z':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'Z':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 3;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'b':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'B':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 4;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[n++] = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'l':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'L':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 4;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[n++] = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'n':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'N':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[5] = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'i':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case 'I':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan n = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[5] = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case ' ':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '\t':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case ',':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '-':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '+':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '0': case '1': case '2': case '3': case '4':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '5': case '6': case '7': case '8': case '9':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan a[n++] = strtol(s, &t, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan s = (const char*)t - 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = (char*)s;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_V_RECORD(REC_V_TYPE(a[1], a[2], a[3], a[4], a[5]), a[0]);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '%':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = (char*)s + 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_M_TYPE(REC_M_path);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '-':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case '?':
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = (char*)s + 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_M_TYPE(REC_M_data);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (e)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *e = (char*)s;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return REC_N_TYPE();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan