home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / wps / games / sayings / fortune2 / fortunes.cmd next >
OS/2 REXX Batch file  |  1992-09-10  |  10KB  |  272 lines

  1. /* -----------------------------------------------------------------------
  2.  
  3.          Title: FORTUNES.CMD
  4.  
  5.         Author: Ralf Hauser
  6.  
  7.           Date: 29-07-92 / 29-07-92
  8.  
  9.       Contents: prints a random fortune
  10.  
  11.          Usage: fortunes  [switches]  [filename]  [message]
  12.  
  13.                 Try "fortunes -?" for help
  14.  
  15.           Note: Program spawns "PMPOPUP.EXE" - requires it to be in path
  16.  
  17. --------------------------------------------------------------------------
  18. History:
  19. 29-07-92   co Created.
  20. -------------------------------------------------------------------------- */
  21.  
  22. /* ----------------------------------------------------------------------- */
  23. /*      Interface dependencies                                             */
  24. /* ----------------------------------------------------------------------- */
  25.  
  26. '@ECHO OFF'                       /* do not display any SHELL commands */
  27.  
  28. /* ----------------------------------------------------------------------- */
  29. /*      Implementation dependencies                                        */
  30. /* ----------------------------------------------------------------------- */
  31.  
  32. /* ----------------------------------------------------------------------- */
  33. /*      Constants                                                          */
  34. /* ----------------------------------------------------------------------- */
  35.  
  36. /* ----------------------------------------------------------------------- */
  37. /*      Types / Classes                                                    */
  38. /* ----------------------------------------------------------------------- */
  39.  
  40. /* ----------------------------------------------------------------------- */
  41. /*      Globals                                                            */
  42. /* ----------------------------------------------------------------------- */
  43.  
  44. global. = ""                      /* init */
  45. filename = ""
  46.  
  47. /* ----------------------------------------------------------------------- */
  48. /*      Function declarations                                              */
  49. /* ----------------------------------------------------------------------- */
  50.  
  51.         CALL main_init            /* initialize global data structures */
  52.  
  53. /* ----------------------------------------------------------------------- */
  54. /*      Implementation                                                     */
  55. /* ----------------------------------------------------------------------- */
  56.  
  57. Main:
  58.         /* handle arguments */
  59.         Parse Arg switches filename message
  60.  
  61.         /* look whether switches are specified */
  62.         IF Substr(switches, 1, 1) <> "-" & Substr(switches, 1, 1) <> "/" THEN DO
  63.            /* no, so shift arguments */
  64.            message  = filename
  65.            filename = switches
  66.            switches = ""
  67.            END
  68.         ELSE DO /* handle switches */
  69.            IF Pos("?", switches) > 0 THEN
  70.               CALL main_help
  71.            global.debug     = Pos("d", switches)
  72.            global.popup     = Pos("p", switches)
  73.            global.quiet     = Pos("q", switches)
  74.            global.rawmode   = Pos("r", switches)
  75.            END
  76.  
  77.         /* should we use a default filename? */
  78.         IF filename = "" THEN
  79.            filename = global.filespec
  80.  
  81.         /* header */
  82.         IF global.debug <> 0 THEN DO
  83.            Say " "
  84.            CALL main_msg "V" || global.version
  85.            CALL main_msg "DEBUG: filename:" filename
  86.            CALL main_msg "DEBUG: message:" message
  87.         END
  88.  
  89.         /* open file */
  90.         IF (Stream(filename, "C", "OPEN READ") <> "READY:") THEN
  91.            CALL main_error "Could not open '" || filename || "' for reading"
  92.  
  93.         /* determine filesize */
  94.         filesize = Stream(filename, "C", "QUERY SIZE")
  95.         IF global.debug <> 0 THEN
  96.            CALL main_msg "DEBUG: filesize:" filesize
  97.         IF filesize = 0 THEN
  98.            CALL main_error "Could not determine filesize: ",
  99.                            "filesize: " filesize "bytes"
  100.  
  101.         /* determine random position */
  102.         filepos = Random(filesize)
  103.         IF global.debug <> 0 THEN
  104.            CALL main_msg "DEBUG: random pos:" filepos
  105.         CALL Stream filename, "C", "SEEK =" filepos
  106.  
  107.         /* file pointer now points to somewhere in a line, throw that away */
  108.         buffer = Linein(filename)
  109.         IF global.debug <> 0 THEN
  110.            CALL main_msg "DEBUG: line skipped:" buffer
  111.  
  112.         /* now read line with fortune */
  113.         buffer = Linein(filename)
  114.  
  115.         /* close file - no longer needed */
  116.         CALL Stream filename, "C", "CLOSE"
  117.  
  118.         /* filter that line */
  119.         IF global.debug <> 0 THEN
  120.            CALL main_msg "DEBUG: line:" buffer
  121.         /* if it is a QUOTE format file, skip leading linenums ans percent sign */
  122.         offset = Pos("%", buffer) + 1
  123.         /* otherwise display it as it is */
  124.         buffer = Substr(buffer, offset)
  125.  
  126.         /* popup line if specified */
  127.         IF global.popup <> 0 THEN
  128.            IF message = "" THEN
  129.               start pmpopup buffer
  130.            ELSE
  131.               start pmpopup message || ": " || buffer
  132.  
  133.         /* display line */
  134.         IF global.debug <> 0 THEN
  135.            Say " "
  136.         CALL main_display buffer, message
  137. EXIT
  138.  
  139. /* end: main */
  140.  
  141. /* ----------------------------------------------------------------------- */
  142. /*      initialize                                                         */
  143. /* ----------------------------------------------------------------------- */
  144.  
  145. main_init : PROCEDURE EXPOSE global.
  146. /*
  147.  *      initializes all global data
  148.  */
  149.         /* check whether RxFuncs are loaded, if not, load them */
  150.         IF RxFuncQuery('SysLoadFuncs') THEN DO
  151.            /* load the load-function */
  152.            CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
  153.            /* load the Sys* utilities */
  154.            CALL SysLoadFuncs
  155.            END
  156.  
  157.         /* set default values */
  158.         global.title         = "FORTUNES"
  159.         global.version       = "1.00"
  160.         global.debug         = 0
  161.         global.popup         = 0
  162.         global.quiet         = 0
  163.         global.rawmode       = 0
  164.         global.filespec      = "C:\APP\GAMES\FORTUNES.OS2\FORTUNES.TXT"
  165.         /* default filename for my DATABASE */
  166.         Parse Value SysTextScreenSize() with global.scrrows global.scrcols
  167.  
  168.         RETURN
  169.  
  170. /* end: main_init */
  171.  
  172. /* ----------------------------------------------------------------------- */
  173. /*      main_display                                                       */
  174. /* ----------------------------------------------------------------------- */
  175.  
  176. main_display : PROCEDURE EXPOSE global.
  177. Parse Arg txt,msg
  178.  
  179.         IF global.quiet <> 0 THEN
  180.            RETURN
  181.  
  182.         IF msg = "" THEN
  183.            phrase = txt
  184.         ELSE
  185.            phrase = msg || ": " || txt
  186.  
  187.         IF global.rawmode <> 0 THEN
  188.            Say phrase
  189.         ELSE DO
  190.            /* formatted output */
  191.            numofwords = Words(phrase)
  192.            txtlen = 0
  193.            DO i = 1 TO numofwords
  194.               buffer = Word(phrase, i) || " "
  195.               len = Length(buffer)
  196.               wouldbe = txtlen + len + 1    /* be shure to have enough space */
  197.               IF wouldbe > global.scrcols THEN DO
  198.                  Say ""          /* newline */
  199.                  CALL Charout ,"        "
  200.                  txtlen = 8
  201.                  END
  202.               CALL Charout , buffer
  203.               txtlen = txtlen + len
  204.            END
  205.         END
  206.         RETURN
  207.  
  208. /* end: main_display */
  209.  
  210. /* ----------------------------------------------------------------------- */
  211. /*      Display message                                                    */
  212. /* ----------------------------------------------------------------------- */
  213.  
  214. main_msg : PROCEDURE EXPOSE global.
  215. PARSE ARG msg
  216.  
  217.         Say global.title || ": " || msg
  218.         RETURN
  219.  
  220. /* end: main_msg */
  221.  
  222. /* ----------------------------------------------------------------------- */
  223. /*      Error handler                                                      */
  224. /* ----------------------------------------------------------------------- */
  225.  
  226. main_error : PROCEDURE EXPOSE global.
  227. Parse Arg msg, msg1, msg2
  228.  
  229.         Say global.title || ": An error occured:"
  230.         CALL Beep 500, 200
  231.         CALL Beep 900, 200
  232.         CALL Beep 500, 200
  233.         Say " "
  234.         Say "   Error: " || msg
  235.         IF msg1 <> "" THEN
  236.            Say "          " || msg1
  237.         IF msg2 <> "" THEN
  238.            Say "          " || msg2
  239.  
  240.         EXIT
  241.  
  242. /* end: main_error */
  243.  
  244. /* ----------------------------------------------------------------------- */
  245. /*      main_help                                                          */
  246. /* ----------------------------------------------------------------------- */
  247.  
  248. main_help : PROCEDURE EXPOSE global.
  249. /*
  250.  *      Prints a help
  251.  */
  252.         Say " "
  253.         Say " Usage: " || global.title || " [{/|-}switches]  [filename]  [message]"
  254.         Say " "
  255.         Say "     Possible switches are:"
  256.         Say " "
  257.         Say "        ?      this help"
  258.         Say "        d      display additional debug info"
  259.         Say "        p      display fortune as PM popup"
  260.         Say "        q      do not display fortune on stdout (quiet mode)"
  261.         Say "        r      display fortune in raw mode"
  262.         Say " "
  263.         Say "     Manually generated by Ralf Hauser (c│o), 7400 Tübingen"
  264.         Say "     e-mail: affie@frege.sns.neuphilologie.uni-tuebingen.de"
  265.  
  266.         EXIT
  267.  
  268. /* end: main_help */
  269.  
  270. /* <EOF> */
  271.  
  272.