1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
5*4887Schin *                      and is licensed under the                       *
6*4887Schin *                  Common Public License, Version 1.0                  *
7*4887Schin *                      by AT&T Knowledge Ventures                      *
8*4887Schin *                                                                      *
9*4887Schin *                A copy of the License is available at                 *
10*4887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*4887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*4887Schin *                                                                      *
13*4887Schin *              Information and Software Systems Research               *
14*4887Schin *                            AT&T Research                             *
15*4887Schin *                           Florham Park NJ                            *
16*4887Schin *                                                                      *
17*4887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
18*4887Schin *                  David Korn <dgk@research.att.com>                   *
19*4887Schin *                   Phong Vo <kpv@research.att.com>                    *
20*4887Schin *                                                                      *
21*4887Schin ***********************************************************************/
22*4887Schin #pragma prototyped
23*4887Schin /*
24*4887Schin  * Glenn Fowler
25*4887Schin  * AT&T Research
26*4887Schin  *
27*4887Schin  * escape optget() special chars in s and write to sp
28*4887Schin  * esc == '?' or ':' also escaped
29*4887Schin  */
30*4887Schin 
31*4887Schin #include <optlib.h>
32*4887Schin #include <ctype.h>
33*4887Schin 
34*4887Schin int
35*4887Schin optesc(Sfio_t* sp, register const char* s, int esc)
36*4887Schin {
37*4887Schin 	register const char*	m;
38*4887Schin 	register int		c;
39*4887Schin 
40*4887Schin 	if (*s == '[' && *(s + 1) == '+' && *(s + 2) == '?')
41*4887Schin 	{
42*4887Schin 		c = strlen(s);
43*4887Schin 		if (s[c - 1] == ']')
44*4887Schin 		{
45*4887Schin 			sfprintf(sp, "%-.*s", c - 4, s + 3);
46*4887Schin 			return 0;
47*4887Schin 		}
48*4887Schin 	}
49*4887Schin 	if (esc != '?' && esc != ':')
50*4887Schin 		esc = 0;
51*4887Schin 	while (c = *s++)
52*4887Schin 	{
53*4887Schin 		if (isalnum(c))
54*4887Schin 		{
55*4887Schin 			for (m = s - 1; isalnum(*s); s++);
56*4887Schin 			if (isalpha(c) && *s == '(' && isdigit(*(s + 1)) && *(s + 2) == ')')
57*4887Schin 			{
58*4887Schin 				sfputc(sp, '\b');
59*4887Schin 				sfwrite(sp, m, s - m);
60*4887Schin 				sfputc(sp, '\b');
61*4887Schin 				sfwrite(sp, s, 3);
62*4887Schin 				s += 3;
63*4887Schin 			}
64*4887Schin 			else
65*4887Schin 				sfwrite(sp, m, s - m);
66*4887Schin 		}
67*4887Schin 		else if (c == '-' && *s == '-' || c == '<')
68*4887Schin 		{
69*4887Schin 			m = s - 1;
70*4887Schin 			if (c == '-')
71*4887Schin 				s++;
72*4887Schin 			else if (*s == '/')
73*4887Schin 				s++;
74*4887Schin 			while (isalnum(*s))
75*4887Schin 				s++;
76*4887Schin 			if (c == '<' && *s == '>' || isspace(*s) || *s == 0 || *s == '=' || *s == ':' || *s == ';' || *s == '.' || *s == ',')
77*4887Schin 			{
78*4887Schin 				sfputc(sp, '\b');
79*4887Schin 				sfwrite(sp, m, s - m);
80*4887Schin 				sfputc(sp, '\b');
81*4887Schin 			}
82*4887Schin 			else
83*4887Schin 				sfwrite(sp, m, s - m);
84*4887Schin 		}
85*4887Schin 		else
86*4887Schin 		{
87*4887Schin 			if (c == ']' || c == esc)
88*4887Schin 				sfputc(sp, c);
89*4887Schin 			sfputc(sp, c);
90*4887Schin 		}
91*4887Schin 	}
92*4887Schin 	return 0;
93*4887Schin }
94