look up a string entry; update `*outptr' */
| 239 | |
| 240 | /* look up a string entry; update `*outptr' */ |
| 241 | char * |
| 242 | tgetstr(const char *which, char **outptr) |
| 243 | { |
| 244 | int n; |
| 245 | char c, *r, *result; |
| 246 | const char *q, *p = tc_field(which, &q); |
| 247 | |
| 248 | if (!p || p[2] != '=') |
| 249 | return (char *) 0; |
| 250 | p += 3; |
| 251 | if ((q = strchr(p, ':')) == 0) |
| 252 | q = p + strlen(p); |
| 253 | r = result = *outptr; |
| 254 | while (p < q) { |
| 255 | switch ((*r = *p++)) { |
| 256 | case '\\': |
| 257 | switch ((c = *p++)) { |
| 258 | case 'E': |
| 259 | *r = ESC; |
| 260 | break; |
| 261 | case 'a': |
| 262 | *r = BEL; |
| 263 | break; |
| 264 | case 'b': |
| 265 | *r = '\b'; |
| 266 | break; |
| 267 | case 'f': |
| 268 | *r = '\f'; |
| 269 | break; |
| 270 | case 'n': |
| 271 | *r = '\n'; |
| 272 | break; |
| 273 | case 'r': |
| 274 | *r = '\r'; |
| 275 | break; |
| 276 | case 't': |
| 277 | *r = '\t'; |
| 278 | break; |
| 279 | case '0': |
| 280 | case '1': |
| 281 | case '2': |
| 282 | case '3': |
| 283 | case '4': |
| 284 | case '5': |
| 285 | case '6': |
| 286 | case '7': |
| 287 | n = c - '0'; |
| 288 | if (*p >= '0' && *p <= '7') |
| 289 | n = 8 * n + (*p++ - '0'); |
| 290 | if (*p >= '0' && *p <= '7') |
| 291 | n = 8 * n + (*p++ - '0'); |
| 292 | *r = (char) n; |
| 293 | break; |
| 294 | /* case '^': case '\\': */ |
| 295 | default: |
| 296 | *r = c; |
| 297 | break; |
| 298 | } |
no test coverage detected