|
|
1.1 ! root 1: /* /sccs/src/cmd/uucp/s.getprm.c ! 2: getprm.c 1.4 8/30/84 17:37:22 ! 3: */ ! 4: #include "uucp.h" ! 5: VERSION(@(#)getprm.c 1.4) ! 6: ! 7: #define LQUOTE '(' ! 8: #define RQUOTE ')' ! 9: ! 10: #define ZERO 0 ! 11: #define WHITE 1 ! 12: #define DELIMIT 2 ! 13: #define QUOTE 3 ! 14: #define OTHER 9 ! 15: ! 16: ! 17: extern char *bal(); ! 18: ! 19: /* ! 20: * get next parameter from s ! 21: * s -> string to scan ! 22: * prm -> pointer to use to return token ! 23: * return: ! 24: * s -> pointer to next character ! 25: * NULL at end ! 26: */ ! 27: char * ! 28: getprm(s, prm) ! 29: register char *s, *prm; ! 30: { ! 31: register char *c; ! 32: char rightq; /* the right quote character */ ! 33: ! 34: /* skip white space */ ! 35: while (charType(*s) == WHITE) ! 36: s++; ! 37: ! 38: *prm = '\0'; ! 39: if (*s == '\0') ! 40: return(NULL); ! 41: ! 42: if (charType(*s) == DELIMIT) { ! 43: *prm++ = *s++; ! 44: *prm = '\0'; ! 45: return(s); ! 46: } ! 47: ! 48: /* look for quoted argument */ ! 49: if (charType(*s) == QUOTE) { ! 50: /* setup the right quote character */ ! 51: if (*s == LQUOTE) ! 52: rightq = RQUOTE; ! 53: else ! 54: rightq = *s; ! 55: ! 56: c = bal(s, rightq); ! 57: (void) strcpy(prm, s, c-s+1); ! 58: prm[c-s+1] = '\0'; ! 59: if ( *(s=c) == rightq) /* if end of string don't increment */ ! 60: s++; ! 61: return(s); ! 62: } ! 63: ! 64: while (charType(*s) == OTHER) ! 65: *prm++ = *s++; ! 66: *prm = '\0'; ! 67: ! 68: return(s); ! 69: } ! 70: ! 71: /* ! 72: * split name into system and file part ! 73: * name -> string to scan ! 74: * sys -> return area for system name ! 75: * rest -> return area for remainder ! 76: * return: ! 77: * 0 -> no system prefix ! 78: * TRUE -> system prefix return in sys ! 79: */ ! 80: ! 81: split(name, sys, rest) ! 82: register char *name; ! 83: char *sys, *rest; ! 84: { ! 85: register char *c, *n; ! 86: ! 87: *sys = '\0'; ! 88: if (*name == LQUOTE) { ! 89: c = bal(name, RQUOTE); ! 90: name++; ! 91: (void) strncpy(rest, name, c-name); ! 92: rest[c-name] = '\0'; ! 93: return(0); ! 94: } ! 95: ! 96: for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */ ! 97: if ((c = strchr(n, '!')) == NULL) { ! 98: (void) strcpy(rest, n); ! 99: return(0); ! 100: } ! 101: ! 102: /* ignore escaped '!' */ ! 103: if ((c != n) && (*(c-1) == '\\')) { ! 104: *(c-1) = '\0'; ! 105: (void) strcpy(rest, n); ! 106: (void) strcat(rest, c); ! 107: return(0); ! 108: } ! 109: ! 110: *c = '\0'; ! 111: if (EQUALS(n, Myname)) /* initial system is Myname */ ! 112: continue; ! 113: ! 114: (void) strcpy(sys, n); ! 115: (void) strcpy(rest, ++c); ! 116: return(TRUE); ! 117: } ! 118: /*NOTREACHED*/ ! 119: } ! 120: ! 121: ! 122: /* ! 123: * bal - get balanced quoted string ! 124: * ! 125: * s - input string ! 126: * r - right quote ! 127: * Note: *s is the left quote ! 128: * return: ! 129: * pointer to the end of the quoted string ! 130: * Note: ! 131: * If the string is not balanced, it returns a pointer to the ! 132: * end of the string. ! 133: */ ! 134: ! 135: char * ! 136: bal(s, r) ! 137: register char *s; ! 138: char r; ! 139: { ! 140: short count = 1; ! 141: char l; /* left quote character */ ! 142: ! 143: for (l = *s++; *s; s++) { ! 144: if (*s == r) { ! 145: if (--count == 0) ! 146: break; /* this is the balanced end */ ! 147: } ! 148: else if (*s == l) ! 149: count++; ! 150: } ! 151: return(s); ! 152: } ! 153: ! 154: ! 155: /* ! 156: * charType - classify type of character , white space, delimiter, other ! 157: * ! 158: * s - character ! 159: * return: ! 160: * WHITE - whitespace ! 161: * DELIMIT - delimiter ! 162: * QUOTE - some type of quote "'(` ! 163: * OTHER - other ! 164: */ ! 165: ! 166: charType(s) ! 167: char s; ! 168: { ! 169: switch(s) { ! 170: case '>': ! 171: case '<': ! 172: case '|': ! 173: case ';': ! 174: case '&': ! 175: case '^': ! 176: case '\\': ! 177: return(DELIMIT); ! 178: ! 179: case ' ': ! 180: case '\t': ! 181: case '\n': ! 182: return(WHITE); ! 183: ! 184: case '\0': ! 185: return(ZERO); ! 186: ! 187: ! 188: case '"': ! 189: case '\'': ! 190: case '`': ! 191: case LQUOTE: ! 192: return(QUOTE); ! 193: ! 194: default: ! 195: return(OTHER); ! 196: } ! 197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.