home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / listdl.zip / LISTDLL.CMD next >
OS/2 REXX Batch file  |  1994-10-25  |  64KB  |  949 lines

  1. /*------------------------------------------------------------------------*\
  2. |                                                                          |
  3. |           LISTDLL.CMD  - Version 1.0 - Version Date 1994-09-29           |
  4. |                          Version 1.1 - Version Date 1994-10-25           |
  5. |                 Copyright (C) 1994 by C F S Nevada, Inc.                 |
  6. |                                                                          |
  7. |                  by Dick Goran  - Voice    702-732-9616                  |
  8. |                                 - FAX      702-732-3847                  |
  9. |                                 - CIS      71154,2002                    |
  10. |                                 - FIDO     1:209/705                     |
  11. |                                 - IBMLink  DEV4672 at HONE81             |
  12. |                                 - Internet 71154.2002@compuserve.com     |
  13. |                                                                          |
  14. | ------------------------------------------------------------------------ |
  15. |  REXXLIB.DLL  - OS/2 REXX external function library                      |
  16. |                 (c) Copyright 1992-94 Quercus Systems                    |
  17. \*------------------------------------------------------------------------*/
  18. /*
  19.  
  20.    This program will produce an ASCII file (LISTDLL.TXT) containing a
  21.    list of all of all of the DLLs that are "addressable" via the LIBPATH
  22.    statement. This program may be run from any directory and will include
  23.    DLLs in the current directory if the .; token is included in the LIBPATH
  24.    statement located in CONFIG.SYS on the IPL (boot drive).
  25.  
  26.    This program is released to the public domain.
  27.  
  28.    Updates & Fixes:
  29.    ================
  30.  
  31.    1) LIBPATH string was searched for in uppercase only.
  32.  
  33. */
  34. parse Version         REXX_Version .                              /* 0034 */
  35. parse Source          OS_Name,                                    /* 0035 */
  36.                       Calling_Environment,                        /* 0036 */
  37.                       program_path_and_name                       /* 0037 */
  38. GBL.                = ''            /* initialize stem */         /* 0038 */
  39. GBL.environment     = 'OS2ENVIRONMENT'                            /* 0039 */
  40. GBL.program_name    = FILESPEC( 'N', program_path_and_name )      /* 0040 */
  41. GBL.program_path    = FILESPEC( 'D', program_path_and_name ) ||,  /* 0041 */
  42.                       FILESPEC( 'P', program_path_and_name )      /* 0042 */
  43. GBL.program_version = 1.1           /* version / mod of this program */
  44. call TIME 'E'                       /* set elapsed timer - sssss.uuuuu */
  45.                                                                   /* 0045 */
  46. say 'Begin' TRANSLATE( GBL.program_name ) 'at' TIME('N')          /* 0046 */
  47. call REGISTER_REQUIRED_FUNCTIONS                                  /* 0047 */
  48.                                                                   /* 0048 */
  49.    SIGNAL ON ERROR                  /* trap object time errors     */
  50.    SIGNAL ON HALT                   /* trap object time errors     */
  51.    SIGNAL ON NOVALUE                /* trap object time errors     */
  52.    SIGNAL ON SYNTAX                 /* trap object time errors     */
  53.                                                                   /* 0053 */
  54. parse value GBL.program_name with,                                /* 0054 */
  55.    fn '.' fe                                                      /* 0055 */
  56. GBL.output_file       = DOSDRIVE() || ':' ||,                     /* 0056 */
  57.                         DOSCD()  ||,                              /* 0057 */
  58.                         '\' || TRANSLATE( fn ) || '.TXT'          /* 0058 */
  59. GBL.output_line_count = 0                                         /* 0059 */
  60. GBL.column_blanks     = COPIES( ' ', 2 )                          /* 0060 */
  61. GBL.conflict_count    = 0           /* number of multiple DLL entries */
  62.                                                                   /* 0062 */
  63. /*-------------------------------------------------------*\       /* 0063 */
  64. |  Check for output file being specified on command line  |       /* 0064 */
  65. \*-------------------------------------------------------*/       /* 0065 */
  66. parse arg parameter_1                                             /* 0066 */
  67. if LEFT( parameter_1, 1 ) = '"' then                              /* 0067 */
  68.    do                                                             /* 0068 */
  69.       parameter_1 = STRIP( parameter_1, 'B', '"' )                /* 0069 */
  70.    end                                                            /* 0070 */
  71. else                                                              /* 0071 */
  72.    if WORDS( parameter_1 ) > 1 then                               /* 0072 */
  73.       do                                                          /* 0073 */
  74.          say '   The only parameter allowed is the output file name.'
  75.          say '   Program cancelled.'                              /* 0075 */
  76.          call EOJ 255                                             /* 0076 */
  77.       end                                                         /* 0077 */
  78. if parameter_1 <> '' then                                         /* 0078 */
  79.    do                                                             /* 0079 */
  80.       GBL.output_file = parameter_1                               /* 0080 */
  81.    end                                                            /* 0081 */
  82. call SysFileDelete GBL.output_file  /* erase any prior file */    /* 0082 */
  83. if RESULT > 2 then                                                /* 0083 */
  84.    do                                                             /* 0084 */
  85.       say '   SysFileDelete returned ' ||,                        /* 0085 */
  86.           RESULT                       ||,                        /* 0086 */
  87.           ' for file name '            ||,                        /* 0087 */
  88.           GBL.output_file                                         /* 0088 */
  89.       say '   Program cancelled.'                                 /* 0089 */
  90.       call EOJ RESULT                                             /* 0090 */
  91.    end                                                            /* 0091 */
  92.                                                                   /* 0092 */
  93. /*----------------------------------------------------------*\    /* 0093 */
  94. |  Read CONFIG.SYS from IPL drive to find LIBPATH statement  |    /* 0094 */
  95. \*----------------------------------------------------------*/    /* 0095 */
  96. config_sys_file_name  = DOSBOOTDRIVE() ||,                        /* 0096 */
  97.                         ':\config.sys'                            /* 0097 */
  98. config_sys_file_size  = STREAM( config_sys_file_name, 'C', 'QUERY SIZE' )
  99. if config_sys_file_size \> 0 then                                 /* 0099 */
  100.    do                                                             /* 0100 */
  101.       say 'Unable to locate '  ||,                                /* 0101 */
  102.           config_sys_file_name ||,                                /* 0102 */
  103.           '. Program cancelled.'                                  /* 0103 */
  104.       call EOJ 254                                                /* 0104 */
  105.    end                                                            /* 0105 */
  106. config_sys_file_area = CHARIN( config_sys_file_name, 1, config_sys_file_size )
  107. config_sys_file_area = TRANSLATE( config_sys_file_area )          /* 0107 */
  108. call STREAM config_sys_file_name                                  /* 0108 */
  109.                                                                   /* 0109 */
  110. /*------------------------*\                                      /* 0110 */
  111. |  Find LIBPATH statement  |                                      /* 0111 */
  112. \*------------------------*/                                      /* 0112 */
  113. libpath_search_arg = '0D0A'x || 'LIBPATH='                        /* 0113 */
  114. libpath_beg_pointer = POS( libpath_search_arg, config_sys_file_area )
  115. if libpath_beg_pointer = 0 then                                   /* 0115 */
  116.    do                                                             /* 0116 */
  117.       say 'Unable to locate LIBPATH= in ' ||,                     /* 0117 */
  118.           config_sys_file_name            ||,                     /* 0118 */
  119.           '. Program cancelled.'                                  /* 0119 */
  120.       call EOJ 254                                                /* 0120 */
  121.    end                                                            /* 0121 */
  122. else                                                              /* 0122 */
  123.    do                                                             /* 0123 */
  124.       libpath_beg_pointer = libpath_beg_pointer + LENGTH(libpath_search_arg)
  125.       libpath_end_pointer = POS( '0D0A'x,,                        /* 0125 */
  126.                                  config_sys_file_area,,           /* 0126 */
  127.                                  libpath_beg_pointer )            /* 0127 */
  128.       if libpath_end_pointer = 0 then                             /* 0128 */
  129.          do                                                       /* 0129 */
  130.             say 'Unable to locate end of LIBPATH line. Should not occur.'
  131.             call EOJ 254                                          /* 0131 */
  132.          end                                                      /* 0132 */
  133.       else                                                        /* 0133 */
  134.          do                                                       /* 0134 */
  135.             libpath_line = SUBSTR( config_sys_file_area,,         /* 0135 */
  136.                                    libpath_beg_pointer,,          /* 0136 */
  137.                                    libpath_end_pointer - libpath_beg_pointer)
  138.          end                                                      /* 0138 */
  139.    end                                                            /* 0139 */
  140.                                                                   /* 0140 */
  141. /*------------------------------------------*\                    /* 0141 */
  142. |  Build SysFileTree array of all DLL files  |                    /* 0142 */
  143. \*------------------------------------------*/                    /* 0143 */
  144. heading_3           = ''            /* current directory if .; included */
  145. libpath_tokens      = libpath_line  /* copy LIBPATH data */       /* 0145 */
  146. path_table.0        = 0             /* table of all DLL paths */  /* 0146 */
  147. path_index.         = 0             /* associative array for path_table */
  148. search_order_stem.0 = 0             /* combined array of DLL files - search order */
  149.                                                                   /* 0149 */
  150. do while libpath_tokens <> ''                                     /* 0150 */
  151.    parse value libpath_tokens with,                               /* 0151 */
  152.       dll_path ';' libpath_tokens                                 /* 0152 */
  153.    if dll_path = '.' then                                         /* 0153 */
  154.       do                                                          /* 0154 */
  155.          dll_path = DOSDRIVE() || ':' || DOSCD()                  /* 0155 */
  156.          heading_3 = 'Search path includes ' ||,                  /* 0156 */
  157.                      dll_path                                     /* 0157 */
  158.       end                                                         /* 0158 */
  159.    else                                                           /* 0159 */
  160.       /* check for duplicate path */                              /* 0160 */
  161.       do                                                          /* 0161 */
  162.          uppercase_dll_path = TRANSLATE( dll_path )               /* 0162 */
  163.          pt = path_table.0 + 1      /* potential subscript */     /* 0163 */
  164.          if path_index.uppercase_dll_path > 0 then                /* 0164 */
  165.             do                                                    /* 0165 */
  166.                output_line =,                                     /* 0166 */
  167.                    dll_path ||,                                   /* 0167 */
  168.                    ' is duplicated in LIBPATH.'                   /* 0168 */
  169.                call LINEOUT GBL.output_file, output_line || '0D0A'x
  170.                GBL.output_line_count = GBL.output_line_count + 1  /* 0170 */
  171.                say '   ' || output_line                           /* 0171 */
  172.                iterate                                            /* 0172 */
  173.             end                                                   /* 0173 */
  174.          path_table.pt = uppercase_dll_path  /* add dll path to table */
  175.          path_table.0 = pt                                        /* 0175 */
  176.          path_index.dll_path = pt   /* create associative index */
  177.       end                                                         /* 0177 */
  178.                                                                   /* 0178 */
  179.    call SysFileTree dll_path || '\*.dll',,                        /* 0179 */
  180.                     'temp_stem',,                                 /* 0180 */
  181.                     'F'                                           /* 0181 */
  182.    if temp_stem.0 = 0 then iterate                                /* 0182 */
  183.    call ARRAYCOPY 'temp_stem', 'search_order_stem', 1, search_order_stem.0 + 1
  184. end                                                               /* 0184 */
  185.                                                                   /* 0185 */
  186. /*------------------------------------*\                          /* 0186 */
  187. |  Write heading lines to output_file  |                          /* 0187 */
  188. \*------------------------------------*/                          /* 0188 */
  189. say '   Building ' ||,                                            /* 0189 */
  190.     GBL.output_file                                               /* 0190 */
  191. heading_1 =,                                                      /* 0191 */
  192.    DATE( 'N' ) || COPIES( ' ', 3 ) ||,                            /* 0192 */
  193.    TIME( 'N' ) || COPIES( ' ', 3 ) ||,                            /* 0193 */
  194.    TRANSLATE( GBL.program_name )   ||,                            /* 0194 */
  195.    ' - Addressble DLLs per '  ||,                                 /* 0195 */
  196.    TRANSLATE( config_sys_file_name )                              /* 0196 */
  197. call LINEOUT GBL.output_file, heading_1                           /* 0197 */
  198. GBL.output_line_count = GBL.output_line_count + 1                 /* 0198 */
  199.                                                                   /* 0199 */
  200. output_line =,                                                    /* 0200 */
  201.    '(c) 1994 by Dick Goran, C F S Nevada, Inc. ' ||,              /* 0201 */
  202.    '(71154.2002@compuserve.com)'                                  /* 0202 */
  203. heading_2 = CENTER( output_line, LENGTH(heading_1) )              /* 0203 */
  204. call LINEOUT GBL.output_file, heading_2                           /* 0204 */
  205. GBL.output_line_count = GBL.output_line_count + 1                 /* 0205 */
  206.                                                                   /* 0206 */
  207. if heading_3 <> '' then                                           /* 0207 */
  208.    do                                                             /* 0208 */
  209.       call LINEOUT GBL.output_file, CENTER( heading_3, LENGTH(heading_1) )
  210.       GBL.output_line_count = GBL.output_line_count + 1           /* 0210 */
  211.    end                                                            /* 0211 */
  212. call LINEOUT GBL.output_file, ' '                                 /* 0212 */
  213. GBL.output_line_count = GBL.output_line_count + 1                 /* 0213 */
  214.                                                                   /* 0214 */
  215. /*-----------------------------------------------------*\         /* 0215 */
  216. |  Build an associative array of all DLL names looking  |         /* 0216 */
  217. |  for any conflicts arising from search order along    |         /* 0217 */
  218. |  with an array to allow sorting by DLL name.          |         /* 0218 */
  219. \*-----------------------------------------------------*/         /* 0219 */
  220. index_stem. = ''                                                  /* 0220 */
  221. sort_stem.0 = 0                                                   /* 0221 */
  222. do sos = 1 to search_order_stem.0                                 /* 0222 */
  223.                                                                   /* 0223 */
  224.    parse upper value search_order_stem.sos with,                  /* 0224 */
  225.       ordered_file_date,                                          /* 0225 */
  226.       ordered_file_time,                                          /* 0226 */
  227.       ordered_file_size,                                          /* 0227 */
  228.       ordered_file_attr,                                          /* 0228 */
  229.       ordered_file_path_and_name                                  /* 0229 */
  230.    ordered_file_path_and_name = STRIP( ordered_file_path_and_name )
  231.                                                                   /* 0231 */
  232.    ordered_file_path = FILESPEC( 'D', ordered_file_path_and_name ) ||,
  233.                        FILESPEC( 'P', ordered_file_path_and_name )
  234.    parse value FILESPEC( 'N', ordered_file_path_and_name ) with,  /* 0234 */
  235.       ordered_file_name '.' ordered_file_ext                      /* 0235 */
  236.                                                                   /* 0236 */
  237.    /*---------------------------*\                                /* 0237 */
  238.    |  Add to array to be sorted  |                                /* 0238 */
  239.    \*---------------------------*/                                /* 0239 */
  240.    ss = sort_stem.0 + 1                                           /* 0240 */
  241.    sort_stem.0 = ss                                               /* 0241 */
  242.    sort_stem.ss =,                                                /* 0242 */
  243.       LEFT( FILESPEC( 'N', ordered_file_path_and_name ), 13 ) ||, /* 0243 */
  244.       RIGHT( sos, 6)                                              /* 0244 */
  245.                                                                   /* 0245 */
  246.    /*----------------------------------*\                         /* 0246 */
  247.    |  Check for prior existence of DLL  |                         /* 0247 */
  248.    \*----------------------------------*/                         /* 0248 */
  249.    if index_stem.ordered_file_name <> '' then                     /* 0249 */
  250.       do                                                          /* 0250 */
  251.          index_stem.ordered_file_name = index_stem.ordered_file_name,
  252.                                         sos                       /* 0252 */
  253.       end                                                         /* 0253 */
  254.    else                                                           /* 0254 */
  255.       do                                                          /* 0255 */
  256.          index_stem.ordered_file_name = sos /* search order number */
  257.       end                                                         /* 0257 */
  258. end                                                               /* 0258 */
  259.                                                                   /* 0259 */
  260. /*-------------------------------*\                               /* 0260 */
  261. |  List any multiple occurrences  |                               /* 0261 */
  262. \*-------------------------------*/                               /* 0262 */
  263. do sos = 1 to search_order_stem.0                                 /* 0263 */
  264.                                                                   /* 0264 */
  265.    parse upper value search_order_stem.sos with,                  /* 0265 */
  266.       ordered_file_date,                                          /* 0266 */
  267.       ordered_file_time,                                          /* 0267 */
  268.       ordered_file_size,                                          /* 0268 */
  269.       ordered_file_attr,                                          /* 0269 */
  270.       ordered_file_path_and_name                                  /* 0270 */
  271.    ordered_file_path_and_name = STRIP( ordered_file_path_and_name )
  272.                                                                   /* 0272 */
  273.    ordered_file_path = FILESPEC( 'D', ordered_file_path_and_name ) ||,
  274.                        FILESPEC( 'P', ordered_file_path_and_name )
  275.    parse value FILESPEC( 'N', ordered_file_path_and_name ) with,  /* 0275 */
  276.       ordered_file_name '.' ordered_file_ext                      /* 0276 */
  277.                                                                   /* 0277 */
  278.    /*----------------------------------*\                         /* 0278 */
  279.    |  Check for prior existence of DLL  |                         /* 0279 */
  280.    \*----------------------------------*/                         /* 0280 */
  281.    index_list = index_stem.ordered_file_name                      /* 0281 */
  282.    if WORDS( index_list ) > 1 then                                /* 0282 */
  283.       if sos = WORD( index_list, 1 ) then                         /* 0283 */
  284.          do                                                       /* 0284 */
  285.             /* Show precedence conflict in output listing */      /* 0285 */
  286.             call LIST_SUPERCEDED_OCCURRENCES index_list           /* 0286 */
  287.             GBL.conflict_count = GBL.conflict_count + 1           /* 0287 */
  288.          end                                                      /* 0288 */
  289. end                                                               /* 0289 */
  290.                                                                   /* 0290 */
  291. /*-----------------------------*\                                 /* 0291 */
  292. |  Create TXT file of all DLLs  |                                 /* 0292 */
  293. \*-----------------------------*/                                 /* 0293 */
  294. output_line =,                                                    /* 0294 */
  295.    'List of all DLLs sorted by DLL name (case insensitive) & search order'
  296. heading_4 = CENTER( output_line, LENGTH(heading_1) ) || '0D0A'x   /* 0296 */
  297. call LINEOUT GBL.output_file, heading_4                           /* 0297 */
  298. GBL.output_line_count = GBL.output_line_count + 1                 /* 0298 */
  299.                                                                   /* 0299 */
  300. call ARRAYSORT 'sort_stem', 1, sort_stem.0                        /* 0300 */
  301.                                                                   /* 0301 */
  302. do ss = 1 to sort_stem.0                                          /* 0302 */
  303.    parse value sort_stem.ss with,                                 /* 0303 */
  304.       . sos .                                                     /* 0304 */
  305.    parse value search_order_stem.sos with,                        /* 0305 */
  306.       file_date,                                                  /* 0306 */
  307.       file_time,                                                  /* 0307 */
  308.       file_size,                                                  /* 0308 */
  309.       file_attr,                                                  /* 0309 */
  310.       file_path_and_name                                          /* 0310 */
  311.    file_path_and_name = STRIP( file_path_and_name )               /* 0311 */
  312.                                                                   /* 0312 */
  313.    file_path = FILESPEC( 'D', file_path_and_name ) ||,            /* 0313 */
  314.                FILESPEC( 'P', file_path_and_name )                /* 0314 */
  315.    parse value FILESPEC( 'N', file_path_and_name ) with,          /* 0315 */
  316.       file_name '.' file_ext                                      /* 0316 */
  317.                                                                   /* 0317 */
  318.    output_line =,                                                 /* 0318 */
  319.       RIGHT( file_date , 8 )         || GBL.column_blanks ||,     /* 0319 */
  320.       RIGHT( file_time , 6 )         || GBL.column_blanks ||,     /* 0320 */
  321.       RIGHT( EDIT( file_size ), 10 ) || GBL.column_blanks ||,     /* 0321 */
  322.       LEFT( FILESPEC( 'N', file_path_and_name ), 12 ) || GBL.column_blanks ||,
  323.       file_path                                                   /* 0323 */
  324.    call LINEOUT GBL.output_file, output_line                      /* 0324 */
  325. end                                                               /* 0325 */
  326. call STREAM GBL.output_file, 'C', 'CLOSE'                         /* 0326 */
  327.                                                                   /* 0327 */
  328. output_line =,                                                    /* 0328 */
  329.    EDIT( search_order_stem.0 ) ||,                                /* 0329 */
  330.    ' DLLs found'                                                  /* 0330 */
  331. call LINEOUT GBL.output_file, '0D0A'x || CENTER( output_line, LENGTH(heading_1) )
  332. GBL.output_line_count = GBL.output_line_count + 1                 /* 0332 */
  333.                                                                   /* 0333 */
  334. /*-----------------------------------------*\                     /* 0334 */
  335. |  Inform user if there were any conflicts  |                     /* 0335 */
  336. \*-----------------------------------------*/                     /* 0336 */
  337. if GBL.conflict_count > 0 then                                    /* 0337 */
  338.    do                                                             /* 0338 */
  339.       if GBL.conflict_count = 1 then                              /* 0339 */
  340.          do                                                       /* 0340 */
  341.             was_were = 'was '                                     /* 0341 */
  342.          end                                                      /* 0342 */
  343.       else                                                        /* 0343 */
  344.          do                                                       /* 0344 */
  345.             was_were = 'were '                                    /* 0345 */
  346.          end                                                      /* 0346 */
  347.       say '   There '                 ||,                         /* 0347 */
  348.           was_were                    ||,                         /* 0348 */
  349.           GBL.conflict_count          ||,                         /* 0349 */
  350.           ' DLL conflicts listed in ' ||,                         /* 0350 */
  351.           GBL.output_file                                         /* 0351 */
  352.    end                                                            /* 0352 */
  353.                                                                   /* 0353 */
  354. call EOJ 0                                                        /* 0354 */
  355.                                                                   /* 0355 */
  356. /*----------------------------------------------------------------*\
  357. |                                                                  |
  358. |                        EDIT REXX function                        |
  359. | ---------------------------------------------------------------- |
  360. |                                                                  |
  361. |   The following REXX subroutine / function will return an        |
  362. |   edited integer or decimal value with appropriate               |
  363. |   punctuation inserted appropriately (subject to DIGITS() ).     |
  364. |   The correct punctuation characters are obtained from the       |
  365. |   object system. For example (assuming US notation):             |
  366. |                                                                  |
  367. |         EDIT(12345)                                              |
  368. |                                                                  |
  369. |    will return 12,345; and                                       |
  370. |                                                                  |
  371. |         EDIT(-123456.78)                                         |
  372. |                                                                  |
  373. |    will return -123,456.78                                       |
  374. |                                                                  |
  375. |    The intent behind the creation of this function was speed.    |
  376. |    It is being released to the public domain by the author -     |
  377. |    Dick Goran, author of the "REXX Reference Summary Handbook"   |
  378. |       71154,2002                 CompuServe                      |
  379. |       71154.2002@compuserve.com  Internet                        |
  380. |       HONE80(DEV4672)            IBMLink                         |
  381. |       (1:209/705)                FIDONET                         |
  382. |                                                                  |
  383. |    88/04/24 - originally written for DOS Personal REXX           |
  384. |    93/12/25 - handle negative values & international notation    |
  385. |               (presumes REXXUTIL registered)                     |
  386. |                                                                  |
  387. \*----------------------------------------------------------------*/
  388. EDIT:                                                             /* 0388 */
  389.    Procedure                                                      /* 0389 */
  390. /* first time here, build translate tables */                     /* 0390 */
  391. SIGNAL OFF NOVALUE                                                /* 0391 */
  392. if LEFT(e1, 1) <> '01'x then                                      /* 0392 */
  393.    do                                                             /* 0393 */
  394.       e1 = XRANGE('01'x, '19'x)                                   /* 0394 */
  395.       e2 = XRANGE('01'x, '03'x) || '19'x ||,                      /* 0395 */
  396.            XRANGE('04'x, '06'x) || '19'x ||,                      /* 0396 */
  397.            XRANGE('07'x, '09'x) || '19'x ||,                      /* 0397 */
  398.            XRANGE('0A'x, '0C'x) || '19'x ||,                      /* 0398 */
  399.            XRANGE('0D'x, '0F'x) || '19'x ||,                      /* 0399 */
  400.            XRANGE('10'x, '12'x) || '19'x ||,                      /* 0400 */
  401.            XRANGE('13'x, '15'x) || '19'x ||,                      /* 0401 */
  402.            XRANGE('16'x, '18'x)                                   /* 0402 */
  403.       /* get punctuation characters from INI file  */             /* 0403 */
  404.       decimal  = STRIP( SysIni( 'USER',,                          /* 0404 */
  405.                                 'PM_National',,                   /* 0405 */
  406.                                 'sDecimal' ), 'T', '00'x )        /* 0406 */
  407.       thousand = STRIP( SysIni( 'USER',,                          /* 0407 */
  408.                                 'PM_National',,                   /* 0408 */
  409.                                 'sThousand' ), 'T', '00'x )       /* 0409 */
  410.    end                                                            /* 0410 */
  411. SIGNAL ON NOVALUE                                                 /* 0411 */
  412.                                                                   /* 0412 */
  413. /* return BAD if non-numeric data */                              /* 0413 */
  414. if DATATYPE( ARG(1) ) <> 'NUM' then                               /* 0414 */
  415.    return 'BAD'                                                   /* 0415 */
  416.                                                                   /* 0416 */
  417. /* test and save sign value along with absolute numeric value */  /* 0417 */
  418. if SIGN( ARG(1) ) <> '-1' then                                    /* 0418 */
  419.    sign_character = ''                                            /* 0419 */
  420. else                                                              /* 0420 */
  421.    sign_character = '-'                                           /* 0421 */
  422. absolute_value = ABS( ARG(1) )                                    /* 0422 */
  423.                                                                   /* 0423 */
  424. /* test for and save decimal value indicator */                   /* 0424 */
  425. decimal_position = POS( decimal, absolute_value )                 /* 0425 */
  426.                                                                   /* 0426 */
  427. if decimal_position = 0 then                                      /* 0427 */
  428.    source = RIGHT( absolute_value, LENGTH(e1) - 1 ) || ' '        /* 0428 */
  429. else                                                              /* 0429 */
  430.    source = RIGHT( LEFT( absolute_value, decimal_position - 1 ), LENGTH(e1) - 1 ) || ' '
  431.                                                                   /* 0431 */
  432. if decimal_position = 0 then                                      /* 0432 */
  433.    edited_number =,                                               /* 0433 */
  434.       STRIP( TRANSLATE( TRANSLATE( e2, source, e1), ',', ' '), 'B', ',')
  435. else                                                              /* 0435 */
  436.    edited_number =,                                               /* 0436 */
  437.       STRIP( TRANSLATE( TRANSLATE( e2, source, e1), ',', ' '), 'B', ','),
  438.                       || RIGHT( absolute_value,,                  /* 0438 */
  439.                                 LENGTH(absolute_value) - decimal_position + 1)
  440. return sign_character || edited_number                            /* 0440 */
  441.                                                                   /* 0441 */
  442. /*------------------------------------------------------------------------*\
  443. |                                                                          |
  444. |                Show precedence conflict in output listing                |
  445. |                                                                          |
  446. \*------------------------------------------------------------------------*/
  447. LIST_SUPERCEDED_OCCURRENCES:                                      /* 0447 */
  448.    Procedure expose,                                              /* 0448 */
  449.       GBL.,                                                       /* 0449 */
  450.       search_order_stem.                                          /* 0450 */
  451.                                                                   /* 0451 */
  452. parse arg search_order_subscript_list                             /* 0452 */
  453. superceding_subscript = WORD( search_order_subscript_list, 1 )    /* 0453 */
  454.                                                                   /* 0454 */
  455. parse value search_order_stem.superceding_subscript with,         /* 0455 */
  456.    superceding_file_date,                                         /* 0456 */
  457.    superceding_file_time,                                         /* 0457 */
  458.    superceding_file_size,                                         /* 0458 */
  459.    superceding_file_attr,                                         /* 0459 */
  460.    superceding_file_name_ext                                      /* 0460 */
  461. superceding_file_name_ext = STRIP( superceding_file_name_ext )    /* 0461 */
  462.                                                                   /* 0462 */
  463. output_line =,                                                    /* 0463 */
  464.    RIGHT( superceding_file_date , 8 )         || GBL.column_blanks ||,
  465.    RIGHT( superceding_file_time , 6 )         || GBL.column_blanks ||,
  466.    RIGHT( EDIT( superceding_file_size ), 10 ) || GBL.column_blanks ||,
  467.    superceding_file_name_ext          || GBL.column_blanks ||,    /* 0467 */
  468.    ' supercedes:'                                                 /* 0468 */
  469. call LINEOUT GBL.output_file, output_line                         /* 0469 */
  470. GBL.output_line_count = GBL.output_line_count + 1                 /* 0470 */
  471.                                                                   /* 0471 */
  472. do sl = 2 to WORDS( search_order_subscript_list )                 /* 0472 */
  473.                                                                   /* 0473 */
  474.    prior_subscript = WORD( search_order_subscript_list, sl )      /* 0474 */
  475.    parse value search_order_stem.prior_subscript with,            /* 0475 */
  476.       prior_file_date,                                            /* 0476 */
  477.       prior_file_time,                                            /* 0477 */
  478.       prior_file_size,                                            /* 0478 */
  479.       prior_file_attr,                                            /* 0479 */
  480.       prior_file_name_ext                                         /* 0480 */
  481.    prior_file_name_ext = STRIP( prior_file_name_ext )             /* 0481 */
  482.                                                                   /* 0482 */
  483.    output_line =,                                                 /* 0483 */
  484.       RIGHT( prior_file_date, 8 )          || GBL.column_blanks ||,
  485.       RIGHT( prior_file_time, 6 )          || GBL.column_blanks ||,
  486.       RIGHT( EDIT( prior_file_size ), 10 ) || GBL.column_blanks ||,
  487.       prior_file_name_ext                                         /* 0487 */
  488.    call LINEOUT GBL.output_file, output_line                      /* 0488 */
  489.    GBL.output_line_count = GBL.output_line_count + 1              /* 0489 */
  490. end                                                               /* 0490 */
  491.                                                                   /* 0491 */
  492. call LINEOUT GBL.output_file, ' '                                 /* 0492 */
  493. GBL.output_line_count = GBL.output_line_count + 1                 /* 0493 */
  494.                                                                   /* 0494 */
  495. return                                                            /* 0495 */
  496.                                                                   /* 0496 */
  497. !tr! = VALUE('TRACE',,'OS2ENVIRONMENT'); if !tr! <> '' then do; TRACE(!tr!); nop; end
  498. /*------------------------------------------------------------------------*\
  499. |                                                                          |
  500. |                                End of Job                                |
  501. |                                                                          |
  502. \*------------------------------------------------------------------------*/
  503. EOJ:                                                              /* 0503 */
  504.    Procedure                                                      /* 0504 */
  505.                                                                   /* 0505 */
  506. if ARG() = 0 then                                                 /* 0506 */
  507.    eoj_rc = 0                                                     /* 0507 */
  508. else                                                              /* 0508 */
  509.    eoj_rc = ARG(1)                                                /* 0509 */
  510.                                                                   /* 0510 */
  511. elapsed_time = TIME('E')            /* get elapsed time - sssss.uuuuu */
  512. parse value elapsed_time with seconds '.' micro_seconds           /* 0512 */
  513. if SUBSTR( micro_seconds, 1, 1 ) >= 5 then                        /* 0513 */
  514.    seconds = seconds + 1                                          /* 0514 */
  515. ss = FORMAT( seconds // 60, 2 )                                   /* 0515 */
  516. minutes = ( seconds - ss ) / 60                                   /* 0516 */
  517. mm = FORMAT( minutes // 60, 2 )                                   /* 0517 */
  518. hh = FORMAT( ( minutes - mm ) / 60, 2 )                           /* 0518 */
  519. duration = hh':'mm':'ss                                           /* 0519 */
  520.                                                                   /* 0520 */
  521. parse Source   . . program_path_and_name                          /* 0521 */
  522. program_name = TRANSLATE( FILESPEC( 'N', program_path_and_name ) )
  523. say 'EOJ  ' program_name 'at' TIME('N') ||,                       /* 0523 */
  524.     ', duration' TRANSLATE( duration, '0', ' ' )                  /* 0524 */
  525. exit eoj_rc                                                       /* 0525 */
  526.                                                                   /* 0526 */
  527. /*------------------------------------------------------------------------*\
  528. |                                                                          |
  529. |                   Register external function routines                    |
  530. |                                                                          |
  531. \*------------------------------------------------------------------------*/
  532. REGISTER_REQUIRED_FUNCTIONS:                                      /* 0532 */
  533.    Procedure expose REXX_Version                                  /* 0533 */
  534.                                                                   /* 0534 */
  535. /*----------------------------------------*\                      /* 0535 */
  536. |  Load REXXUtil External Function Module  |                      /* 0536 */
  537. \*----------------------------------------*/                      /* 0537 */
  538. module             = 'REXXUTIL'                                   /* 0538 */
  539. entry_name         = 'SysLoadFuncs'                               /* 0539 */
  540. function_name      = 'SysLoadFuncs'                               /* 0540 */
  541. anticipated_return = ''                                           /* 0541 */
  542. call REGISTER_ROUTINE function_name module entry_name anticipated_return
  543.                                                                   /* 0543 */
  544. /*-----------------------------------*\                           /* 0544 */
  545. |  Load the REXXLIB Function Package  |                           /* 0545 */
  546. \*-----------------------------------*/                           /* 0546 */
  547. if REXX_Version = 'REXX/Personal' then                            /* 0547 */
  548.    do                                                             /* 0548 */
  549.       module = 'qrexxlib'                                         /* 0549 */
  550.    end                                                            /* 0550 */
  551. else                                                              /* 0551 */
  552.    do                                                             /* 0552 */
  553.       module = 'rexxlib'                                          /* 0553 */
  554.    end                                                            /* 0554 */
  555. entry_name         = 'rexxlibregister'                            /* 0555 */
  556. function_name      = 'RexxLibRegister'                            /* 0556 */
  557. anticipated_return = '1'                                          /* 0557 */
  558. call REGISTER_ROUTINE function_name module entry_name anticipated_return
  559.                                                                   /* 0559 */
  560. return                                                            /* 0560 */
  561.                                                                   /* 0561 */
  562.                                                                   /* 0562 */
  563. /*---------------------*\                                         /* 0563 */
  564. |  Register Subroutine  |                                         /* 0564 */
  565. \*---------------------*/                                         /* 0565 */
  566. REGISTER_ROUTINE:                                                 /* 0566 */
  567.    Procedure                                                      /* 0567 */
  568.                                                                   /* 0568 */
  569. parse ARG  function_name,                                         /* 0569 */
  570.            module,                                                /* 0570 */
  571.            entry_name,                                            /* 0571 */
  572.            anticipated_return                                     /* 0572 */
  573.                                                                   /* 0573 */
  574. if RxFuncQuery(function_name) = 0 then return      /* function registered */
  575.                                                                   /* 0575 */
  576. if LENGTH(module) > 8 then                                        /* 0576 */
  577.    do                                                             /* 0577 */
  578.       dll_drive = FILESPEC( 'D', module )                         /* 0578 */
  579.       dll_path  = STRIP( FILESPEC( 'P', module ), 'T', '\' )      /* 0579 */
  580.       module    = FILESPEC( 'N', module )                         /* 0580 */
  581.       '@' || dll_drive                                            /* 0581 */
  582.       '@cd' dll_drive || dll_path                                 /* 0582 */
  583.    end                                                            /* 0583 */
  584. else                                                              /* 0584 */
  585.    do                                                             /* 0585 */
  586.       dll_drive = ''                                              /* 0586 */
  587.    end                                                            /* 0587 */
  588.                                                                   /* 0588 */
  589. parse var module module_fname '.' module_fext                     /* 0589 */
  590. if RxFuncAdd( function_name, module_fname, entry_name ) = 0 then  /* 0590 */
  591.    do                                                             /* 0591 */
  592.       register_call = 'call' function_name                        /* 0592 */
  593.       interpret register_call                                     /* 0593 */
  594.       if WORD( RESULT, 1 ) <> WORD( anticipated_return, 1 ) then  /* 0594 */
  595.          do                                                       /* 0595 */
  596.             Say function_name 'returned' RESULT '-',              /* 0596 */
  597.                                          anticipated_return 'was expected'
  598.             exit 255                                              /* 0598 */
  599.          end                                                      /* 0599 */
  600.    end                                                            /* 0600 */
  601. else                                                              /* 0601 */
  602.    do                                                             /* 0602 */
  603.       Say 'RxFuncAdd returned' RESULT 'registering' module        /* 0603 */
  604.       exit 254                                                    /* 0604 */
  605.    end                                                            /* 0605 */
  606. if dll_drive <> '' then                                           /* 0606 */
  607.    do                                                             /* 0607 */
  608.       Parse Source . . program_path_and_name                      /* 0608 */
  609.       '@' || LEFT( program_path_and_name, 2 )                     /* 0609 */
  610.    end                                                            /* 0610 */
  611. return                                                            /* 0611 */
  612.                                                                   /* 0612 */
  613. /*------------------------------------------------------------------------*\
  614. |                                                                          |
  615. |                              Trap Routines                               |
  616. |                                                                          |
  617. \*------------------------------------------------------------------------*/
  618. ERROR:   call TRAP_PROCESSING SIGL, 'ERROR',   RC                 /* 0618 */
  619. FAILURE: call TRAP_PROCESSING SIGL, 'FAILURE', RC                 /* 0619 */
  620. HALT:    call TRAP_PROCESSING SIGL, 'HALT',    ''                 /* 0620 */
  621. NOVALUE: call TRAP_PROCESSING SIGL, 'NOVALUE', ''                 /* 0621 */
  622. SYNTAX:  call TRAP_PROCESSING SIGL, 'SYNTAX',  RC                 /* 0622 */
  623.                                                                   /* 0623 */
  624. /* Rev. 94/06/14 */                                               /* 0624 */
  625. TRAP_PROCESSING:                                                  /* 0625 */
  626.    parse Source . . TRAP.path_and_program                         /* 0626 */
  627.    if POS( ':', TRAP.path_and_program ) > 0 then                  /* 0627 */
  628.       /* get source line if it is available */                    /* 0628 */
  629.       do                                                          /* 0629 */
  630.          trap_source_line = STRIP( SOURCELINE(ARG(1)) )           /* 0630 */
  631.       end                                                         /* 0631 */
  632.    else                                                           /* 0632 */
  633.       /* program is running in macrospace */                      /* 0633 */
  634.       do                                                          /* 0634 */
  635.          TRAP.path_and_program = VALUE( 'TEMP',, 'OS2ENVIRONMENT' ) ||,
  636.                                  TRAP.path_and_program            /* 0636 */
  637.          trap_source_line = 'Source line is not available.'       /* 0637 */
  638.       end                                                         /* 0638 */
  639.                                                                   /* 0639 */
  640.    parse value FILESPEC( 'N', TRAP.path_and_program ) with,       /* 0640 */
  641.       TRAP.fn '.' TRAP.fe                                         /* 0641 */
  642.    trap_file_name = FILESPEC( 'D', TRAP.path_and_program ) ||,    /* 0642 */
  643.                     FILESPEC( 'P', TRAP.path_and_program ) ||,    /* 0643 */
  644.                     TRAP.fn || '.' || 'DMP'                       /* 0644 */
  645.                                                                   /* 0645 */
  646.    /*------------------------------------------*\                 /* 0646 */
  647.    |  check for reason not to create .DMP file  |                 /* 0647 */
  648.    \*------------------------------------------*/                 /* 0648 */
  649.    if ARG(2) = 'HALT' then                                        /* 0649 */
  650.       do                                                          /* 0650 */
  651.          trap_file_name = ''                                      /* 0651 */
  652.       end                                                         /* 0652 */
  653.    if RxFuncQuery( 'VARDUMP' ) <> 0 then                          /* 0653 */
  654.       do                                                          /* 0654 */
  655.          trap_file_name = ''                                      /* 0655 */
  656.       end                                                         /* 0656 */
  657.    if POS( ':', trap_file_name ) = 0 then                         /* 0657 */
  658.       do                                                          /* 0658 */
  659.          trap_file_name = ''                                      /* 0659 */
  660.       end                                                         /* 0660 */
  661.                                                                   /* 0661 */
  662.    /*------------------------*\                                   /* 0662 */
  663.    |  Build trap message box  |                                   /* 0663 */
  664.    \*------------------------*/                                   /* 0664 */
  665.    dbl.h    = 'CD'x                 /* ═ double line - horizontal   */
  666.    dbl.v    = 'BA'x                 /* ║ double line - vertical     */
  667.    dbl.bl   = 'C8'x                 /* ╚ double line - bottom left  */
  668.    dbl.br   = 'BC'x                 /* ╝ double line - bottom right */
  669.    dbl.tl   = 'C9'x                 /* ╔ double line - top left     */
  670.    dbl.tr   = 'BB'x                 /* ╗ double line - top right    */
  671.    say ' '                                                        /* 0671 */
  672.    trap_error_description =,                                      /* 0672 */
  673.       'Error line = ' || ARG(1) ||,                               /* 0673 */
  674.       '; '                      ||,                               /* 0674 */
  675.       ARG(2)                    ||,                               /* 0675 */
  676.       ' error.'                                                   /* 0676 */
  677.    if ARG(3) <> '' then                                           /* 0677 */
  678.       trap_error_description = trap_error_description ||,         /* 0678 */
  679.                                '  Return code = ' || ARG(3)       /* 0679 */
  680.    say dbl.tl || COPIES( dbl.h, LENGTH(trap_error_description) + 2 ) || dbl.tr
  681.    say dbl.v  || COPIES( ' ',   LENGTH(trap_error_description) + 2 ) || dbl.v
  682.    say dbl.v CENTER( TRAP.fn || '.CMD', LENGTH(trap_error_description)) dbl.v
  683.    say dbl.v               trap_error_description                       dbl.v
  684.    if trap_file_name <> '' then                                   /* 0684 */
  685.       do                                                          /* 0685 */
  686.    say dbl.v  || COPIES( ' ',   LENGTH(trap_error_description) + 2 ) || dbl.v
  687.    say dbl.v     CENTER( 'See: ' || trap_file_name,,              /* 0687 */
  688.                                       LENGTH(trap_error_description) )  dbl.v
  689.       end                                                         /* 0689 */
  690.    say dbl.v  || COPIES( ' ',   LENGTH(trap_error_description) + 2 ) || dbl.v
  691.    say dbl.bl || COPIES( dbl.h, LENGTH(trap_error_description) + 2 ) || dbl.br
  692.    say ' '                                                        /* 0692 */
  693.    say 'Source line at time of trap:'                             /* 0693 */
  694.    say '   ' || trap_source_line                                  /* 0694 */
  695.    say ' '                                                        /* 0695 */
  696.                                                                   /* 0696 */
  697.    /*---------------------------------*\                          /* 0697 */
  698.    |  Create .DMP file if appropriate  |                          /* 0698 */
  699.    \*---------------------------------*/                          /* 0699 */
  700.    if trap_file_name <> '' then                                   /* 0700 */
  701.       do                                                          /* 0701 */
  702.          call SysFileDelete trap_file_name                        /* 0702 */
  703.          /* remove meaningless labels from dump for clarity */    /* 0703 */
  704.          drop dbl. TRAP. RC RESULT SIGL !tr!                      /* 0704 */
  705.          call VARDUMP trap_file_name  /* write variables to program.DMP file */
  706.       end                                                         /* 0706 */
  707.    exit 254                                                       /* 0707 */
  708. /*---------  REXX Cross Reference  - Created: 10/25/94 3:26pm ----------*\
  709.  
  710. ---- VARIABLES ----
  711. !tr!                0497<  0497   0497   0704
  712. Calling_Environment
  713.                     0036
  714. GBL.                0038<  0449
  715. GBL.column_blanks   0060<  0319   0320   0321   0322   0464   0465   0466
  716.                     0467   0484   0485   0486
  717. GBL.conflict_count  0061<  0287<  0287   0337   0339   0349
  718. GBL.environment     0039<
  719. GBL.output_file     0056<  0080<  0082   0088   0169   0190   0197   0204
  720.                     0209   0212   0297   0324   0326   0331   0351   0469
  721.                     0488   0492
  722. GBL.output_line_count
  723.                     0059<  0170<  0170   0198<  0198   0205<  0205   0210<
  724.                     0210   0213<  0213   0298<  0298   0332<  0332   0470<
  725.                     0470   0489<  0489   0493<  0493
  726. GBL.program_name    0040<  0046   0054   0194
  727. GBL.program_path    0041<
  728. GBL.program_version
  729.                     0043<
  730. OS_Name             0035
  731. RC                  0618   0619   0622   0704
  732. RESULT              0083   0086   0090   0594   0596   0603   0704
  733. REXX_Version        0034   0533   0547
  734. SIGL                0618   0619   0620   0621   0622   0704
  735. TRAP.               0704
  736. TRAP.fe             0641
  737. TRAP.fn             0641   0644   0682
  738. TRAP.path_and_program
  739.                     0626   0627   0635<  0636   0640   0642   0643
  740. Version             0034
  741. absolute_value      0422<  0425   0428   0430   0438   0439
  742. anticipated_return  0541<  0542   0557<  0558   0572   0594   0597
  743. config_sys_file_area
  744.                     0106<  0107<  0107   0114   0126   0135
  745. config_sys_file_name
  746.                     0096<  0098   0102   0106   0108   0118   0196
  747. config_sys_file_size
  748.                     0098<  0099   0106
  749. dbl.                0704
  750. dbl.bl              0667<  0691
  751. dbl.br              0668<  0691
  752. dbl.h               0665<  0680   0691
  753. dbl.tl              0669<  0680
  754. dbl.tr              0670<  0680
  755. dbl.v               0666<  0681   0681   0682   0682   0683   0683   0686
  756.                     0686   0687   0688   0690   0690
  757. decimal             0404<  0425
  758. decimal_position    0425<  0427   0430   0432   0439
  759. dll_drive           0578<  0581   0582   0586<  0606
  760. dll_path            0152   0153   0155<  0157   0162   0167   0179   0579<
  761.                     0582
  762. duration            0519<  0524
  763. e1                  0392   0394<  0428   0430   0434   0437
  764. e2                  0395<  0434   0437
  765. edited_number       0433<  0436<  0440
  766. elapsed_time        0511<  0512
  767. entry_name          0539<  0542   0555<  0558   0571   0590
  768. eoj_rc              0507<  0509<  0525
  769. fe                  0055
  770. file_attr           0309
  771. file_date           0306   0319
  772. file_ext            0316
  773. file_name           0316
  774. file_path           0313<  0323
  775. file_path_and_name  0310   0311<  0311   0313   0314   0315   0322
  776. file_size           0308   0321
  777. file_time           0307   0320
  778. fn                  0055   0058
  779. function_name       0540<  0542   0556<  0558   0569   0574   0590   0592
  780.                     0596
  781. heading_1           0191<  0197   0203   0209   0296   0331
  782. heading_2           0203<  0204
  783. heading_3           0144<  0156<  0207   0209
  784. heading_4           0296<  0297
  785. hh                  0518<  0519
  786. index_list          0281<  0282   0283   0286
  787. index_stem.         0220<
  788. index_stem.ordered_file_name
  789.                     0249   0251<  0251   0256<  0281
  790. libpath_beg_pointer
  791.                     0114<  0115   0124<  0124   0127   0136   0137
  792. libpath_end_pointer
  793.                     0125<  0128   0137
  794. libpath_line        0135<  0145
  795. libpath_search_arg  0113<  0114   0124
  796. libpath_tokens      0145<  0150   0151   0152
  797. micro_seconds       0512   0513
  798. minutes             0516<  0517   0518
  799. mm                  0517<  0518   0519
  800. module              0538<  0542   0549<  0553<  0558   0570   0576   0578
  801.                     0579   0580<  0580   0589   0603
  802. module_fext         0589
  803. module_fname        0589   0590
  804. ordered_file_attr   0228   0269
  805. ordered_file_date   0225   0266
  806. ordered_file_ext    0235   0276
  807. ordered_file_name   0235   0276
  808. ordered_file_path   0232<  0273<
  809. ordered_file_path_and_name
  810.                     0229   0230<  0230   0232   0233   0234   0243   0270
  811.                     0271<  0271   0273   0274   0275
  812. ordered_file_size   0227   0268
  813. ordered_file_time   0226   0267
  814. output_line         0166<  0169   0171   0200<  0203   0294<  0296   0318<
  815.                     0324   0328<  0331   0463<  0469   0483<  0488
  816. parameter_1         0066   0067   0069<  0069   0072   0078   0080
  817. path_index.         0147<
  818. path_index.dll_path
  819.                     0176<
  820. path_index.uppercase_dll_path
  821.                     0164
  822. path_table.0        0146<  0163   0175<
  823. path_table.pt       0174<
  824. prior_file_attr     0479
  825. prior_file_date     0476   0484
  826. prior_file_name_ext
  827.                     0480   0481<  0481   0487
  828. prior_file_size     0478   0486
  829. prior_file_time     0477   0485
  830. prior_subscript     0474<
  831. program_name        0522<  0523
  832. program_path_and_name
  833.                     0037   0040   0041   0042   0521   0522   0608   0609
  834. pt                  0163<  0175   0176
  835. register_call       0592<  0593
  836. search_order_stem.  0450
  837. search_order_stem.0
  838.                     0148<  0183   0222   0263   0329
  839. search_order_stem.prior_subscript
  840.                     0475
  841. search_order_stem.sos
  842.                     0224   0265   0305
  843. search_order_stem.superceding_subscript
  844.                     0455
  845. search_order_subscript_list
  846.                     0452   0453   0472   0474
  847. seconds             0512   0514<  0514   0515   0516
  848. sign_character      0419<  0421<  0440
  849. sl                  0472   0474
  850. sort_stem.0         0221<  0240   0241<  0300   0302
  851. sort_stem.ss        0242<  0303
  852. sos                 0222   0244   0252   0256   0263   0283   0304
  853. ss                  0240<  0241   0302   0515<  0516   0519
  854. superceding_file_attr
  855.                     0459
  856. superceding_file_date
  857.                     0456   0464
  858. superceding_file_name_ext
  859.                     0460   0461<  0461   0467
  860. superceding_file_size
  861.                     0458   0466
  862. superceding_file_time
  863.                     0457   0465
  864. superceding_subscript
  865.                     0453<
  866. temp_stem.0         0182
  867. thousand            0407<
  868. trap_error_description
  869.                     0672<  0678<  0678   0680   0681   0682   0683   0686
  870.                     0688   0690   0691
  871. trap_file_name      0642<  0651<  0655<  0657   0659<  0684   0687   0700
  872.                     0702   0705
  873. trap_source_line    0630<  0637<  0694
  874. uppercase_dll_path  0162<  0174
  875. was_were            0341<  0345<  0348
  876. with                0054   0151   0224   0234   0265   0275   0303   0305
  877.                     0315   0455   0475   0512   0640
  878. x                   0113   0125   0169   0296   0331   0392   0394   0394
  879.                     0395   0395   0395   0396   0396   0396   0397   0397
  880.                     0397   0398   0398   0398   0399   0399   0399   0400
  881.                     0400   0400   0401   0401   0401   0402   0402   0406
  882.                     0409   0665   0666   0667   0668   0669   0670
  883.  
  884. ---- LABELS ----
  885. EDIT                0388:
  886. EOJ                 0076   0090   0104   0120   0131   0354   0503:
  887. ERROR               0049   0618:
  888. FAILURE             0619:
  889. HALT                0050   0620:
  890. LIST_SUPERCEDED_OCCURRENCES
  891.                     0286   0447:
  892. NOVALUE             0051   0391   0411   0621:
  893. REGISTER_REQUIRED_FUNCTIONS
  894.                     0047   0532:
  895. REGISTER_ROUTINE    0542   0558   0566:
  896. SYNTAX              0052   0622:
  897. TRAP_PROCESSING     0618   0619   0620   0621   0622   0625:
  898.  
  899. ---- FUNCTIONS ----
  900. ABS                 0422
  901. ARG                 0414   0418   0422   0506   0509   0630   0649   0673
  902.                     0675   0677   0679
  903. ARRAYCOPY           0183
  904. ARRAYSORT           0300
  905. CENTER              0203   0209   0296   0331   0682   0687
  906. CHARIN              0106
  907. COPIES              0060   0192   0193   0680   0681   0686   0690   0691
  908. DATATYPE            0414
  909. DATE                0192
  910. DOSBOOTDRIVE        0096
  911. DOSCD               0057   0155
  912. DOSDRIVE            0056   0155
  913. EDIT                0321   0329   0466   0486
  914. FILESPEC            0040   0041   0042   0232   0233   0234   0243   0273
  915.                     0274   0275   0313   0314   0315   0322   0522   0578
  916.                     0579   0580   0640   0642   0643
  917. FORMAT              0515   0517   0518
  918. LEFT                0067   0243   0322   0392   0430   0609
  919. LENGTH              0124   0203   0209   0296   0331   0428   0430   0439
  920.                     0576   0680   0681   0682   0686   0688   0690   0691
  921. LINEOUT             0169   0197   0204   0209   0212   0297   0324   0331
  922.                     0469   0488   0492
  923. POS                 0114   0125   0425   0627   0657
  924. RIGHT               0244   0319   0320   0321   0428   0430   0438   0464
  925.                     0465   0466   0484   0485   0486
  926. RxFuncAdd           0590
  927. RxFuncQuery         0574   0653
  928. SIGN                0418
  929. SOURCELINE          0630
  930. STREAM              0098   0108   0326
  931. STRIP               0069   0230   0271   0311   0404   0407   0434   0437
  932.                     0461   0481   0579   0630
  933. SUBSTR              0135   0513
  934. SysFileDelete       0082   0702
  935. SysFileTree         0179
  936. SysIni              0404   0407
  937. TIME                0044   0046   0193   0511   0523
  938. TRACE               0497
  939. TRANSLATE           0046   0058   0107   0162   0194   0196   0434   0434
  940.                     0437   0437   0522   0524
  941. VALUE               0497   0635
  942. VARDUMP             0705
  943. WORD                0283   0453   0474   0594   0594
  944. WORDS               0072   0282   0472
  945. XRANGE              0394   0395   0396   0397   0398   0399   0400   0401
  946.                     0402
  947.  
  948. \*-------------------  End of REXX Cross Reference  -------------------*/
  949.