home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume13 / okbridge / part05 / ps.c < prev   
C/C++ Source or Header  |  1992-01-12  |  4KB  |  152 lines

  1. /* ps.c -- "parse-string" data structure.
  2.  ! 
  3.  ! Copyright (C) 1990,1991 by Matthew Clegg
  4.  ! 
  5.  ! This program may be copied and distributed freely.  Please do not
  6.  ! charge money for this program or for any program derived from it.
  7.  ! If you modify this program, then include a notice stating plainly
  8.  ! that your program is derived from the okbridge program and is not
  9.  ! the same as the official okbridge program.
  10.  !
  11.  ! I welcome any suggestions for improvement to okbridge, and 
  12.  ! I would be especially happy to receive improved source code.
  13.  ! If you have comments or suggestions, or if you would like to
  14.  ! join the okbridge mailing list, then write to
  15.  !
  16.  !   mclegg@cs.ucsd.edu
  17.  !
  18.  */
  19.  
  20. #ifdef __TURBOC__
  21. #include <alloc.h>
  22. #endif
  23.  
  24. /* #include <ctype.h> */
  25. #include <stdio.h>
  26. #include "ps.h"
  27.  
  28. parse_string ps_alloc (n)
  29.     int n;
  30. /* Returns a parse_string which can hold up to n bytes of text. */
  31. {
  32.     parse_string ps;
  33.  
  34.     ps = (parse_string) malloc (n + PS_OFFSET + 1);
  35.     ps[PS_SIZE] = n;
  36.     return (ps);
  37. };
  38.  
  39. /* void ps_reset(parse_string ps); */
  40. /* Clears a parse_string so that new data can be copied into it. */
  41.  
  42. ps_put (ps, ch)
  43. parse_string ps; char ch;
  44. /* void ps_put (parse_string ps, char ch) */
  45. /* Adds the character ch to the parse_string ps. */
  46. {
  47.     if (ps[PS_LENGTH] < ps[PS_SIZE])
  48.         ps[PS_OFFSET + ps[PS_LENGTH]++] = ch;
  49. };
  50.  
  51. ps_copy (ps, s)
  52. parse_string ps; char *s;
  53. /* void ps_copy (parse_string ps, char *s) */
  54. /* Copies the string s to the parse_string ps.
  55.  * Resets ps before doing the copy.
  56.  */
  57. {
  58.     ps[PS_POS] = ps[PS_LENGTH] = 0;
  59.     while ((*s != '\0') && (ps[PS_LENGTH] < ps[PS_SIZE]))
  60.         ps[PS_OFFSET + ps[PS_LENGTH]++] = *(s++);
  61. };
  62.  
  63. ps_read (ps, fp)
  64. parse_string ps; FILE *fp;
  65. /* void ps_read (parse_string ps, FILE *fp) */
  66. /* Copies the next text line from the file fp to the parse_string ps.
  67.  * Resets ps before doing the copy.
  68.  */
  69. {
  70.     char ch;
  71.  
  72.     ps[PS_POS] = ps[PS_LENGTH] = 0;
  73.     ch = getc(fp);
  74.     while ((ch != '\n') && (ch != EOF)) {
  75.         if (ps[PS_LENGTH] < ps[PS_SIZE])
  76.             ps[PS_OFFSET + ps[PS_LENGTH]++] = ch;
  77.         ch = getc (fp);
  78.     };
  79. };
  80.  
  81. /* char ps_scan (parse_string ps); */
  82. /* Returns the current character in the parse_string ps.
  83.  * Does not advance the pointer in ps.
  84.  */
  85.  
  86. int ps_matches (ps, key)
  87. parse_string ps; char *key;
  88. /* int ps_matches (parse_string ps, char *key) */
  89. /* Returns TRUE if the next sequence of characters in the parse string
  90.  * matches key.  If so, then advances the pointer in the parse string
  91.  * past key.  Otherwise, returns FALSE.
  92.  */
  93. {
  94.     int i;
  95.     char *text;
  96.  
  97.     ps[PS_OFFSET + ps[PS_LENGTH]] = '\0';
  98.     text = ps + PS_OFFSET + ps[PS_POS];
  99.     for (i=0; key[i] != '\0'; i++)
  100.         if (key[i] != text[i])
  101.             return (0);
  102.     ps[PS_POS] += i;
  103.     return (1);
  104. };
  105.  
  106. int upper (ch)
  107. int ch;
  108. {
  109.   if (('a' <= ch) && (ch <= 'z')) 
  110.     return (ch - 'a' + 'A');
  111.   else
  112.     return (ch);
  113. };
  114.  
  115. int ps_matches_ic (ps, key)
  116. parse_string ps; char *key;
  117. /* int ps_matches_ic (parse_string ps, char *key) */
  118. /* Returns TRUE if the next sequence of characters in the parse string
  119.  * matches key, after both are converted to upper case.  If so, then
  120.  * advances the pointer in the parse string past key.
  121.  */
  122. {
  123.     int i;
  124.     char *text;
  125.  
  126.     ps[PS_OFFSET + ps[PS_LENGTH]] = '\0';
  127.     text = ps + PS_OFFSET + ps[PS_POS];
  128.     for (i=0; key[i] != '\0'; i++)
  129.       if (upper(key[i]) != upper(text[i]))
  130.         return (0);
  131.     ps[PS_POS] += i;
  132.     return (1);
  133. };
  134.  
  135. /* void ps_next (parse_string ps); */
  136. /* Advances the pointer in the parse_string ps to the next character. */
  137.  
  138. /* int ps_size  (parse_string ps); */
  139. /* Returns the number of characters allocated for text in ps. */
  140.  
  141. /* int ps_length (parse_string ps); */
  142. /* Returns the number of characters of text currently used in ps. */
  143.  
  144. /* int ps_pos (parse_string ps); */
  145. /* Returns the index of the current character in ps. */
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.