home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNVALFMT.C < prev    next >
C/C++ Source or Header  |  1990-10-31  |  5KB  |  228 lines

  1. /*
  2.       fnvalfmt.c            9/21/88
  3.  
  4.     % valid_Format
  5.  
  6.     Field formatter
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.     12/16/88 jmd    Added test for empty format string
  15.  
  16.     11/04/89 jdc    changed toupper & tolower to otoupper & otolower
  17.      3/19/90 jmd    converted into a boolean
  18.      3/28/90 jmd    ansi-fied
  19.      6/10/90 mla    fixed fixed decimal formating
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <ctype.h>
  25.  
  26. #include "cscape.h"
  27. #include "strdecl.h"        /* for C-scape string functions */
  28. #include "fnfunc.h"            /* For the rest of the str functions */
  29.  
  30. enum not_flag          { NOT_OFF, NOT_PENDING, NOT_ON };
  31. enum case_style      { CASE_NOCHANGE, CASE_UPPER, CASE_LOWER, CASE_PROPER, CASE_IMPROPER };
  32. enum justify_style      { JUST_NOCHANGE, JUST_LEFT, JUST_RIGHT, JUST_CENTER };
  33. enum comma_style      { COMMA_NOCHANGE, COMMA_ON, COMMA_OFF };
  34. enum pad_style           { PAD_NOCHANGE, PAD_ON, PAD_OFF };
  35.  
  36. boolean valid_Format(sed_type sed, int fieldno, char *fmt)
  37. /*
  38.     Performs formatting commands upon a field record.
  39.     Supports the following commands:
  40.     Not:
  41.     ----
  42.     !    Negate next command character
  43.     Formats:
  44.     --------
  45.     U    UPPER CASE                !U    lower case
  46.     l    lower case                !l    UPPER CASE
  47.     P    Proper Case                !P    iMPROPER cASE
  48.     _    Pad with spaces            !_    clip trailing spaces
  49.     c    Compact: remove spaces    !c    Compact
  50.     Jusification:
  51.     -------------
  52.     ^    Center                    !^    Center
  53.     <    left justify            !<    right justify
  54.     >   right justify            !>    left justify
  55.     Numeric:
  56.     --------
  57.     0 - 9    Number of fixed decimal places.        0      removes decpt
  58.     ,        Add commas to numerics                !,     remove commas
  59.     fmt contains format command string.
  60.     Modifies contents of field record.
  61.     Use scratch pad.
  62.     Returns TRUE if the record changed, FALSE otherwise
  63. */
  64. {
  65.     char   *p, *spad, *q;
  66.     int     rlen;
  67.     boolean    first;
  68.     boolean    compact = FALSE;
  69.  
  70.     enum not_flag        fnot   = NOT_OFF;                /* "fnot for you..." */
  71.     enum case_style       fcase  = CASE_NOCHANGE;
  72.     enum justify_style fjust  = JUST_NOCHANGE;
  73.     enum comma_style   fcomma = COMMA_NOCHANGE;
  74.     enum pad_style     fpad   = PAD_NOCHANGE;
  75.  
  76.     int        decp = -1;    /* don't touch decimal point unless asked */
  77.  
  78.     if (fmt == NULL || fmt[0] == '\0') {
  79.         return(FALSE);
  80.     }
  81.  
  82.     /* put record into scratch pad, get lengths */
  83.     spad = sed_GetScratchPad(sed);
  84.     strcpy(spad, sed_GetRecord(sed, fieldno));
  85.     rlen = sed_GetRecordLen(sed, fieldno);
  86.  
  87.     /* set formatting switches */
  88.     for (p = fmt; *p != '\0'; p++) {
  89.         /* deal with not flag (turn on if pending, off otherwise) */
  90.         fnot = (fnot != NOT_PENDING) ? NOT_OFF : NOT_ON;
  91.  
  92.         switch(*p) {
  93.         case '!':
  94.             /* Not flag (set to pending, next loop through will turn it off) */
  95.             fnot = NOT_PENDING;
  96.             break;
  97.         case 'U':
  98.             /* UPPER CASE */
  99.             fcase = (fnot == NOT_ON) ? CASE_LOWER : CASE_UPPER;
  100.             break;
  101.         case 'l':
  102.             /* lower case */
  103.             fcase = (fnot == NOT_ON) ? CASE_UPPER : CASE_LOWER;
  104.             break;
  105.         case 'P':
  106.             /* Proper Case */
  107.             fcase = (fnot == NOT_ON) ? CASE_IMPROPER : CASE_PROPER;
  108.             break;
  109.         case 'c':
  110.             /* Compact string (remove all spaces) */
  111.             compact = TRUE;
  112.             break;
  113.         case '_':
  114.             /* Pad with spaces */
  115.             fpad = (fnot == NOT_ON) ? PAD_OFF : PAD_ON;
  116.             break;
  117.         case '^':
  118.             /* Center */
  119.             fjust = JUST_CENTER;
  120.             break;
  121.         case '<':
  122.             /* Left justify */
  123.             fjust = (fnot == NOT_ON) ? JUST_RIGHT : JUST_LEFT;
  124.             break;
  125.         case '>':
  126.             /* Right justify */
  127.             fjust = (fnot == NOT_ON) ? JUST_LEFT : JUST_RIGHT;
  128.             break;
  129.         case ',':
  130.             /* Comma'd numeric */
  131.             fcomma = (fnot == NOT_ON) ? COMMA_OFF : COMMA_ON;
  132.             break;
  133.  
  134.         case '0':
  135.         case '1':
  136.         case '2':
  137.         case '3':
  138.         case '4':
  139.         case '5':
  140.         case '6':
  141.         case '7':
  142.         case '8':
  143.         case '9':
  144.             /* Fixed decimal numeric */
  145.             decp = *p - '0';
  146.             break;
  147.         }
  148.     }
  149.  
  150.     /* Compact string */
  151.     if (compact) {
  152.         strcompact(spad);
  153.     }
  154.  
  155.     /* Perform numeric formatting */
  156.     if (decp >= 0) {
  157.         strcompact(spad);
  158.         strfixdp(spad, decp, rlen);
  159.         strright(spad, rlen);
  160.     }
  161.  
  162.     switch (fcomma) {
  163.     case COMMA_ON:
  164.         strright(spad, rlen);    /* strcomma assumes left justified strings */
  165.         strcomma(spad);
  166.         break;
  167.     case COMMA_OFF:
  168.         strnocomma(spad);
  169.         break;
  170.     }
  171.  
  172.     /* Perform string formatting */
  173.     switch (fcase) {
  174.     case CASE_UPPER:
  175.     case CASE_LOWER:
  176.         for (q = spad; *q != '\0'; q++) {
  177.             *q = (fcase == CASE_UPPER) ? otoupper(*q) : otolower(*q);
  178.         }
  179.         break;
  180.     case CASE_PROPER:
  181.     case CASE_IMPROPER:
  182.         first = TRUE;
  183.         for (q = spad; *q != '\0'; q++) {
  184.             if (first) {
  185.                 *q = (char)((fcase == CASE_PROPER) ? otoupper(*q) : otolower(*q));
  186.                 first = FALSE;
  187.             }
  188.             else {
  189.                 *q = (char)((fcase == CASE_PROPER) ? otolower(*q) : otoupper(*q));
  190.             }
  191.             first = (*q == ' ');
  192.         }
  193.         break;
  194.     }
  195.  
  196.     switch (fjust) {
  197.     case JUST_LEFT:
  198.         strleft(spad, rlen);
  199.         break;
  200.     case JUST_RIGHT:
  201.         strright(spad, rlen);
  202.         break;
  203.     case JUST_CENTER:
  204.         strcenter(spad, rlen);
  205.         break;
  206.     }
  207.  
  208.     switch (fpad) {
  209.     case PAD_ON:
  210.         strpad(spad, rlen);
  211.         break;
  212.     case PAD_OFF:
  213.         strclip(spad);
  214.         break;
  215.     }
  216.  
  217.     /* test if the record changed */
  218.     if (strcmp(sed_GetRecord(sed, fieldno), spad) == 0) {
  219.         /* no change */
  220.         return(FALSE);
  221.     }
  222.     else {
  223.         /* copy scratch pad back into record */
  224.         sed_SetRecord(sed, spad, fieldno);
  225.         return(TRUE);
  226.     }
  227. }
  228.