From Beefy Treeshrew, 2 Weeks ago, written in Plain Text.
  1.       * $ ./database -c "Reminder" "Bob's Birthday" "Buy birthday present for Bob."
  2.       * $ ./database -c "Wishlist" "Beethoven" "Beethoven's Ode to Joy"
  3.       * $ ./database -c "Reminder" "Add to Simple Database" "Add brainf*** example for Simple Database on Rosetta Code."
  4.       * ...
  5.       * $ ./database -f "Mozart"
  6.       * An entry with that title was not found.
  7.       * $ ./database -t
  8.       * Date added: 2013/08/13 Tag: Reminder            
  9.       * Title: Bob's Birthday                                    
  10.       * Contents:
  11.       *   Buy birthday present for Bob.
  12.       *  
  13.       * Date added: 2013/08/13 Tag: Reminder            
  14.       * Title: Add to Simple Database                            
  15.       * Contents:
  16.       *   Add brainf*** example for Simple Database on Rosetta Code.
  17.       *  
  18.       * Date added: 2013/08/13 Tag: Wishlist            
  19.       * Title: Beethoven                                        
  20.       * Contents:
  21.       *   Beethoven's Ode to Joy
  22.       *
  23.       * $ ./database -r "Beethoven"
  24.       * $ ./database -l
  25.       * Date added: 2013/08/13 Tag: Reminder            
  26.       * Title: Add to Simple Database                            
  27.       * Contents:
  28.       *   Add brainf*** example for Simple Database on Rosetta Code.
  29.       * $
  30.  
  31.        IDENTIFICATION DIVISION.
  32.        PROGRAM-ID. simple-database.
  33.  
  34.        ENVIRONMENT DIVISION.
  35.        INPUT-OUTPUT SECTION.
  36.        FILE-CONTROL.
  37.            SELECT OPTIONAL database-file ASSIGN Database-Path
  38.                ORGANIZATION INDEXED
  39.                ACCESS SEQUENTIAL
  40.                RECORD KEY data-title
  41.                ALTERNATE RECORD KEY data-tag
  42.                    WITH DUPLICATES
  43.                ALTERNATE RECORD KEY date-added
  44.                    WITH DUPLICATES
  45.                FILE STATUS file-status
  46.                .
  47.        DATA DIVISION.
  48.        FILE SECTION.
  49.        FD  database-file.
  50.        01  database-record.
  51.            *> Date is in YYYYMMDD format.
  52.            03  date-added          PIC 9(8).
  53.            03  data-tag            PIC X(20).
  54.            03  data-title          PIC X(50).
  55.            03  data-contents       PIC X(200).
  56.            *> Adding extra space is considered good style so the record
  57.            *> can be expanded in the future.
  58.            03  FILLER              PIC X(50).
  59.  
  60.        WORKING-STORAGE SECTION.
  61.        78  Database-Path           VALUE "database.dat".
  62.  
  63.        01  file-status             PIC XX.
  64.            88  file-ok             VALUE "00".
  65.            88  duplicate-key       VALUE "22".
  66.            88  key-not-found       VALUE "23".
  67.  
  68.        01  num-args                PIC 99.
  69.  
  70.        01  action                  PIC XX.
  71.            88  create-entry        VALUE "-c".
  72.            88  remove-entry        VALUE "-r".
  73.            88  find-entry          VALUE "-f".
  74.            88  print-latest        VALUE "-l".
  75.            88  print-database      VALUES "-a", "-d", "-t".
  76.            *> Printed by title.
  77.            88  print-by-title      VALUE "-a".
  78.            88  print-by-date       VALUE "-d".
  79.            88  print-by-tag        VALUE "-t".
  80.            88  print-help          VALUES "-h", SPACES.
  81.  
  82.        01  read-direction-flag     PIC X VALUE SPACE.
  83.            88  read-backwards      VALUE "B".
  84.  
  85.        01  edited-date             PIC 9(4)/99/99.
  86.        PROCEDURE DIVISION.
  87.        DECLARATIVES.
  88.        database-file-error SECTION.
  89.            USE AFTER ERROR ON database-file
  90.  
  91.            DISPLAY "An error has occurred while using " Database-Path
  92.                ". Error no. " file-status
  93.            DISPLAY "The program will terminate."
  94.  
  95.            CLOSE database-file
  96.  
  97.            GOBACK
  98.            .
  99.        END DECLARATIVES.
  100.  
  101.        main-line.
  102.            DISPLAY 1 UPON ARGUMENT-NUMBER
  103.            ACCEPT action FROM ARGUMENT-VALUE
  104.  
  105.            ACCEPT num-args FROM ARGUMENT-NUMBER
  106.  
  107.            EVALUATE TRUE
  108.                WHEN create-entry
  109.                    IF num-args >= 4
  110.                        PERFORM write-entry
  111.                    ELSE
  112.                        DISPLAY "-a requires arguments to enter in the "
  113.                            "database. See help (-h) for details."
  114.                    END-IF
  115.  
  116.                WHEN remove-entry
  117.                    IF num-args >= 2
  118.                        PERFORM delete-entry
  119.                    ELSE
  120.                        DISPLAY "-r requires the title of the entry to "
  121.                            "delete."
  122.                    END-IF
  123.  
  124.                WHEN find-entry
  125.                    IF num-args >= 2
  126.                        PERFORM display-specified-entry
  127.                    ELSE
  128.                        DISPLAY "-f requires the title of the entry to "
  129.                            "find."
  130.                    END-IF
  131.  
  132.                WHEN print-latest
  133.                    PERFORM show-latest
  134.  
  135.                WHEN print-database
  136.                    PERFORM show-database
  137.  
  138.                WHEN print-help
  139.                    PERFORM show-general-help
  140.  
  141.                WHEN OTHER
  142.                    DISPLAY action " is not a valid option."
  143.            END-EVALUATE
  144.  
  145.            GOBACK
  146.            .
  147.        write-entry.
  148.            OPEN EXTEND database-file
  149.  
  150.            DISPLAY 2 UPON ARGUMENT-NUMBER
  151.            ACCEPT data-tag FROM ARGUMENT-VALUE
  152.            DISPLAY 3 UPON ARGUMENT-NUMBER
  153.            ACCEPT data-title FROM ARGUMENT-VALUE
  154.            IF data-title = SPACES
  155.                DISPLAY "The title cannot be blank."
  156.                PERFORM close-and-terminate
  157.            END-IF
  158.  
  159.            DISPLAY 4 UPON ARGUMENT-NUMBER
  160.            ACCEPT data-contents FROM ARGUMENT-VALUE
  161.  
  162.            ACCEPT date-added FROM DATE YYYYMMDD
  163.  
  164.            WRITE database-record
  165.                INVALID KEY
  166.                    IF duplicate-key
  167.                        DISPLAY "An entry in the database already has "
  168.                            "that title. Please choose a different "
  169.                            "title or remove the entry."
  170.                    ELSE
  171.                        PERFORM database-file-error
  172.                    END-IF
  173.            END-WRITE
  174.  
  175.            PERFORM close-database
  176.            .
  177.        delete-entry.
  178.            PERFORM get-title-arg
  179.            OPEN I-O database-file
  180.            PERFORM read-title
  181.  
  182.            DELETE database-file
  183.  
  184.            PERFORM close-database
  185.            .
  186.        display-specified-entry.
  187.            PERFORM get-title-arg
  188.            OPEN INPUT database-file
  189.            PERFORM read-title
  190.  
  191.            PERFORM show-record
  192.  
  193.            PERFORM close-database
  194.            .
  195.        get-title-arg.
  196.            DISPLAY 2 UPON ARGUMENT-NUMBER
  197.            ACCEPT data-title FROM ARGUMENT-VALUE
  198.            .
  199.        read-title.
  200.            START database-file KEY IS = data-title
  201.                INVALID KEY
  202.                    IF key-not-found
  203.                        DISPLAY "An entry with that title was not found."
  204.                        PERFORM close-and-terminate
  205.                    ELSE
  206.                        PERFORM database-file-error
  207.                    END-IF
  208.            END-START
  209.  
  210.            READ database-file
  211.            .
  212.        close-and-terminate.
  213.             PERFORM close-database
  214.             GOBACK
  215.             .
  216.        show-latest.
  217.            OPEN INPUT database-file
  218.  
  219.            PERFORM start-at-last-date
  220.            READ database-file
  221.            PERFORM show-record
  222.  
  223.            PERFORM close-database
  224.            .
  225.        show-database.
  226.            OPEN INPUT database-file
  227.  
  228.            EVALUATE TRUE
  229.                WHEN print-by-title
  230.                    *> Primary key is the title.
  231.                    CONTINUE
  232.                WHEN print-by-tag
  233.                    MOVE LOW-VALUES TO data-tag
  234.                    START database-file KEY IS > data-tag
  235.                WHEN print-by-date
  236.                    PERFORM start-at-last-date
  237.                    SET read-backwards TO TRUE
  238.            END-EVALUATE
  239.  
  240.            PERFORM FOREVER
  241.                *> The problem with statements instead of functions...
  242.                IF NOT read-backwards
  243.                    READ database-file NEXT
  244.                        AT END
  245.                            EXIT PERFORM
  246.                    END-READ
  247.                ELSE
  248.                    READ database-file PREVIOUS
  249.                        AT END
  250.                            EXIT PERFORM
  251.                    END-READ
  252.                END-IF
  253.  
  254.                PERFORM show-record
  255.                DISPLAY SPACE
  256.            END-PERFORM
  257.  
  258.            PERFORM close-database
  259.            .
  260.        start-at-last-date.
  261.            MOVE HIGH-VALUES TO date-added
  262.            START database-file KEY IS < date-added
  263.            .
  264.        close-database.
  265.            CLOSE database-file
  266.            .
  267.        show-record.
  268.            MOVE date-added TO edited-date
  269.            DISPLAY "Date added: " edited-date " Tag: " data-tag
  270.            DISPLAY "Title: " data-title
  271.            DISPLAY "Contents:"
  272.            DISPLAY "  " FUNCTION TRIM(data-contents)
  273.            .
  274.        show-general-help.
  275.            DISPLAY "Help: Possible options are:"
  276.            DISPLAY "  -a - Show all the entries (sorted by title)."
  277.            DISPLAY "  -c - Create a new entry in the database. -c needs"
  278.                " further arguments in this format:"
  279.            DISPLAY '    "tag" "title" "content"'
  280.            DISPLAY "    Max argument sizes (in characters): tag - 20, "
  281.                "title - 50, content - 200"
  282.            DISPLAY "    The title must be unique and not be blank."
  283.            DISPLAY "  -d - Show all the entries sorted by date added."
  284.            DISPLAY "  -f - Finds and displays entry with the title "
  285.                "provided. The title should be specified as shown for "
  286.                "-c."
  287.            DISPLAY "  -h - Show this help menu."
  288.            DISPLAY "  -l - Show the latest entry."
  289.            DISPLAY "  -r - Remove the entry with the title provided. "
  290.                "The title should be specified as shown for -c."
  291.            DISPLAY "  -t - Show all the entries sorted by tag."
  292.            .
captcha