plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

sdbr_escape.c (700B)


      1 #include "std.h"
      2 
      3 char*
      4 sdbr_escape(String *s, String val)
      5 {
      6 	ulong i;
      7 	uchar c, e;
      8 
      9 	Strzero(s);
     10 	e = 0;
     11 	if (val.s[0] == '"')
     12 		e = 1;
     13 	else for (i = 0; i < val.n; ++i) {
     14 		c = val.s[i];
     15 		if (c == '\0' || isspace(c)) {
     16 			e = 1;
     17 			break;
     18 		}
     19 	}
     20 	for (i = 0; i < val.n; ++i) {
     21 		c = val.s[i];
     22 		switch (c) {
     23 		case '\0': c = '0'; break;
     24 		case '\f': c = 'f'; break;
     25 		case '\n': c = 'n'; break;
     26 		case '\r': c = 'r'; break;
     27 		case '\t': c = 't'; break;
     28 		case '\v': c = 'v'; break;
     29 		case '"':
     30 		case '\\':
     31 			if (e)
     32 				break;
     33 		default:
     34 			Straddc(s, c);
     35 			continue;
     36 		}
     37 		Straddc(s, '\\');
     38 		Straddc(s, c);
     39 	}
     40 	if (e) {
     41 		Strinsert(s, Strn("\"", 1), 0);
     42 		Straddc(s, '"');
     43 	}
     44 	return s->s;
     45 }
     46