| 1 | #include <string> |
| 2 | #include <cstring> |
| 3 | |
| 4 | struct A { |
| 5 | char data[4]; |
| 6 | char overflow[4]; |
| 7 | }; |
| 8 | |
| 9 | #define MAKE_VARS3(c, v, s) \ |
| 10 | c v s char c##v##s##chararray[] = #c #v #s "char"; \ |
| 11 | c v s char *c##v##s##charstar = c##v##s##chararray |
| 12 | #define MAKE_VARS2(c, v) \ |
| 13 | MAKE_VARS3(c, v, ); \ |
| 14 | MAKE_VARS3(c, v, signed); \ |
| 15 | MAKE_VARS3(c, v, unsigned) |
| 16 | #define MAKE_VARS(c) \ |
| 17 | MAKE_VARS2(c, ); \ |
| 18 | MAKE_VARS2(c, volatile) |
| 19 | |
| 20 | MAKE_VARS(); |
| 21 | MAKE_VARS(const); |
| 22 | |
| 23 | template<typename T> |
| 24 | struct S { |
| 25 | int x = 0; |
| 26 | }; |
| 27 | S<char[5]> Schar5; |
| 28 | S<char *> Scharstar; |
| 29 | |
| 30 | int main (int argc, char const *argv[]) |
| 31 | { |
| 32 | const char manytrailingnuls[] = "F\0OO\0BA\0R\0\0\0\0" ; |
| 33 | A a, b, c; |
| 34 | // Deliberately write past the end of data to test that the formatter stops |
| 35 | // at the end of array. |
| 36 | memcpy(dest: a.data, src: "FOOBAR" , n: 7); |
| 37 | memcpy(dest: b.data, src: "FO\0BAR" , n: 7); |
| 38 | memcpy(dest: c.data, src: "F\0O\0AR" , n: 7); |
| 39 | std::string stdstring("Hello\t\tWorld\nI am here\t\tto say hello\n" ); //%self.addTearDownHook(lambda x: x.runCmd("setting set escape-non-printables true")) |
| 40 | const char *charwithtabs = stdstring.c_str(); |
| 41 | std::string longstring( |
| 42 | "I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" |
| 43 | " is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" |
| 44 | " a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." |
| 45 | " for science, or something" |
| 46 | "I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" |
| 47 | " is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" |
| 48 | " a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." |
| 49 | " for science, or something" |
| 50 | "I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" |
| 51 | " is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" |
| 52 | " a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." |
| 53 | " for science, or something" |
| 54 | ); |
| 55 | const char* longconstcharstar = longstring.c_str(); |
| 56 | return 0; //% if self.TraceOn(): self.runCmd('frame variable') |
| 57 | //% |
| 58 | //% self.expect_var_path('stdstring', summary='"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"') |
| 59 | //% self.expect_var_path('charwithtabs', summary='"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"') |
| 60 | //% self.expect_var_path("a.data", summary='"FOOB"') |
| 61 | //% self.expect_var_path("b.data", summary=r'"FO\0B"') |
| 62 | //% self.expect_var_path("c.data", summary=r'"F\0O"') |
| 63 | //% self.expect_var_path("manytrailingnuls", summary=r'"F\0OO\0BA\0R"') |
| 64 | //% |
| 65 | //% for c in ["", "const"]: |
| 66 | //% for v in ["", "volatile"]: |
| 67 | //% for s in ["", "unsigned"]: |
| 68 | //% summary = '"'+c+v+s+'char"' |
| 69 | //% self.expect_var_path(c+v+s+"chararray", summary=summary) |
| 70 | //% # These should be printed normally |
| 71 | //% self.expect_var_path(c+v+s+"charstar", summary=summary) |
| 72 | //% Schar5 = self.expect_var_path("Schar5", |
| 73 | //% children=[ValueCheck(name="x", value="0")]) |
| 74 | //% self.assertIsNone(Schar5.GetSummary()) |
| 75 | //% Scharstar = self.expect_var_path("Scharstar", |
| 76 | //% children=[ValueCheck(name="x", value="0")]) |
| 77 | //% self.assertIsNone(Scharstar.GetSummary()) |
| 78 | //% |
| 79 | //% self.runCmd("setting set escape-non-printables false") |
| 80 | //% self.expect_var_path('stdstring', summary='"Hello\t\tWorld\nI am here\t\tto say hello\n"') |
| 81 | //% self.expect_var_path('charwithtabs', summary='"Hello\t\tWorld\nI am here\t\tto say hello\n"') |
| 82 | //% self.assertTrue(self.frame().FindVariable('longstring').GetSummary().endswith('"...')) |
| 83 | //% self.assertTrue(self.frame().FindVariable('longconstcharstar').GetSummary().endswith('"...')) |
| 84 | // FIXME: make "b.data" and "c.data" work sanely |
| 85 | } |
| 86 | |
| 87 | |