|
|
1.1 ! root 1: extern char *__modemcap; ! 2: ! 3: char *mgetstr (id, area) ! 4: register char *id; ! 5: register char **area; ! 6: { ! 7: register char *cp = __modemcap; ! 8: register char *str = *area; /* start of current string */ ! 9: ! 10: if (__modemcap == (char *) 0) /* has mgetent() been called? ... */ ! 11: return ((char *) 0); /* ... no, can't find string */ ! 12: ! 13: while (*cp != ':' && *cp != 0) /* find first entry in cap */ ! 14: cp++; ! 15: ! 16: if (*cp == 0) /* empty entry??? */ ! 17: return ((char *) 0); /* ... yes, bad modemcap entry */ ! 18: else ! 19: cp++; /* point to first character in next */ ! 20: ! 21: while (*cp != 0) { /* until entry found or end of entry */ ! 22: if (cp[0] == id[0] && cp[1] == id[1]) { /* found entry!!! */ ! 23: if (cp[2] != '=') /* is it a string value??? */ ! 24: return ((char *) 0); /* no, something else */ ! 25: else ! 26: break; /* yes, entry was found */ ! 27: } ! 28: else { /* not entry, skip this entire entry */ ! 29: while (*cp != ':' && *cp != 0) ! 30: cp++; /* search for end of current entry */ ! 31: ! 32: if (*cp != 0) ! 33: cp++; /* skip terminating character */ ! 34: } ! 35: } ! 36: if (*cp == 0) /* end of modem cap entry */ ! 37: return ((char *) 0); ! 38: ! 39: cp += 3; /* point to actual string */ ! 40: while (*cp != ':' && *cp != 0) { /* for every character in string ... */ ! 41: if (*cp == '\\') { /* translate escaped character */ ! 42: cp++; ! 43: switch (*cp) { ! 44: case 'n': /* newline */ ! 45: **area = '\n'; ! 46: (*area)++; ! 47: cp++; ! 48: break; ! 49: case 'r': /* carriage return */ ! 50: **area = '\r'; ! 51: (*area)++; ! 52: cp++; ! 53: break; ! 54: case 'b': /* backspace */ ! 55: **area = '\b'; ! 56: (*area)++; ! 57: cp++; ! 58: break; ! 59: case 'f': /* form feed */ ! 60: **area = '\f'; ! 61: (*area)++; ! 62: cp++; ! 63: break; ! 64: case 't': /* tab */ ! 65: **area = '\t'; ! 66: (*area)++; ! 67: cp++; ! 68: break; ! 69: case 'E': /* Escape character */ ! 70: **area = 033; ! 71: (*area)++; ! 72: cp++; ! 73: break; ! 74: case '0': ! 75: case '1': ! 76: case '2': ! 77: case '3': ! 78: case '4': ! 79: case '5': ! 80: case '6': ! 81: case '7': ! 82: **area = ((cp[0] - '0') << 6) + ! 83: ((cp[1] - '0') << 3) + ! 84: (cp[2] - '0'); ! 85: (*area)++; ! 86: cp += 3; ! 87: break; ! 88: default: ! 89: **area = *cp++; ! 90: (*area)++; ! 91: break; ! 92: } ! 93: } ! 94: else if (*cp == '^') { /* some control character */ ! 95: cp++; ! 96: if (*cp >= '@' && *cp <= '_') { ! 97: **area = *cp - '@'; ! 98: (*area)++; ! 99: } ! 100: cp++; ! 101: } ! 102: else { /* some normal character */ ! 103: **area = *cp++; /* put character in area */ ! 104: (*area)++; ! 105: } ! 106: } ! 107: *((*area)++) = 0; /* null terminate area and string */ ! 108: return (str); /* return pointer to start of string */ ! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.