Introduction
Introduction Statistics Contact Development Disclaimer Help
quote.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
quote.c (2271B)
---
1 #include <u.h>
2 #include <libc.h>
3
4
5 /* in libfmt */
6 extern int (*doquote)(int);
7 extern int __needsquotes(char*, int*);
8 extern int __runeneedsquotes(Rune*, int*);
9
10 char*
11 unquotestrdup(char *s)
12 {
13 char *t, *ret;
14 int quoting;
15
16 ret = s = strdup(s); /* return unquoted copy */
17 if(ret == nil)
18 return ret;
19 quoting = 0;
20 t = s; /* s is output string, t is input string */
21 while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
22 if(*t != '\''){
23 *s++ = *t++;
24 continue;
25 }
26 /* *t is a quote */
27 if(!quoting){
28 quoting = 1;
29 t++;
30 continue;
31 }
32 /* quoting and we're on a quote */
33 if(t[1] != '\''){
34 /* end of quoted section; absorb closing quote */
35 t++;
36 quoting = 0;
37 continue;
38 }
39 /* doubled quote; fold one quote into two */
40 t++;
41 *s++ = *t++;
42 }
43 if(t != s)
44 memmove(s, t, strlen(t)+1);
45 return ret;
46 }
47
48 Rune*
49 unquoterunestrdup(Rune *s)
50 {
51 Rune *t, *ret;
52 int quoting;
53
54 ret = s = runestrdup(s); /* return unquoted copy */
55 if(ret == nil)
56 return ret;
57 quoting = 0;
58 t = s; /* s is output string, t is input string */
59 while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
60 if(*t != '\''){
61 *s++ = *t++;
62 continue;
63 }
64 /* *t is a quote */
65 if(!quoting){
66 quoting = 1;
67 t++;
68 continue;
69 }
70 /* quoting and we're on a quote */
71 if(t[1] != '\''){
72 /* end of quoted section; absorb closing quote */
73 t++;
74 quoting = 0;
75 continue;
76 }
77 /* doubled quote; fold one quote into two */
78 t++;
79 *s++ = *t++;
80 }
81 if(t != s)
82 memmove(s, t, (runestrlen(t)+1)*sizeof(Rune));
83 return ret;
84 }
85
86 char*
87 quotestrdup(char *s)
88 {
89 char *t, *u, *ret;
90 int quotelen;
91 Rune r;
92
93 if(__needsquotes(s, &quotelen) == 0)
94 return strdup(s);
95
96 ret = malloc(quotelen+1);
97 if(ret == nil)
98 return nil;
99 u = ret;
100 *u++ = '\'';
101 for(t=s; *t; t++){
102 r = *t;
103 if(r == '\'')
104 *u++ = r; /* double the quote */
105 *u++ = r;
106 }
107 *u++ = '\'';
108 *u = '\0';
109 return ret;
110 }
111
112 Rune*
113 quoterunestrdup(Rune *s)
114 {
115 Rune *t, *u, *ret;
116 int quotelen;
117 Rune r;
118
119 if(__runeneedsquotes(s, &quotelen) == 0)
120 return runestrdup(s);
121
122 ret = malloc((quotelen+1)*sizeof(Rune));
123 if(ret == nil)
124 return nil;
125 u = ret;
126 *u++ = '\'';
127 for(t=s; *t; t++){
128 r = *t;
129 if(r == '\'')
130 *u++ = r; /* double the quote */
131 *u++ = r;
132 }
133 *u++ = '\'';
134 *u = '\0';
135 return ret;
136 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.