ref: 8c6c2b7216b6039188e76d26f9a62c4cb8ee4fca
dir: /sys/src/libc/port/quote.c/
#include <u.h> #include <libc.h> int (*doquote)(int); extern int _needsquotes(char*, int*); extern int _runeneedsquotes(Rune*, int*); char* unquotestrdup(char *s) { char *t, *ret; int quoting; ret = s = strdup(s); /* return unquoted copy */ if(ret == nil) return ret; quoting = 0; t = s; /* s is output string, t is input string */ while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){ if(*t != '\''){ *s++ = *t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t++; *s++ = *t++; } if(t != s) memmove(s, t, strlen(t)+1); return ret; } Rune* unquoterunestrdup(Rune *s) { Rune *t, *ret; int quoting; ret = s = runestrdup(s); /* return unquoted copy */ if(ret == nil) return ret; quoting = 0; t = s; /* s is output string, t is input string */ while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){ if(*t != '\''){ *s++ = *t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t++; *s++ = *t++; } if(t != s) memmove(s, t, (runestrlen(t)+1)*sizeof(Rune)); return ret; } char* quotestrdup(char *s) { char *t, *u, *ret; int quotelen; Rune r; if(_needsquotes(s, "elen) == 0) return strdup(s); ret = malloc(quotelen+1); if(ret == nil) return nil; u = ret; *u++ = '\''; for(t=s; *t; t++){ r = *t; if(r == L'\'') *u++ = r; /* double the quote */ *u++ = r; } *u++ = '\''; *u = '\0'; return ret; } Rune* quoterunestrdup(Rune *s) { Rune *t, *u, *ret; int quotelen; Rune r; if(_runeneedsquotes(s, "elen) == 0) return runestrdup(s); ret = malloc((quotelen+1)*sizeof(Rune)); if(ret == nil) return nil; u = ret; *u++ = '\''; for(t=s; *t; t++){ r = *t; if(r == L'\'') *u++ = r; /* double the quote */ *u++ = r; } *u++ = '\''; *u = '\0'; return ret; }