| 1 | – | /* Copyright (c) 1991 Regents of the University of California */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ LBL"; | 
| 2 | > | static const char RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Routines for recognizing and moving about words in strings. | 
| 6 | + | * | 
| 7 | + | * External symbols declared in standard.h | 
| 8 |  | */ | 
| 9 |  |  | 
| 10 | + | #include "copyright.h" | 
| 11 | + |  | 
| 12 |  | #include  <ctype.h> | 
| 13 |  |  | 
| 14 | < | #ifdef  BSD | 
| 14 | < | #define  strchr         index | 
| 15 | < | #endif | 
| 14 | > | #include  "rtio.h" | 
| 15 |  |  | 
| 16 | < | #define  NULL           0 | 
| 16 | > | char * | 
| 17 | > | atos(char *rs, int nb, char *s)         /* get word from string, returning rs */ | 
| 18 | > | { | 
| 19 | > | char  *cp = rs; | 
| 20 |  |  | 
| 21 | < | extern char  *strchr(); | 
| 21 | > | while (isspace(*s)) | 
| 22 | > | s++; | 
| 23 | > | while (--nb > 0 && *s && !isspace(*s)) | 
| 24 | > | *cp++ = *s++; | 
| 25 | > | *cp = '\0'; | 
| 26 | > | return(rs); | 
| 27 | > | } | 
| 28 |  |  | 
| 29 |  |  | 
| 30 |  | char * | 
| 31 | < | atos(rs, nb, s)                 /* get next word from string */ | 
| 24 | < | char  *rs; | 
| 25 | < | register int  nb; | 
| 26 | < | register char  *s; | 
| 31 | > | nextword(char *cp, int nb, char *s)     /* get (quoted) word, returning new s */ | 
| 32 |  | { | 
| 33 | < | register char  *cp = rs; | 
| 33 | > | int     quote = 0; | 
| 34 |  |  | 
| 35 | + | if (s == NULL) return(NULL); | 
| 36 |  | while (isspace(*s)) | 
| 37 |  | s++; | 
| 38 | < | while (--nb > 0 && *s && !isspace(*s)) | 
| 38 | > | switch (*s) { | 
| 39 | > | case '\0': | 
| 40 | > | return(NULL); | 
| 41 | > | case '"': | 
| 42 | > | case '\'': | 
| 43 | > | quote = *s++; | 
| 44 | > | } | 
| 45 | > | while (--nb > 0 && *s && (quote ? *s!=quote : !isspace(*s))) | 
| 46 |  | *cp++ = *s++; | 
| 47 |  | *cp = '\0'; | 
| 48 | < | return(rs); | 
| 48 | > | if (quote && *s==quote) | 
| 49 | > | s++; | 
| 50 | > | return(s); | 
| 51 |  | } | 
| 52 |  |  | 
| 53 |  |  | 
| 54 |  | char * | 
| 55 | < | sskip(s)                        /* skip word in string */ | 
| 41 | < | register char  *s; | 
| 55 | > | sskip(char *s)                  /* skip word in string, leaving on space */ | 
| 56 |  | { | 
| 57 |  | while (isspace(*s)) | 
| 58 |  | s++; | 
| 63 |  |  | 
| 64 |  |  | 
| 65 |  | char * | 
| 66 | < | iskip(s)                        /* skip integer in string */ | 
| 53 | < | register char  *s; | 
| 66 | > | sskip2(char *s, int n)          /* skip word(s) in string, leaving on word */ | 
| 67 |  | { | 
| 68 |  | while (isspace(*s)) | 
| 69 |  | s++; | 
| 70 | < | if (*s == '-' || *s == '+') | 
| 70 | > | while (n-- > 0) { | 
| 71 | > | while (*s && !isspace(*s)) | 
| 72 | > | s++; | 
| 73 | > | while (isspace(*s)) | 
| 74 | > | s++; | 
| 75 | > | } | 
| 76 | > | return(s); | 
| 77 | > | } | 
| 78 | > |  | 
| 79 | > |  | 
| 80 | > | char * | 
| 81 | > | iskip(char *s)                  /* skip integer in string */ | 
| 82 | > | { | 
| 83 | > | while (isspace(*s)) | 
| 84 |  | s++; | 
| 85 | + | if ((*s == '-') | (*s == '+')) | 
| 86 | + | s++; | 
| 87 |  | if (!isdigit(*s)) | 
| 88 |  | return(NULL); | 
| 89 |  | do | 
| 94 |  |  | 
| 95 |  |  | 
| 96 |  | char * | 
| 97 | < | fskip(s)                        /* skip float in string */ | 
| 70 | < | register char  *s; | 
| 97 | > | fskip(char *s)                  /* skip float in string */ | 
| 98 |  | { | 
| 99 | < | register char  *cp = s; | 
| 99 | > | char  *cp; | 
| 100 |  |  | 
| 101 | < | while (isspace(*cp)) | 
| 102 | < | cp++; | 
| 103 | < | if (*cp == '-' || *cp == '+') | 
| 104 | < | cp++; | 
| 105 | < | s = cp; | 
| 101 | > | while (isspace(*s)) | 
| 102 | > | s++; | 
| 103 | > | if ((*s == '-') | (*s == '+')) | 
| 104 | > | s++; | 
| 105 | > | cp = s; | 
| 106 |  | while (isdigit(*cp)) | 
| 107 |  | cp++; | 
| 108 |  | if (*cp == '.') { | 
| 112 |  | } | 
| 113 |  | if (cp == s) | 
| 114 |  | return(NULL); | 
| 115 | < | if (*cp == 'e' || *cp == 'E') | 
| 116 | < | return(iskip(cp+1)); | 
| 115 | > | if ((*cp == 'e') | (*cp == 'E')) | 
| 116 | > | return(isspace(*++cp) ? NULL : iskip(cp)); | 
| 117 |  | return(cp); | 
| 118 |  | } | 
| 119 |  |  | 
| 120 |  |  | 
| 121 | < | isint(s)                        /* check integer format */ | 
| 122 | < | char  *s; | 
| 121 | > | int | 
| 122 | > | isint(char *s)                  /* check integer format */ | 
| 123 |  | { | 
| 124 | < | register char  *cp; | 
| 124 | > | char  *cp; | 
| 125 |  |  | 
| 126 |  | cp = iskip(s); | 
| 127 |  | return(cp != NULL && *cp == '\0'); | 
| 128 |  | } | 
| 129 |  |  | 
| 130 |  |  | 
| 131 | < | isintd(s, ds)                   /* check integer format with delimiter set */ | 
| 132 | < | char  *s, *ds; | 
| 131 | > | int | 
| 132 | > | isintd(char *s, char *ds)       /* check integer format with delimiter set */ | 
| 133 |  | { | 
| 134 | < | register char  *cp; | 
| 134 | > | char  *cp; | 
| 135 |  |  | 
| 136 |  | cp = iskip(s); | 
| 137 |  | return(cp != NULL && strchr(ds, *cp) != NULL); | 
| 138 |  | } | 
| 139 |  |  | 
| 140 |  |  | 
| 141 | < | isflt(s)                        /* check float format */ | 
| 142 | < | char  *s; | 
| 141 | > | int | 
| 142 | > | isflt(char *s)                  /* check float format */ | 
| 143 |  | { | 
| 144 | < | register char  *cp; | 
| 144 | > | char  *cp; | 
| 145 |  |  | 
| 146 |  | cp = fskip(s); | 
| 147 |  | return(cp != NULL && *cp == '\0'); | 
| 148 |  | } | 
| 149 |  |  | 
| 150 |  |  | 
| 151 | < | isfltd(s, ds)                   /* check integer format with delimiter set */ | 
| 152 | < | char  *s, *ds; | 
| 151 | > | int | 
| 152 | > | isfltd(char *s, char *ds)       /* check integer format with delimiter set */ | 
| 153 |  | { | 
| 154 | < | register char  *cp; | 
| 154 | > | char  *cp; | 
| 155 |  |  | 
| 156 |  | cp = fskip(s); | 
| 157 |  | return(cp != NULL && strchr(ds, *cp) != NULL); | 
| 158 | + | } | 
| 159 | + |  | 
| 160 | + |  | 
| 161 | + | int | 
| 162 | + | isname(char *s)                 /* check for legal identifier name */ | 
| 163 | + | { | 
| 164 | + | while (*s == '_')                       /* skip leading underscores */ | 
| 165 | + | s++; | 
| 166 | + | if (!isascii(*s) || !isalpha(*s))       /* start with a letter */ | 
| 167 | + | return(0); | 
| 168 | + | while (isascii(*++s) && isgraph(*s))    /* all visible characters */ | 
| 169 | + | ; | 
| 170 | + | return(*s == '\0');                     /* ending in nul */ | 
| 171 |  | } |