Previous: utidl Up: ../plot79_u.html Next: utidt


UTIDR

       SUBROUTINE  UTIDR (NUMBER,NEXT,ERROR,FIELD,LENGTH,FLUSH)
 C$    (Decode Roman Numerals From Character Form)
 C$    Convert an integer value represented  as a string of  Roman
 C$    numerals in FIELD(*) to internal (binary) format.   Leading
 C$    blanks and  tabs  are ignored.   Unlike  FORTRAN  formatted
 C$    input, blanks are significant.  To permit free-form  input,
 C$    the conversion  will continue  until a  character which  is
 C$    neither a sign nor a valid Roman numeral is found, or  else
 C$    the end  of FIELD(*)  is reached.   Lower-case letters  are
 C$    acceptable input.  A pointer is set to the next unprocessed
 C$    character in FIELD(*) (which  might be FIELD(LENGTH+1))  so
 C$    that the caller may check for valid syntax.  The  arguments
 C$    are:
 C$
 C$    NUMBER........Integer value (returned).
 C$    NEXT..........On exit,  index of the character in FIELD(*)
 C$                  which follows the  last character  processed.
 C$                  On  input,  it  should  point  to  the  first
 C$                  character to be processed.
 C$    ERROR......... .TRUE. - No  valid  characters found (NUMBER
 C$                            .EQ.   0),  or  illegal  syntax  in
 C$                            Roman  numeral  (NUMBER  .NE.   0).
 C$                            The latter condition  can occur  if
 C$                            adjacent numerals  occur  with  the
 C$                            smaller first, and they are not one
 C$                            of  the  valid  pairs  "CM",  "CD",
 C$                            "XC",   "XL",   "IX",   OR    "IV".
 C$                            Examples of illegal pairs are  "IC"
 C$                            (99), "ID"  (499), and  "VL"  (45).
 C$                            Since   numeric   values   can   be
 C$                            determined    for    these    pairs
 C$                            following  the  usual   subtraction
 C$                            rule, conversion continues.
 C$                  .FALSE. - No error occurred.
 C$    FIELD(*)......Character string to be decoded (A1 FORMAT).
 C$    LENGTH........Number of characters in FIELD(*).
 C$    FLUSH......... .TRUE. - Flush any leading invalid
 C$                            (non-blank, non-tab) characters.
 C$                  .FALSE. - Do not flush leading invalid
 C$                            characters.
 C$
 C$    The flush option  is useful  to allow  successive calls  to
 C$    retrieve Roman numerals separated  by commas, spaces,  etc.
 C$    The caller  must realize,  however, that  this might  cause
 C$    skipping over incorrectly-coded  items (e.g.  "II,III,IW,V"
 C$    for "II,III,IV,V").
 C$
 C$    The algorithm is adapted  from D.E. Knuth,  TEX - A  System
 C$    for Writing  Technical  Text,  extracted  from  the  Pascal
 C$    source code.
 C$    (02-FEB-82)