/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2007 AT&T Knowledge Ventures * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Knowledge Ventures * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * Glenn Fowler * AT&T Research * * escape optget() special chars in s and write to sp * esc == '?' or ':' also escaped */ #include #include int optesc(Sfio_t* sp, register const char* s, int esc) { register const char* m; register int c; if (*s == '[' && *(s + 1) == '+' && *(s + 2) == '?') { c = strlen(s); if (s[c - 1] == ']') { sfprintf(sp, "%-.*s", c - 4, s + 3); return 0; } } if (esc != '?' && esc != ':') esc = 0; while (c = *s++) { if (isalnum(c)) { for (m = s - 1; isalnum(*s); s++); if (isalpha(c) && *s == '(' && isdigit(*(s + 1)) && *(s + 2) == ')') { sfputc(sp, '\b'); sfwrite(sp, m, s - m); sfputc(sp, '\b'); sfwrite(sp, s, 3); s += 3; } else sfwrite(sp, m, s - m); } else if (c == '-' && *s == '-' || c == '<') { m = s - 1; if (c == '-') s++; else if (*s == '/') s++; while (isalnum(*s)) s++; if (c == '<' && *s == '>' || isspace(*s) || *s == 0 || *s == '=' || *s == ':' || *s == ';' || *s == '.' || *s == ',') { sfputc(sp, '\b'); sfwrite(sp, m, s - m); sfputc(sp, '\b'); } else sfwrite(sp, m, s - m); } else { if (c == ']' || c == esc) sfputc(sp, c); sfputc(sp, c); } } return 0; }