tquote.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tquote.c (2269B)
       ---
            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 }