File: escape.c

package info (click to toggle)
vtprint 2.0.2-11
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 356 kB
  • ctags: 110
  • sloc: ansic: 659; sed: 487; makefile: 201; sh: 96
file content (138 lines) | stat: -rw-r--r-- 5,840 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**************************************************************************
 **************************************************************************
 **                                                                      **
 ** escape.c        Routine for performing escape code string expansion. **
 ** ========                                                             **
 **                                                                      **
 ** Purpose:        Expand strings with C style escapes in them.         **
 **                                                                      **
 ** Author:         Garrett D'Amore <garrett@sciences.sdsu.edu>          **
 **                                                                      **
 ** Copyright:      1994, Garrett E. D'Amore                             **
 **                                                                      **
 ** NO WARRANTY:    This program is provided entirely without warranty.  **
 **                 The user assumes full responsibility for the use of  **
 **                 this program, and agrees to indemnify the author and **
 **                 the copyright holder from any damage or loss that    **
 **                 may result from the use of or inability to use this  **
 **                 program.  In simple language: YOU USE THIS PROGRAM   **
 **                 AT YOUR OWN RISK!                                    **
 **                                                                      **
 ** Warning:        None.                                                **
 **                                                                      **
 ** Restrictions:   None.                                                **
 **                                                                      **
 ** Algorithm:      None.                                                **
 **                                                                      **
 ** References:     Kernighan & Ritchie, "The C Programming Language"    **
 **                                                                      **
 ** File formats:   None.                                                **
 **                                                                      **
 ** Rev. History:   June 4, 1994    Garrett D'Amore                      **
 **                 -- Initial coding.                                   **
 **                                                                      **
 ** Notes:          None.                                                **
 **                                                                      **
 **************************************************************************
 **************************************************************************/

/* >>>>>>>>>> Headers <<<<<<<<<< */

#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>

#include "escape.h"

/* >>>>>>>>>> Functions <<<<<<<<<< */

/***************************************
 *
 *  escape          Convert a C style format string to actual value.
 *
 *  Purpose         Provides a mechanism for expanding C-style escape
 *                  codes in a string.
 *
 *  Parameters      source:     String to expand.
 *
 *  Returns         pointer to converted string on success,
 *                  NULL on (parse) error.
 *
 */

char *escape (char *source)
{
    char    *dest;
    char    *probe;
    long    l;

    if (!source) return NULL;
    dest = source;

    for (probe = source; *probe; probe++)
    {
        /* skip bare double quotes, used as delimiters */
        if (*probe == '\"') continue;

        if (*probe != '\\') 
        {
            *dest = *probe;
            dest++;
            continue;
        }

        probe++;    /* assume we are escaped now! */
        switch (*probe)
        {
            case 'a'    : { *dest = '\x07'; dest++; break; }
            case 'b'    : { *dest = '\x08'; dest++; break; }
            case 'f'    : { *dest = '\x0C'; dest++; break; }
            case 'n'    : { *dest = '\x0A'; dest++; break; }
            case 'r'    : { *dest = '\x0D'; dest++; break; }
            case 't'    : { *dest = '\x09'; dest++; break; }
            case 'v'    : { *dest = '\x0B'; dest++; break; }
            case '\\'   : 
            case '\''   : 
            case '\"'   : 
            case '\?'   : { *dest = *probe; dest++; break; }
            case '0'    : {
                            l = strtol (probe, &probe, 8);
                            *dest = (char) l;
                            dest++;
                            probe--;
                            break;
                          }
            case '1'    :
            case '2'    :
            case '3'    :
            case '4'    :
            case '5'    :
            case '6'    :
            case '7'    :
            case '8'    :
            case '9'    : {
                            l = strtol (probe, &probe, 10);
                            *dest = (char) l;
                            dest++;
                            probe--;
                            break;
                          }
            case 'X'    :
            case 'x'    : {
                            /* check for valid character */
                            if ((!isdigit(probe[1])) && 
                                ((toupper (probe[1]) > 'F') ||
                                (toupper (probe [1]) < 'A')))
                            return NULL;
                            l = strtol (probe, &probe, 16);
                            *dest = (char) l;
                            dest++;
                            probe--;
                            break;
                          }
            default     : return NULL;
        }
    }
    *dest = '\0';
    return (source);
}