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