Subject: RE: Do you have any handy functions/libraries you would like to donate?
From: "Dave Mottorn" <[EMAIL PROTECTED]>
Date: Thu, 6 Nov 2003 09:10:40 -0500
X-Message-Number: 16
I'll Email this so you can be the judge of whether this is worth while or not. I use a standard format to structure transactions when I'm developing applications that are transaction-oriented. A typical transaction might look something like this: FMOVE|W0123|LA|D03/11/06/09:45:07|E555|. This transaction reflects that employee 555 moved work order 0123 to location A at the time indicated. The vertical bar separates the fields and the first letter of every field is a prefix code which makes the data position-independent in the transaction.
Why didn't you use a comma separated format, with careful use of quotes? Much more standardized.....
FMOVE,W0123,LA,D03/11/06/09:45:07,E555,"ZSmith, John"
(Of course, having said this, I use a CSV data format, and then use the pipe separator as a sub-field separator when necessary)
This technique has been around for decades and I didn't invent it. I've used it to develop dozens of systems and the only problem I've run into is I've run short of printable characters and had to use noseeums from the upper ascii 128.
Yes, using a fixed single byte field identifier is restrictive, so you might want to use the pipe to split up the data from the field ID and then use a numeric field ID:
FMOVE,23|0123,12|A,4|03/11/06/09:45:07,5|555,"26|Smith, John"
The core code would then be:
const Char * ParseQuotedField (Int16 *id, Char *dest,
Int16 max, const Char* src); // returns ptr to start of next field, or NULL
Int16 ProcessData (const Char * src) {
Int16 iFieldID, i, iCount = 0;
Char field[MAX_FIELD_SIZE + 2], action[12];
const Char *cptr = ParseQuotedField (&iFieldID, action, sizeof(action) - 2, src);
if (!*action) return 0;
while (cptr != NULL && *cptr) {
iCount++;
if (*cptr == ',') {cptr++; continue;} // skip over empty field
cptr = ParseQuotedField (&iFieldID, field, sizeof(field) - 2, cptr);
if (*field && iFieldID) {
// process field ..............
}
}
return iCount;
}
Roger Stringer Marietta Systems, Inc. (www.mariettasystems.com)
-- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/
