1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/ncgen3/escapes.c,v 1.2 1997/03/19 23:15:09 davis Exp $
5 *********************************************************************/
6
7#include <stdlib.h>
8#include <netcdf.h>
9#include "generic.h"
10#include "ncgen.h"
11#include "genlib.h"
12
13/*
14 * "Expands" valid escape sequences in yystring (read by lex) into the
15 * appropriate characters in termstring.  For example, the two character
16 * sequence "\t" in yystring would be converted into a single tab character
17 * in termstring.  On return, termstring is properly terminated.
18 */
19
20void
21expand_escapes(
22     char *termstring, /* returned, with escapes expanded */
23     char *yytext,
24     int yyleng)
25{
26    char *s, *t, *endp;
27
28    yytext[yyleng-1]='\0'; /* don't copy quotes */
29    /* expand "\" escapes, e.g. "\t" to tab character  */
30    s = termstring;
31    t = yytext+1;
32    while(*t) {
33 if (*t == '\\') {
34     t++;
35     switch (*t) {
36       case 'a':
37 *s++ = '\007'; t++; /* will use '\a' when STDC */
38 break;
39       case 'b':
40 *s++ = '\b'; t++;
41 break;
42       case 'f':
43 *s++ = '\f'; t++;
44 break;
45       case 'n':
46 *s++ = '\n'; t++;
47 break;
48       case 'r':
49 *s++ = '\r'; t++;
50 break;
51       case 't':
52 *s++ = '\t'; t++;
53 break;
54       case 'v':
55 *s++ = '\v'; t++;
56 break;
57       case '\\':
58 *s++ = '\\'; t++;
59 break;
60       case '?':
61 *s++ = '\177'; t++;
62 break;
63       case '\'':
64 *s++ = '\''; t++;
65 break;
66       case '\"':
67 *s++ = '\"'; t++;
68 break;
69       case 'x':
70 t++; /* now t points to one or more hex digits */
71 *s++ = (char) strtol(t, &endp, 16);
72 t = endp;
73 break;
74       case '0':
75       case '1':
76       case '2':
77       case '3':
78       case '4':
79       case '5':
80       case '6':
81       case '7':
82 /* t now points to octal digits */
83 *s++ = (char) strtol(t, &endp, 8);
84 t = endp;
85 break;
86       default:
87 *s++ = *t++;
88 break;
89     }
90 } else {
91     *s++ = *t++;
92 }
93    }
94    *s = '\0';
95    return;
96}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed