comparison libcommon/gsm7_encode.c @ 20:90e7020df08a

GSM7 string parsers accept new bypass-encoding escapes
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Feb 2021 03:44:59 +0000
parents b8d27c72747a
children
comparison
equal deleted inserted replaced
19:72a24b8538eb 20:90e7020df08a
27 fprintf(stderr, 27 fprintf(stderr,
28 "error: dangling backslash escape\n"); 28 "error: dangling backslash escape\n");
29 return(-1); 29 return(-1);
30 } 30 }
31 c = *cp++; 31 c = *cp++;
32 if (c >= '0' && c <= '7' && isxdigit(*cp)) {
33 c = ((c - '0') << 4) | decode_hex_digit(*cp++);
34 goto bypass_encoding;
35 }
32 switch (c) { 36 switch (c) {
33 case 'n': 37 case 'n':
34 c = '\n'; 38 c = '\n';
35 break; 39 goto bypass_encoding;
36 case 'r': 40 case 'r':
37 c = '\r'; 41 c = '\r';
38 break; 42 goto bypass_encoding;
43 case 'e':
44 c = 0x1B;
45 goto bypass_encoding;
39 case '"': 46 case '"':
40 case '\\': 47 case '\\':
41 break; 48 break;
42 default: 49 default:
43 fprintf(stderr, 50 fprintf(stderr,
49 if (c == 0xFF) { 56 if (c == 0xFF) {
50 fprintf(stderr, 57 fprintf(stderr,
51 "error: character in alpha tag string cannot be encoded in GSM7\n"); 58 "error: character in alpha tag string cannot be encoded in GSM7\n");
52 return(-1); 59 return(-1);
53 } 60 }
61 bypass_encoding:
54 if (c & 0x80) 62 if (c & 0x80)
55 nadd = 2; 63 nadd = 2;
56 else 64 else
57 nadd = 1; 65 nadd = 1;
58 if (acclen + nadd > maxlen) { 66 if (acclen + nadd > maxlen) {