home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / atrgf31.zip / date2str.cmd < prev    next >
OS/2 REXX Batch file  |  1993-09-20  |  16KB  |  361 lines

  1. /*
  2. program: date2str.cmd
  3. type:    REXXSAA-OS/2
  4. purpose: allow formatting of sorted date into string pattern
  5. version: 1.2
  6. date:    1991-05-20
  7. changed: 1992-06-18, removed bundling to ATRGF.CMD etc., RGF
  8.          1993-09-20, changed the definition of ANSI-color-sequences; gets them from
  9.                      procedure ScrColor.CMD
  10. author:  Rony G. Flatscher,
  11.          Wirtschaftsuniversität/Vienna
  12.          RONY@AWIWUW11.BITNET
  13.          rony@wu-wien.ac.at
  14.  
  15. needs:   DATERGF.CMD, SCRCOLOR.CMD
  16.  
  17. usage:   DATE2STR(SDATE, PATTERN[, DELIMITER])
  18.          see enclosed Tutorial "RGFSHOW.CMD" and syntax below
  19.  
  20. All rights reserved, copyrighted 1991, 1992, 1993, no guarantee that it works without
  21. errors, etc. etc.
  22.  
  23. donated to the public domain granted that you are not charging anything
  24. (money etc.) for it and derivates based upon it, as you did not write it,
  25. etc. if that holds you may bundle it with commercial programs too
  26.  
  27. Please, if you find an error, post me a message describing it, I will
  28. try to fix and rerelease it to the net.
  29.  
  30. usage:    DATE2STR(SDATE, PATTERN[, DELIMITER])
  31.  
  32.  
  33. syntax:
  34.     SDATE ...... sorted date (YYYYMMDD)
  35.     PATTERN .... string with embedded date-tokens led in by '%'
  36.     DELIMITER .. one character overriding standard delimiter '%'
  37.  
  38.     date-tokens take the form (results shown for sorted date "19940106"):
  39.  
  40.     token:  => result:
  41.  
  42.     %y[y]   => 94       ... two digit year
  43.     %yyy[y] => 1994     ... four digit year
  44.  
  45.     %m      => 3        ... monthnumber without leading null
  46.     %mm     => 03       ... monthnumber with leading null if one digit
  47.     %mmm    => Jan      ... monthname with three letters (mixed case)
  48.     %MMM    => JAN      ... monthname with three letters (uppercase)
  49.     %mmmm   => January  ... monthname in full (mixed case)
  50.     %MMMM   => JANUARY  ... monthname in full (uppercase)
  51.  
  52.     %d      => 6        ... daynumber without leading null
  53.     %dd     => 06       ... daynumber with leading null if one digit
  54.     %ddd    => Thu      ... dayname with three letters (mixed case)
  55.     %DDD    => THU      ... dayname with three letters (uppercase)
  56.     %dddd   => Thursday ... dayname in full (mixed case)
  57.     %DDDD   => THURSDAY ... dayname in full (uppercase)
  58.  
  59.     %w      =>   1      ... week-no. without leading null
  60.     %ww     =>  01      ... week-no. with leading null
  61.  
  62.     %j      =>   6      ... Julian days without leading nulls
  63.     %jj     =>  06      ... Julian days with one leading null if one digit
  64.     %jjj    => 006      ... Julian days with leading nulls (3 digits width)
  65. */
  66.  
  67. IF ARG(1) = '' | ARG(1) = '?' THEN SIGNAL usage
  68.  
  69. date = ARG(1)
  70. pattern = ARG(2)
  71. IF ARG(3) = '' THEN delimiter = '%'     /* default delimiter */
  72. ELSE
  73.    IF LENGTH(ARG(3)) <> 1 THEN DO
  74.       errmsg = ARG(3)': delimiter must be ONE character only'
  75.       SIGNAL error
  76.    END
  77.    ELSE delimiter = ARG(3)
  78.  
  79. result_date2str = pattern
  80. pattern2 = TRANSLATE(pattern)
  81. dayname   = datergf(date, "DN") /* get dayname */
  82.  
  83. IF dayname = '' THEN DO         /* error in sorted date ? */
  84.    errmsg = ARG(1)': illegal date'
  85.    SIGNAL error
  86. END
  87.  
  88. monthname = datergf(date, "MN") /* get monthname   */
  89. week      = datergf(date, "W")  /* get week        */
  90. julian    = datergf(date, "J")  /* get Julian date */
  91.  
  92. index = 1
  93. token_nr = 1
  94.  
  95. /*
  96.     token.x.type    ... type of token
  97.     token.x.start   ... start position of token
  98.     token.x.length  ... length of token
  99.     x = token number in pattern
  100. */
  101.  
  102. char_nr = LENGTH(pattern)
  103.  
  104. DO index = 1 TO char_nr
  105.    letter = SUBSTR(pattern2, index, 1)
  106.    IF letter = delimiter THEN DO
  107.       token.token_nr.start = index              /* start of token with delimiter */
  108.       index = index + 1
  109.  
  110.       IF index > char_nr THEN LEAVE             /* end of pattern ? */
  111.  
  112.       letter = SUBSTR(pattern2, index, 1)
  113.  
  114.       IF letter = delimiter THEN DO             /* successive delimiters */
  115.          index = index - 1                      /* reset index */
  116.          ITERATE
  117.       END
  118.       i2 = 1                                    /* length of symbol */
  119.  
  120.       SELECT
  121.          WHEN letter = 'Y' THEN                 /* year in hand ? */
  122.               DO
  123.                  DO index = index + 1 TO char_nr
  124.                     IF SUBSTR(pattern2, index, 1) = 'Y' THEN i2 = i2 + 1
  125.                     ELSE LEAVE
  126.                  END
  127.  
  128.                  IF i2 > 2 THEN token.token_nr.type = 12     /* year: 4 digits */
  129.                  ELSE token.token_nr.type = 11               /* year; 2 digits */
  130.               END
  131.  
  132.          WHEN letter = 'M' THEN                 /* month in hand ? */
  133.               DO
  134.                  DO index = index + 1 TO char_nr
  135.                     IF SUBSTR(pattern2, index, 1)  = 'M' THEN i2 = i2 + 1
  136.                     ELSE LEAVE
  137.                  END
  138.  
  139.                  SELECT
  140.                     WHEN i2 = 1 THEN token.token_nr.type = 21  /* digit without leading null */
  141.  
  142.                     WHEN i2 = 2 THEN token.token_nr.type = 22  /* digit with leading null */
  143.  
  144.                     WHEN i2 = 3 THEN
  145.                          IF SUBSTR(pattern, token.token_nr.start+1, 1) = 'm' THEN
  146.                             token.token_nr.type = 23           /* three mixed letters     */
  147.                          ELSE
  148.                             token.token_nr.type = 24           /* three uppercase letters */
  149.  
  150.                     OTHERWISE DO
  151.                          IF SUBSTR(pattern, token.token_nr.start+1, 1) = 'm' THEN
  152.                             token.token_nr.type = 25           /* full name mixed letters     */
  153.                          ELSE
  154.                             token.token_nr.type = 26           /* full name uppercase letters */
  155.                        END
  156.                  END
  157.               END
  158.  
  159.          WHEN letter = 'D' THEN                    /* day in hand ? */
  160.               DO
  161.                  DO index = index + 1 TO char_nr
  162.                     IF SUBSTR(pattern2, index, 1) = 'D' THEN i2 = i2 + 1
  163.                     ELSE LEAVE
  164.                  END
  165.  
  166.                  SELECT
  167.                     WHEN i2 = 1 THEN token.token_nr.type = 31  /* digit without leading null */
  168.  
  169.                     WHEN i2 = 2 THEN token.token_nr.type = 32  /* digit with leading null */
  170.  
  171.                     WHEN i2 = 3 THEN
  172.                          IF SUBSTR(pattern, token.token_nr.start+1, 1) = 'd' THEN
  173.                             token.token_nr.type = 33           /* three mixed letters     */
  174.                          ELSE
  175.                             token.token_nr.type = 34           /* three uppercase letters */
  176.  
  177.                     OTHERWISE DO
  178.                          IF SUBSTR(pattern, token.token_nr.start+1, 1) = 'd' THEN
  179.                             token.token_nr.type = 35           /* full name mixed letters     */
  180.                          ELSE
  181.                             token.token_nr.type = 36           /* full name uppercase letters */
  182.                        END
  183.                  END
  184.               END
  185.  
  186.          WHEN letter = 'J' THEN                    /* Julian day in hand ? */
  187.               DO
  188.                  DO index = index + 1 TO char_nr
  189.                     IF SUBSTR(pattern2, index, 1) = 'J' THEN i2 = i2 + 1
  190.                     ELSE LEAVE
  191.                  END
  192.  
  193.                  SELECT
  194.                     WHEN i2 = 1 THEN token.token_nr.type = 41  /* digit without leading null   */
  195.  
  196.                     WHEN i2 = 2 THEN token.token_nr.type = 42  /* digit with leading null      */
  197.  
  198.                     OTHERWISE token.token_nr.type = 43         /* digit with two leading nulls */
  199.                  END
  200.               END
  201.  
  202.          WHEN letter = 'W' THEN                    /* week in hand ? */
  203.               DO
  204.                  DO index = index + 1 TO char_nr
  205.                     IF SUBSTR(pattern2, index, 1) = 'W' THEN i2 = i2 + 1
  206.                     ELSE LEAVE
  207.                  END
  208.  
  209.                  IF i2 = 1 THEN token.token_nr.type = 51   /* digit without leading null   */
  210.                  ELSE token.token_nr.type = 52             /* digit with leading null */
  211.               END
  212.  
  213.          OTHERWISE NOP
  214.       END
  215.       index = index - 1                 /* reduce index, as it will be incremented on top */
  216.       token.token_nr.length = i2 + 1    /* length of token, including delimiter */
  217.       token_nr = token_nr + 1           /* increase token count */
  218.    END
  219.  
  220. END
  221.  
  222. token_nr = token_nr - 1                 /* adjust token count */
  223.  
  224. IF token_nr > 0 THEN DO                 /* if tokens found overlay them */
  225.     DO i = token_nr TO 1 BY -1
  226.        SELECT
  227.           WHEN token.i.type < 20 THEN   /* year to format */
  228.                IF token.i.type = 11 THEN tmp = SUBSTR(date, 3, 2)  /* two year digits */
  229.                ELSE tmp = SUBSTR(date, 1, 4)                      /* all year digits */
  230.  
  231.           WHEN token.i.type < 30 THEN   /* month to format */
  232.                SELECT
  233.                   WHEN token.i.type = 21 THEN           /* no leading zeros */
  234.                       tmp = SUBSTR(date, 5, 2) % 1
  235.  
  236.                   WHEN token.i.type = 22 THEN           /* two digits       */
  237.                       tmp = SUBSTR(date, 5, 2)
  238.  
  239.                   WHEN token.i.type = 23 | token.i.type = 24 THEN DO
  240.                         tmp = SUBSTR(monthname, 1, 3)  /* first three letters */
  241.                         IF token.i.type = 24 THEN tmp = TRANSLATE(tmp)
  242.                       END
  243.  
  244.                   OTHERWISE DO                         /* all letters */
  245.                      tmp = monthname
  246.                      IF token.i.type = 26 THEN tmp = TRANSLATE(tmp)
  247.                   END
  248.                END
  249.  
  250.           WHEN token.i.type < 40 THEN   /* day to format */
  251.                SELECT
  252.                   WHEN token.i.type = 31 THEN           /* no leading zeros */
  253.                       tmp = SUBSTR(date, 7, 2) % 1
  254.  
  255.                   WHEN token.i.type = 32 THEN           /* two digits       */
  256.                       tmp = SUBSTR(date, 7, 2)
  257.  
  258.                   WHEN token.i.type = 33 | token.i.type = 34 THEN DO
  259.                         tmp = SUBSTR(dayname, 1, 3)    /* first three letters */
  260.                         IF token.i.type = 34 THEN tmp = TRANSLATE(tmp)
  261.                       END
  262.  
  263.                   OTHERWISE DO                         /* all letters */
  264.                      tmp = dayname
  265.                      IF token.i.type = 36 THEN tmp = TRANSLATE(tmp)
  266.                   END
  267.                END
  268.  
  269.           WHEN token.i.type < 50 THEN   /* Julian day to format */
  270.                DO
  271.                   tmp = SUBSTR(Julian, 5, 3)
  272.                   SELECT
  273.                      WHEN token.i.type = 41 THEN   /* no leading zeros */
  274.                         tmp = tmp % 1
  275.  
  276.                      WHEN token.i.type = 42 THEN DO  /* two digits, leading zero if necessary */
  277.                           tmp = tmp % 1
  278.                           IF tmp < 100 THEN
  279.                              tmp = RIGHT(tmp, 2, '0')
  280.                         END
  281.  
  282.                      OTHERWISE NOP                /* all three Julian digits */
  283.                   END
  284.                END
  285.  
  286.           OTHERWISE                     /* week to format */
  287.                 IF tmp = 52 THEN tmp = RIGHT(week, 2, '0')
  288.                 ELSE tmp = week
  289.        END
  290.        /* prepare string according to received pattern */
  291.        right_part = SUBSTR(result_date2str, (token.i.start + token.i.length))
  292.        result_date2str = SUBSTR(pattern, 1, token.i.start - 1)||tmp||right_part
  293.     END
  294. END
  295.  
  296.  
  297. RETURN result_date2str         /* return value */
  298. /* end of main routine */
  299.  
  300.  
  301. USAGE:
  302. /* get ANSI-color-sequences from ScrColor.CMD */
  303. PARSE VALUE ScrColor() WITH screen_normal screen_inverse text_normal text_info text_highlight text_alarm .
  304.  
  305. SAY
  306. SAY text_info'DATE2STR:'screen_normal' format string with date-tokens'
  307. SAY
  308. SAY text_alarm'usage:'text_highlight'    DATE2STR(SDATE, PATTERN[, DELIMITER])'
  309. SAY
  310. SAY text_alarm'syntax:'
  311. SAY text_info'    SDATE'screen_normal' ...... sorted date (YYYYMMDD)'
  312. SAY text_info'    PATTERN'screen_normal' .... string with embedded date-tokens led in by "'text_info'%'screen_normal'"'
  313. SAY text_info'    DELIMITER'screen_normal' .. one character overriding standard delimiter "%"'
  314. SAY
  315. SAY '    date-tokens take the form (results shown for sorted date "'text_info'19940106'screen_normal'"):'
  316. SAY
  317. SAY '    token:  => result:'
  318. SAY
  319. SAY text_info'    %y[y]'screen_normal'   => 'text_info'94       'screen_normal'... two digit year'
  320. SAY text_info'    %yyy[y]'screen_normal' => 'text_info'1994     'screen_normal'... four digit year'
  321. SAY
  322. SAY text_info'    %m      'screen_normal'=> 'text_info'3        'screen_normal'... monthnumber without leading null'
  323. SAY text_info'    %mm     'screen_normal'=> 'text_info'03       'screen_normal'... monthnumber with leading null if one digit'
  324. SAY text_info'    %mmm    'screen_normal'=> 'text_info'Jan      'screen_normal'... monthname with three letters (mixed case)'
  325. SAY text_info'    %MMM    'screen_normal'=> 'text_info'JAN      'screen_normal'... monthname with three letters (uppercase)'
  326. SAY text_info'    %mmmm   'screen_normal'=> 'text_info'January  'screen_normal'... monthname in full (mixed case)'
  327. SAY text_info'    %MMMM   'screen_normal'=> 'text_info'JANUARY  'screen_normal'... monthname in full (uppercase)'
  328. SAY
  329. SAY text_info'    %d      'screen_normal'=> 'text_info'6        'screen_normal'... daynumber without leading null'
  330. SAY text_info'    %dd     'screen_normal'=> 'text_info'06       'screen_normal'... daynumber with leading null if one digit'
  331. SAY text_info'    %ddd    'screen_normal'=> 'text_info'Thu      'screen_normal'... dayname with three letters (mixed case)'
  332. SAY text_info'    %DDD    'screen_normal'=> 'text_info'THU      'screen_normal'... dayname with three letters (uppercase)'
  333. SAY text_info'    %dddd   'screen_normal'=> 'text_info'Thursday 'screen_normal'... dayname in full (mixed case)'
  334. SAY text_info'    %DDDD   'screen_normal'=> 'text_info'THURSDAY 'screen_normal'... dayname in full (uppercase)'
  335. SAY
  336. SAY text_info'    %w      'screen_normal'=> 'text_info'  1      'screen_normal'... week-no. without leading null'
  337. SAY text_info'    %ww     'screen_normal'=> 'text_info' 01      'screen_normal'... week-no. with leading null'
  338. SAY
  339. SAY text_info'    %j      'screen_normal'=> 'text_info'  6      'screen_normal'... Julian days without leading nulls'
  340. SAY text_info'    %jj     'screen_normal'=> 'text_info' 06      'screen_normal'... Julian days with one leading null if one digit'
  341. SAY text_info'    %jjj    'screen_normal'=> 'text_info'006      'screen_normal'... Julian days with leading nulls (3 digits width)'
  342. SAY
  343. SAY text_alarm'examples:'screen_normal
  344. SAY '    (1) with default escape character being: 'text_info'%'
  345. SAY text_highlight'        DATE2STR(19940106, "%dddd, %d. %mmmm in the year %yyyy")'screen_normal
  346. SAY '        results in:'
  347. SAY text_highlight'        "Thursday, 6. January in the year 1994"'screen_normal
  348. SAY
  349. SAY '    (2) with escape character being: 'text_info'!'
  350. SAY text_highlight'        DATE2STR(19940106, "!DDD, !dd. !MMMM in the year !yy", "!")'screen_normal
  351. SAY '        results in:'
  352. SAY text_highlight'        "THU, 06. JANUARY in the year 94"'screen_normal
  353.  
  354. EXIT
  355.  
  356. ERROR:
  357. /* error message on device "STDERR" */
  358. '@ECHO DATE2STR: 'errmsg' >&2'
  359. EXIT ''
  360.  
  361.