14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*8462SApril.Chin@Sun.COM * Copyright (c) 1985-2008 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 7*8462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #pragma prototyped 234887Schin /* 244887Schin * Glenn Fowler 254887Schin * AT&T Research 264887Schin * 274887Schin * escape optget() special chars in s and write to sp 284887Schin * esc == '?' or ':' also escaped 294887Schin */ 304887Schin 314887Schin #include <optlib.h> 324887Schin #include <ctype.h> 334887Schin 344887Schin int 354887Schin optesc(Sfio_t* sp, register const char* s, int esc) 364887Schin { 374887Schin register const char* m; 384887Schin register int c; 394887Schin 404887Schin if (*s == '[' && *(s + 1) == '+' && *(s + 2) == '?') 414887Schin { 424887Schin c = strlen(s); 434887Schin if (s[c - 1] == ']') 444887Schin { 454887Schin sfprintf(sp, "%-.*s", c - 4, s + 3); 464887Schin return 0; 474887Schin } 484887Schin } 494887Schin if (esc != '?' && esc != ':') 504887Schin esc = 0; 514887Schin while (c = *s++) 524887Schin { 534887Schin if (isalnum(c)) 544887Schin { 554887Schin for (m = s - 1; isalnum(*s); s++); 564887Schin if (isalpha(c) && *s == '(' && isdigit(*(s + 1)) && *(s + 2) == ')') 574887Schin { 584887Schin sfputc(sp, '\b'); 594887Schin sfwrite(sp, m, s - m); 604887Schin sfputc(sp, '\b'); 614887Schin sfwrite(sp, s, 3); 624887Schin s += 3; 634887Schin } 644887Schin else 654887Schin sfwrite(sp, m, s - m); 664887Schin } 674887Schin else if (c == '-' && *s == '-' || c == '<') 684887Schin { 694887Schin m = s - 1; 704887Schin if (c == '-') 714887Schin s++; 724887Schin else if (*s == '/') 734887Schin s++; 744887Schin while (isalnum(*s)) 754887Schin s++; 764887Schin if (c == '<' && *s == '>' || isspace(*s) || *s == 0 || *s == '=' || *s == ':' || *s == ';' || *s == '.' || *s == ',') 774887Schin { 784887Schin sfputc(sp, '\b'); 794887Schin sfwrite(sp, m, s - m); 804887Schin sfputc(sp, '\b'); 814887Schin } 824887Schin else 834887Schin sfwrite(sp, m, s - m); 844887Schin } 854887Schin else 864887Schin { 874887Schin if (c == ']' || c == esc) 884887Schin sfputc(sp, c); 894887Schin sfputc(sp, c); 904887Schin } 914887Schin } 924887Schin return 0; 934887Schin } 94