plan9port

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

sdbr_escape.c (642B)


      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' || ISWHITE(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 '\t': c = 't'; break;
     25 		case '\n': c = 'n'; break;
     26 		case '\r': c = 'r'; break;
     27 		case '"':
     28 		case '\\':
     29 			if (e)
     30 				break;
     31 		default:
     32 			Straddc(s, c);
     33 			continue;
     34 		}
     35 		Straddc(s, '\\');
     36 		Straddc(s, c);
     37 	}
     38 	if (e) {
     39 		Strinsert(s, Strn("\"", 1), 0);
     40 		Straddc(s, '"');
     41 	}
     42 	return s->s;
     43 }
     44