home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / parsomat.zip / exampl21.pom < prev    next >
Text File  |  2001-07-15  |  10KB  |  359 lines

  1. ;==============================================================================
  2. ;
  3. ;  Prologue
  4. ;
  5. ;------------------------------------------------------------------------------
  6.  
  7. PROLOGUE
  8.  
  9.   ;============================================================================
  10.   ;
  11.   ;   Initialization
  12.   ;
  13.   ;----------------------------------------------------------------------------
  14.   ;
  15.   ;   Handy Constants
  16.   ;   ---------------
  17.   ;
  18.   SET      ALL          = "A"
  19.   SET      BOTH         = "B"
  20.   SET      COMMA        = ","
  21.   SET      DASH         = "-"
  22.   SET      DIGITS       = "0123456789"
  23.   SET      FIRST        = ""
  24.   SET      LAST         = ""
  25.   SET      LASTSPACE    = ">* "
  26.   SET      LEFT         = "L"
  27.   SET      NO           = "N"
  28.   SET      NULL         = ""
  29.   SET      POSNANY      = ""
  30.   SET      POSNLAST     = ">"
  31.   SET      POSNFIRST    = "<"
  32.   SET      RIGHT        = "R"
  33.   SET      SPACE        = " "
  34.   SET      YES          = "Y"
  35.   ;
  36.   ;   Initialize Input Trackers
  37.   ;   -------------------------
  38.   ;
  39.   SET      AddrCount  = "0"
  40.  
  41.   ;============================================================================
  42.   ;
  43.   ;   Scanlists
  44.   ;
  45.   ;----------------------------------------------------------------------------
  46.   ;
  47.   ;   States
  48.   ;   ------
  49.   ;
  50.   SET      STATES       = "/AB/AK/AL/AR/AZ/BC/CA/CO/CT/DC/DE/FL/GA/HI/IA/ID/IL/IN/KS/KY/LA/MA/MB/MD/ME/MI/MN/MO/MS/MT/NB/NC/ND/NE/NF/NH/NJ/NM/NS/NV/NY/OH/OK/ON/OR/PA/PR/QC/RI/SC/SD/SK/TN/TX/UT/VA/VT/WA/WI/WV/WY"
  51.  
  52.   ;============================================================================
  53.   ;
  54.   ;   Array Scanlists
  55.   ;
  56.   ;----------------------------------------------------------------------------
  57.   ;
  58.   ;   About Arrays of ScanLists
  59.   ;
  60.   ;     These arrays can be expanded by adding another scanlist with the next
  61.   ;     number (e.g. after XYZ,5 you would add XYZ,6).
  62.   ;
  63.   ;     Each scanterm must be preceded by the same character that appears in
  64.   ;     the first position of the scanlist (usually a slash).  You should put
  65.   ;     the most obvious items first.  Try to put VERY obvious items in the
  66.   ;     first scanlist.
  67.   ;
  68.   ;     No POM file line can extend beyond the 255th character.
  69.   ;
  70.   ;   Salutation Prefixes
  71.   ;   -------------------
  72.   ;
  73.   SET      SALUTATN,1   = "/MR/MISS /MS/MRS/DR /DR./REVEREND /REV /REV."
  74.   SET      SALUTATN,2   = "/SIR /DAME /LADY /HRH /THE RIGHT/THE HONORABLE"
  75.   SET      SALUTATN,3   = "/MAJOR /MAJOR-GENERAL/MJR-/LT /LT./LT-/SARGEANT"
  76.   SET      SALUTATN,4   = "/CPL /CPL./CORPORAL /GENERAL/GNL./OFFICER/OFF."
  77.   SET      SALUTATN,5   = "/CAPTAIN/CPTN/CPTN./CPT/CPT."
  78.   ;
  79.   ;   Name Suffixes
  80.   ;   -------------
  81.   ;
  82.   SET      NAMESUFF,1   = "/ SR./ JR./ SR/ JR/ II/ III/ IV/ V/ VI"
  83.   SET      NAMESUFF,2   = "/ SENIOR/ JUNIOR/ CPA/ MD/ M.D./ PHD"
  84.   SET      NAMESUFF,3   = "/ FSC/ F.S.C./ MBA/ M.B.A."
  85.  
  86. END
  87.  
  88. ;==============================================================================
  89. ;
  90. ;  Mainline Code
  91. ;
  92. ;------------------------------------------------------------------------------
  93. ;
  94. ;   Count this record
  95. ;
  96. SET      AddrCount    = AddrCount+
  97. ;
  98. ;   Get fields
  99. ;
  100. SET      Name         = $FLUPC[  1  23]
  101. SET      Title        = $FLUPC[ 24  50]
  102. SET      Company      = $FLUPC[ 51  79]
  103. SET      Addr1        = $FLUPC[ 80 104]
  104. SET      CityStateZip = $FLUPC[105 135]
  105. ;
  106. ;   Tidy up fields
  107. ;
  108. TRIM     Name         BOTH SPACE
  109. TRIM     Title        BOTH SPACE
  110. TRIM     Company      BOTH SPACE
  111. TRIM     Addr1        BOTH SPACE
  112. CHANGE   Addr1        "  " SPACE
  113. TRIM     CityStateZip BOTH SPACE
  114. ;
  115. ;   Process
  116. ;
  117. CALL     "Deduce Fields"
  118. CALL     "Output"
  119.  
  120. ;==============================================================================
  121. ;
  122. ;  Subroutines
  123. ;
  124. ;------------------------------------------------------------------------------
  125.  
  126. CODE     "Deduce Fields"
  127.    ;
  128.    ;   Initialize
  129.    ;
  130.    SET     NameSalutatn = NULL
  131.    SET     NameFirst    = NULL
  132.    SET     NameMiddle   = NULL
  133.    SET     NameLast     = NULL
  134.    SET     NameSuffix   = NULL
  135.    SET     City         = NULL
  136.    SET     State        = NULL
  137.    SET     Zip          = NULL
  138.    SET     ZipExt       = NULL
  139.    ;
  140.    ;   Remove any noise spaces
  141.    ;
  142.    CHANGE  Name         "  " SPACE
  143.    CHANGE  CityStateZip "  " SPACE
  144.  
  145.    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  146.    ;
  147.    ;   Deduce Name Fields
  148.    ;
  149.    CALL    "Get Name Parts"
  150.  
  151.    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  152.    ;
  153.    ;   Deduce CityStateZip fields
  154.    ;
  155.    ;
  156.    ;   Look for the Zip
  157.    ;
  158.    TRIM    CityStateZip ALL COMMA
  159.    PARSE   ZipData CityStateZip LASTSPACE LAST
  160.    SETLEN  ZipLen ZipData
  161.    SET     Placed = NO
  162.    SET     TestNum = ZipData[1 5]
  163.    CALL    "Test Numeric"
  164.    BEGIN   TestNumeric = YES
  165.      ;
  166.      ;   Looks like a ZIP code
  167.      ;
  168.      TRIM     ZipData ALL DASH
  169.      EXTRACT  Zip     ZipData "1" "5"
  170.      EXTRACT  Zip4    ZipData "1" "4"
  171.      EXTRACT  ZipExt  ZipData "1" "3"
  172.      SET      Placed  = YES
  173.    ELSE
  174.      ;
  175.      ;   Not a ZIP code
  176.      ;
  177.      ;   Maybe this is a state (i.e. there was no Zip)
  178.      ;
  179.      BEGIN   ZipLen = "2"
  180.        BEGIN   States ^ ZipData
  181.          SET     State  = ZipData
  182.          SET     Placed = YES
  183.        END
  184.      END
  185.    END
  186.    BEGIN   Placed = YES
  187.      PEEL     toss         CityStateZip LASTSPACE LAST
  188.    END
  189.    ;
  190.    ;   Look for State
  191.    ;
  192.    BEGIN   State = NULL
  193.      PEEL     State        CityStateZip LASTSPACE LAST
  194.    END
  195.    ;
  196.    ;   Get City
  197.    ;
  198.    SET     City = CityStateZip
  199. END
  200.  
  201. ;------------------------------------------------------------------------------
  202.  
  203. CODE     "Get Name Parts"
  204.   SET       ScanVarName  = "Name"
  205.   SET       ScanListName = "SALUTATN"
  206.   SET       ScanNeedPosn = POSNFIRST
  207.   CALL      "Array Scan"
  208.   BEGIN     ScanFrom <> "0"
  209.     ;
  210.     ;   We found a salutation
  211.     ;
  212.     PEEL    NameSalutatn Name FIRST SPACE
  213.   END
  214.   ;
  215.   ;   NameFirst
  216.   ;
  217.   TRIM    Name LEFT SPACE
  218.   PEEL    NameFirst Name FIRST SPACE
  219.   ;
  220.   ;   NameMiddle (actually, it's a middle initial)
  221.   ;
  222.   TRIM     Name LEFT SPACE
  223.   BEGIN    Name[2] = SPACE
  224.     PEEL     NameMiddle Name FIRST SPACE
  225.   END
  226.   ;
  227.   ;   NameLast
  228.   ;
  229.   TRIM     Name LEFT SPACE
  230.   SET      NameLast = Name
  231.   ;
  232.   ;   Name Suffix
  233.   ;
  234.   SET      ScanVarName  = "NameLast"
  235.   SET      ScanListName = "NAMESUFF"
  236.   SET      ScanNeedPosn = POSNLAST
  237.   CALL     "Array Scan"
  238.   BEGIN    ScanFrom <> "0"
  239.     ;
  240.     ;   We found a suffix
  241.     ;
  242.     PEEL     NameSuffix NameLast LASTSPACE LAST
  243.   END
  244. END
  245.  
  246. ;------------------------------------------------------------------------------
  247.  
  248. CODE     "Output"
  249.   ;
  250.   ;   Output
  251.   ;
  252.   SET      RecNum        = AddrCount
  253.   OUTEND   $LINECOUNTER <> "1" |
  254.   OUTEND                   |RECORD NUMBER:  {RecNum}
  255.   OUT                      |NAME INFO:      [{NameSalutatn}] [{NameFirst}]
  256.   OUTEND                   | [{NameMiddle}] [{NameLast}] [{NameSuffix}]
  257.   OUTEND   Title   <> NULL |TITLE:          {Title}
  258.   OUTEND   Company <> NULL |COMPANY:        {Company}
  259.   OUTEND                   |ADDR1:          {Addr1}
  260.   OUTEND                   |CITY & STATE:   [{City}] [{State}]
  261.   OUTEND                   |ZIP PARTS:      [{Zip}] [{Zip4}] [{ZipExt}]
  262. END
  263.  
  264. ;==============================================================================
  265. ;
  266. ;   General Parsing Routines
  267. ;
  268. ;------------------------------------------------------------------------------
  269. ;
  270. ;   "Array Scan" checks data against the array of scanlists we specify
  271. ;
  272. ;   Input Variables
  273. ;     ScanVarName   The literal name of the variable to scan (e.g. "MyVar")
  274. ;     ScanListName  The literal root name of the array (e.g. "MyArray")
  275. ;                   The array must start with index 1 (e.g. MyArray,1)
  276. ;     ScanNeedPosn  POSNLAST  means "must be found at the end of the item"
  277. ;                   POSNFIRST means "must be found in position 1"
  278. ;                   POSNANY   means "may be found anywhere"
  279. ;
  280. ;   Output Variables
  281. ;     ScanFrom      First position ("0" if not found)
  282. ;     ScanTo        Last  position ("0" if not found)
  283. ;
  284. ;   Reset Variables
  285. ;     ScanLineFrom  Set to NULL
  286. ;     ScanLineTo    Set to NULL
  287. ;
  288. CODE     "Array Scan"
  289.   ;
  290.   ;   Initialize
  291.   ;
  292.   SET      ScanFrom  = "0"
  293.   SET      ScanTo    = "0"
  294.   SET      scan_specs = ScanNeedPosn
  295.   SETLEN   scanvar_len (@ScanVarName)
  296.   ;
  297.   ;   Loop through lists
  298.   ;
  299.   SET      listnum   = "1"
  300.   SET      searching = YES
  301.   SET      scanfound = NO
  302.   BEGIN
  303.     ;
  304.     ;   Look for it in this list
  305.     ;
  306.     SCANPOSN from to (@ScanVarName) (@ScanListName,@listnum) scan_specs
  307.     ;
  308.     ;   If we found it, see if it scanfound
  309.     ;
  310.     BEGIN    from <> "0"
  311.       BEGIN    ScanNeedPosn = POSNFIRST
  312.         IF       from = "1" THEN scanfound = YES
  313.       END
  314.       BEGIN    ScanNeedPosn = POSNLAST
  315.         IF       to   =  scanvar_len THEN scanfound = YES
  316.       END
  317.       IF       ScanNeedPosn = POSNANY THEN scanfound = YES
  318.     END
  319.     ;
  320.     ;   Test our result
  321.     ;
  322.     BEGIN    scanfound = YES
  323.       ;
  324.       ;   Return the values
  325.       ;
  326.       SET      searching = NO
  327.       SET      ScanFrom  = from
  328.       SET      ScanTo    = to
  329.     ELSE
  330.       SET      listnum = listnum+
  331.       IF       (@ScanListName,@listnum) = NULL THEN searching = NO
  332.     END
  333.   AGAIN    searching = YES
  334. END
  335.  
  336. ;------------------------------------------------------------------------------
  337. ;
  338. ;   "Test Numeric"  checks if an item is numeric (i.e. only digits)
  339. ;
  340. ;   Input Variables
  341. ;     TestNum         The value to be tested
  342. ;
  343. ;   Output Variables
  344. ;     TestNumeric     Set to YES if numeric, or NO if non-numeric or null
  345. ;
  346. CODE     "Test Numeric"
  347.   BEGIN    TestNum = NULL
  348.     SET      TestNumeric = NO
  349.   ELSE
  350.     SET      TestNumeric = YES
  351.     SETLEN   tncounter TestNum
  352.     BEGIN    tncounter <> "0"
  353.       COPY     testdigit TestNum tncounter tncounter
  354.       IF       DIGITS ~ testdigit THEN TestNumeric = NO
  355.       SET      tncounter = tncounter-
  356.     AGAIN    TestNumeric = YES
  357.   END
  358. END
  359.