/home/andy/git/oilshell/oil/cpp/qsn.h
Line | Count | Source (jump to first uncovered line) |
1 | | // cpp/qsn.h |
2 | | |
3 | | #ifndef QSN_H |
4 | | #define QSN_H |
5 | | |
6 | | #ifdef LEAKY_BINDINGS |
7 | | #include "mycpp/mylib_old.h" |
8 | | using gc_heap::StackRoots; // no-op |
9 | | using mylib::AllocStr; |
10 | | using mylib::OverAllocatedStr; |
11 | | using mylib::StrFromC; |
12 | | #else |
13 | | #include "mycpp/gc_types.h" |
14 | | using gc_heap::AllocStr; |
15 | | using gc_heap::OverAllocatedStr; |
16 | | using gc_heap::StackRoots; |
17 | | using gc_heap::Str; |
18 | | using gc_heap::StrFromC; |
19 | | #endif |
20 | | |
21 | | namespace qsn { |
22 | | |
23 | 33 | inline bool IsUnprintableLow(Str* ch) { |
24 | 33 | assert(len(ch) == 1); |
25 | 0 | return ch->data_[0] < ' '; |
26 | 33 | } |
27 | | |
28 | 0 | inline bool IsUnprintableHigh(Str* ch) { |
29 | 0 | assert(len(ch) == 1); |
30 | 0 | return ch->data_[0] >= 0x7f; |
31 | 0 | } |
32 | | |
33 | 79 | inline bool IsPlainChar(Str* ch) { |
34 | 79 | assert(len(ch) == 1); |
35 | 0 | uint8_t c = ch->data_[0]; |
36 | 79 | switch (c) { |
37 | 0 | case '.': |
38 | 0 | case '-': |
39 | 0 | case '_': |
40 | 0 | return true; |
41 | 79 | } |
42 | 79 | return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || |
43 | 79 | ('0' <= c && c <= '9'); |
44 | 79 | } |
45 | | |
46 | 10 | inline Str* XEscape(Str* ch) { |
47 | 10 | assert(len(ch) == 1); |
48 | 0 | StackRoots _roots({&ch}); |
49 | 10 | Str* result = AllocStr(4); |
50 | 10 | sprintf(result->data(), "\\x%02x", ch->data_[0] & 0xff); |
51 | 10 | return result; |
52 | 10 | } |
53 | | |
54 | 10 | inline Str* UEscape(int codepoint) { |
55 | | // maximum length: |
56 | | // 3 for \u{ |
57 | | // 6 for codepoint |
58 | | // 1 for } |
59 | 10 | Str* result = OverAllocatedStr(10); |
60 | 10 | int n = sprintf(result->data(), "\\u{%x}", codepoint); |
61 | 10 | result->SetObjLenFromStrLen(n); // truncate to what we wrote |
62 | 10 | return result; |
63 | 10 | } |
64 | | |
65 | | } // namespace qsn |
66 | | |
67 | | #endif // QSN_H |