|
|
1.1 root 1: /* str2sel.c - string to selector */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/compat/RCS/str2sel.c,v 7.0 89/11/23 21:23:37 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/compat/RCS/str2sel.c,v 7.0 89/11/23 21:23:37 mrose Rel $
9: *
10: *
11: * $Log: str2sel.c,v $
12: * Revision 7.0 89/11/23 21:23:37 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include <ctype.h>
31: #include <stdio.h>
32: #include "general.h"
33: #include "manifest.h"
34: #include "tailor.h"
35:
36:
37: #define QUOTE '\\'
38:
39: /* STR2SEL */
40:
41: int str2sel (s, quoted, sel, n)
42: char *s,
43: *sel;
44: int quoted,
45: n;
46: {
47: int i,
48: r;
49: register char *cp;
50:
51: if (*s == NULL)
52: return 0;
53:
54: if (quoted <= 0) {
55: for (cp = s; *cp; cp++)
56: if (!isxdigit (*cp))
57: break;
58:
59: if (*cp == NULL && (i = (cp - s)) >= 2 && (i & 0x01) == 0) {
60: if (i > (r = n * 2))
61: i = r;
62: i = implode ((u_char *) sel, s, i);
63: if ((r = (n - i)) > 0)
64: bzero (sel + i, r);
65: return i;
66: }
67: if (*s == '#') { /* gosip style, network byte-order */
68: i = atoi (s + 1);
69: sel[0] = (i >> 8) & 0xff;
70: sel[1] = i & 0xff;
71:
72: return 2;
73: }
74:
75: DLOG (compat_log, LLOG_EXCEPTIONS, ("invalid selector \"%s\"", s));
76: }
77:
78: for (cp = sel; *s && n > 0; cp++, s++, n--)
79: if (*s != QUOTE)
80: *cp = *s;
81: else
82: switch (*++s) {
83: case 'b':
84: *cp = '\b';
85: break;
86: case 'f':
87: *cp = '\f';
88: break;
89: case 'n':
90: *cp = '\n';
91: break;
92: case 'r':
93: *cp = '\r';
94: break;
95: case 't':
96: *cp = '\t';
97: break;
98:
99: case NULL:
100: s--;
101: case QUOTE:
102: *cp = QUOTE;
103: break;
104:
105: default:
106: if (!isdigit (*s)) {
107: *cp++ = QUOTE;
108: *cp = *s;
109: break;
110: }
111: r = *s != '0' ? 10 : 8;
112: for (i = 0; isdigit (*s); s++)
113: i = i * r + *s - '0';
114: s--;
115: *cp = toascii (i);
116: break;
117: }
118: if (n > 0)
119: *cp = NULL;
120:
121: return (cp - sel);
122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.