/* Copyright (C) 1994 by Thomas Glen Smith. All Rights Reserved. */
/* formatl APL2 V1.0.0 *************************************************
* Called by formatp and formatq to obtain either the next field from *
* the model (left argument to Format-by-Example), or the next string of*
* column dividers (blanks, standalone decorator characters). A field *
* is a sequence of characters containing at least one digit ('0' thru *
* '9') and bounded by either blanks or a special field boundary mark *
* (the digit '6'). Examples of fields in " 555 x -551.20CR" are "555" *
* and "-551.20CR". *
* The pointer to the character in the input just beyond the last *
* character in the current string is returned. The current string is *
* copied to *to. *start will point to the first control character ('0'*
* thru '9', '.' or ','), or will be NULL if the current string *
* contains no control characters. *
* Argument start is used to determine if pseudo-standalone decorator *
* characters are expected next. If *start isn't null, and the first *
* character pointed to by *from is non-blank, it signifies the prior *
* field was terminated with a 6 control digit. All characters until *
* the next control character are considered a decorator string. *
***********************************************************************/
#define INCLUDES 0
#include "includes.h"
char *formatl(to,from,start)
char *to,*from,**start;
{
int divider=0,offset=-1;
char *cp,*orgto=to,*orgfrom=from,*orgstart=*start;
*start = NULL;
if (orgstart != NULL && *from != ' ') /* decorator after "6"? */
divider = 2; /* column divider, maybe not blank delimited */
while('\0' != (*(cp = to++) = *from++)) {
if (*cp == ' ') { /* it's a blank */
if (*start != NULL) break; /* found end of field */
divider = 1; /* this string is a column divider */
offset = -1;
}
else { /* it's a non-blank */
if (offset == -1 || divider == 2)
offset = cp - orgto; /* possible end divider */
if ((*cp >= '0' && *cp <= '9')) {
if (divider) { /* found end of column divider */
*(orgto + offset) = '\0'; /* delimit column div. */
return(orgfrom + offset); /* all done */
}
if (*cp == '6') { /* end of field */
*(cp+1) = '\0'; /* add delimiter */
return(from); /* all done */
}
if (*start == NULL)
*start = cp; /* a(1st digit control field) */
}
}
}
*cp = '\0'; /* end of field - add delimiter */
return(from-1);
}