c Date.cct - Sort year-2000-compatible dates in Shoebox c 1998-04-09 Mark R. Pedrotti (ICTS Software Development) c 1998-06-30 MRP: Move use(gRest) after endif in group(gMonth) c where it belongs. Mistaken placement caused c an infinite loop in CC for non-date fields. c Acknowledgment: Martin Hosken suggested this approach. c c Because Date.lng depends on this change table file, c you must put them together in the same settings folder. c c Convert the "surface" form of a Shoebox datestamp field, c like MDF's \dt, to an "underlying" form that will work c with most any sort order: four to eight digits yyyymmdd c (for example 19980409, 199804, or 1998). c c Examples of inputs: c 09/Apr/98 Shoebox 1, 2, and 3 c 9/apr/98 Minor variations are accepted c 09/Apr/1998 Shoebox 4 c 01/Jan/00 Shoebox 2 c 01/Jan/100@#$... Shoebox 3 will do this. Yuck! Not accepted. c 01/Jan/2000 Shoebox 4 c Jun/2001 Partial: month-year c 2001 Partial: year-alone (must be four digits) c c The two partial formats are for searching and jumping by date. c c This change table assumes that Shoebox has trimmed surrounding c white space from the date field. If the input doesn't match c a date format, it passes through unchanged. c -------------------------------------------------------------------- begin > caseless c Disregard case distinction in month abbreviations store(D) '0123456789' endstore c Digit use(gDay) define(dDate) > out(yyyy) out(mm) out(dd) c -------------------------------------------------------------------- group(gDay) any(D) any(D) any(D) any(D) > store(yyyy) dup do(dDate) use(gRest) any(D) any(D) > store(dd) dup use(gSlashAfterDay) any(D) > store(dd) '0' dup use(gSlashAfterDay) '' > use(gMonth) c It may be a month-year partial date c -------------------------------------------------------------------- group(gSlashAfterDay) '/' > set(Day) use(gMonth) '' > out(dd) use(gRest) c Not a date c -------------------------------------------------------------------- group(gMonth) 'jan' > store(mmm) dup store(mm) '01' use(gSlashAfterMonth) 'feb' > store(mmm) dup store(mm) '02' use(gSlashAfterMonth) 'mar' > store(mmm) dup store(mm) '03' use(gSlashAfterMonth) 'apr' > store(mmm) dup store(mm) '04' use(gSlashAfterMonth) 'may' > store(mmm) dup store(mm) '05' use(gSlashAfterMonth) 'jun' > store(mmm) dup store(mm) '06' use(gSlashAfterMonth) 'jul' > store(mmm) dup store(mm) '07' use(gSlashAfterMonth) 'aug' > store(mmm) dup store(mm) '08' use(gSlashAfterMonth) 'sep' > store(mmm) dup store(mm) '09' use(gSlashAfterMonth) 'oct' > store(mmm) dup store(mm) '10' use(gSlashAfterMonth) 'nov' > store(mmm) dup store(mm) '11' use(gSlashAfterMonth) 'dec' > store(mmm) dup store(mm) '12' use(gSlashAfterMonth) '' > if(Day) out(dd) '/' endif use(gRest) c -------------------------------------------------------------------- group(gSlashAfterMonth) '/' > use(gYear) '' > if(Day) out(dd) '/' endif out(mmm) use(gRest) c Not a date c -------------------------------------------------------------------- group(gYear) any(D) any(D) any(D) any(D) > store(yyyy) dup do(dDate) use(gRest) '0' any(D) > next c Consider 00-39 to be truncated from 20yy '1' any(D) > next '2' any(D) > next '3' any(D) > store(yyyy) '20' dup do(dDate) use(gRest) any(D) any(D) > store(yyyy) '19' dup do(dDate) use(gRest) '' > if(Day) out(dd) '/' endif out(mmm) '/' use(gRest) c Not a date c -------------------------------------------------------------------- group(gRest) endfile > endfile