Ejemplo n.º 1
0
void fldbld(void)	/* create fields from current record */
{
    register uchar *r, *fr, sep;
    Cell *p;
    int i;

    if (donefld)
        return;
    if (!(recloc->tval & STR))
        getsval(recloc);
    r = recloc->sval;
    fr = fields;
    i = 0;	/* number of fields accumulated here */
    if (strlen(*FS) > 1) {	/* it's a regular expression */
        i = refldbld(r, *FS);
    } else if ((sep = **FS) == ' ') {	/* default whitespace */
        for (i = 0; ; ) {
            while (*r == ' ' || *r == '\t' || *r == '\n')
                r++;
            if (*r == 0)
                break;
            i++;
            if (i >= nfields)
                break;
            if (!(fldtab[i].tval & DONTFREE))
                xfree(fldtab[i].sval);
            fldtab[i].sval = fr;
            fldtab[i].tval = FLD | STR | DONTFREE;
            do
                *fr++ = *r++;
            while (*r != ' ' && *r != '\t' && *r != '\n' && *r != '\0');
            *fr++ = 0;
        }
        *fr = 0;
    } else if (*r != 0) {	/* if 0, it's a null field */
        for (;;) {
            i++;
            if (i >= nfields)
                break;
            if (!(fldtab[i].tval & DONTFREE))
                xfree(fldtab[i].sval);
            fldtab[i].sval = fr;
            fldtab[i].tval = FLD | STR | DONTFREE;
            while (*r != sep && *r != '\n' && *r != '\0')	/* \n is always a separator */
                *fr++ = *r++;
            *fr++ = 0;
            if (*r++ == 0)
                break;
        }
        *fr = 0;
    }
    if (i >= nfields)
        ERROR "record `%.30s...' has too many fields; try -mf n", record FATAL;
    /* clean out junk from previous record */
    cleanfld(i, maxfld);
    maxfld = i;
    donefld = 1;
    for (p = fldtab+1; p <= fldtab+maxfld; p++) {
        if(isnumber(p->sval)) {
            p->fval = atof(p->sval);
            p->tval |= NUM;
        }
    }
    setfval(nfloc, (Awkfloat) maxfld);
    if (dbg)
        for (p = fldtab; p <= fldtab+maxfld; p++)
            printf("field %d: |%s|\n", p-fldtab, p->sval);
}
Ejemplo n.º 2
0
void fldbld(void)	/* create fields from current record */
{
	/* this relies on having fields[] the same length as $0 */
	/* the fields are all stored in this one array with \0's */
	char *r, *fr, sep;
	Cell *p;
	int i, j, n;

	if (donefld)
		return;
	if (!isstr(fldtab[0]))
		getsval(fldtab[0]);
	r = fldtab[0]->sval;
	n = strlen(r);
	if (n > fieldssize) {
		xfree(fields);
		if ((fields = (char *) malloc(n+1)) == NULL)
			FATAL("out of space for fields in fldbld %d", n);
		fieldssize = n;
	}
	fr = fields;
	i = 0;	/* number of fields accumulated here */
	if (strlen(inputFS) > 1) {	/* it's a regular expression */
		i = refldbld(r, inputFS);
	} else if ((sep = *inputFS) == ' ') {	/* default whitespace */
		for (i = 0; ; ) {
			while (*r == ' ' || *r == '\t' || *r == '\n')
				r++;
			if (*r == 0)
				break;
			i++;
			if (i > nfields)
				growfldtab(i);
			if (freeable(fldtab[i]))
				xfree(fldtab[i]->sval);
			fldtab[i]->sval = fr;
			fldtab[i]->tval = FLD | STR | DONTFREE;
			do
				*fr++ = *r++;
			while (*r != ' ' && *r != '\t' && *r != '\n' && *r != '\0');
			*fr++ = 0;
		}
		*fr = 0;
	} else if ((sep = *inputFS) == 0) {		/* new: FS="" => 1 char/field */
		for (i = 0; *r != 0; r++) {
			char buf[2];
			i++;
			if (i > nfields)
				growfldtab(i);
			if (freeable(fldtab[i]))
				xfree(fldtab[i]->sval);
			buf[0] = *r;
			buf[1] = 0;
			fldtab[i]->sval = tostring(buf);
			fldtab[i]->tval = FLD | STR;
		}
		*fr = 0;
	} else if (*r != 0) {	/* if 0, it's a null field */
		for (;;) {
			i++;
			if (i > nfields)
				growfldtab(i);
			if (freeable(fldtab[i]))
				xfree(fldtab[i]->sval);
			fldtab[i]->sval = fr;
			fldtab[i]->tval = FLD | STR | DONTFREE;
			while (*r != sep && *r != '\n' && *r != '\0')	/* \n is always a separator */
				*fr++ = *r++;
			*fr++ = 0;
			if (*r++ == 0)
				break;
		}
		*fr = 0;
	}
	if (i > nfields)
		FATAL("record `%.30s...' has too many fields; can't happen", r);
	cleanfld(i+1, lastfld);	/* clean out junk from previous record */
	lastfld = i;
	donefld = 1;
	for (j = 1; j <= lastfld; j++) {
		p = fldtab[j];
		if(is_number(p->sval)) {
			p->fval = atof(p->sval);
			p->tval |= NUM;
		}
	}
	setfval(nfloc, (Awkfloat) lastfld);
	if (dbg) {
		for (j = 0; j <= lastfld; j++) {
			p = fldtab[j];
			printf("field %d (%s): |%s|\n", j, p->nval, p->sval);
		}
	}
}
Ejemplo n.º 3
0
void
fldbld(void)
{
	register unsigned char *r, *fr;
	Cell **p;
	wchar_t wc, sep;
	int i, n;

	if (donefld)
		return;
	if (!(recloc->tval & STR))
		getsval(recloc);
	r = recloc->sval;	/* was record! */
	fr = fields;
	i = 0;	/* number of fields accumulated here */
	if ((sep = **FS) != '\0' && (next(sep, *FS, n), (*FS)[n] != '\0')) {
		/* it's a regular expression */
		i = refldbld(r, *FS);
	} else if (sep == ' ') {
		for (i = 0; ; ) {
			while (*r == ' ' || *r == '\t' || *r == '\n')
				r++;
			if (*r == 0)
				break;
			i++;
			if (i >= MAXFLD)
				morefields();
			if (!(fldtab[i]->tval & DONTFREE))
				xfree(fldtab[i]->sval);
			fldtab[i]->sval = fr;
			fldtab[i]->tval = FLD | STR | DONTFREE;
			next(wc, r, n);
			do {
				do
					*fr++ = *r++;
				while (--n);
				next(wc, r, n);
			} while (wc != ' ' && wc != '\t' && wc != '\n' &&
					wc != '\0');
			*fr++ = 0;
		}
		*fr = 0;
	} else if (*r != 0) {	/* if 0, it's a null field */
		for (;;) {
			i++;
			if (i >= MAXFLD)
				morefields();
			if (!(fldtab[i]->tval & DONTFREE))
				xfree(fldtab[i]->sval);
			fldtab[i]->sval = fr;
			fldtab[i]->tval = FLD | STR | DONTFREE;
			while (next(wc, r, n),
					wc != sep && wc != '\n' && wc != '\0') {
					/* \n always a separator */
				do
					*fr++ = *r++;
				while (--n);
			}
			*fr++ = '\0';
			if (wc == '\0')
				break;
			r += n;
		}
		*fr = 0;
	}
	/*if (i >= MAXFLD)
		error(MM_ERROR, ":13:Record `%.20s...' has too many fields",
			record);*/
	/* clean out junk from previous record */
	cleanfld(i, maxfld);
	maxfld = i;
	donefld = 1;
	for (p = &fldtab[1]; p <= &fldtab[0]+maxfld; p++)
		(void)is2number(0, *p);
	setfval(nfloc, (Awkfloat) maxfld);
	if (dbg)
		for (p = &fldtab[0]; p <= &fldtab[0]+maxfld; p++)
			pfmt(stdout, MM_INFO, ":14:field %d: |%s|\n", p-&fldtab[0], 
				(*p)->sval);
}