| 1 | #include "mycpp/common.h"
 | 
| 2 | #include "vendor/greatest.h"
 | 
| 3 | 
 | 
| 4 | TEST libc_demo() {
 | 
| 5 |   int x = strcmp("a", "b");
 | 
| 6 |   log("strcmp = %d", x);
 | 
| 7 |   x = strcmp("a", "a");
 | 
| 8 |   log("strcmp = %d", x);
 | 
| 9 | 
 | 
| 10 |   // Functions to test with:
 | 
| 11 |   // - different LANG settings
 | 
| 12 |   // - musl libc vs. GNU libc, etc.
 | 
| 13 |   //
 | 
| 14 |   // glob() and fnmatch()
 | 
| 15 |   // regexec()
 | 
| 16 |   // strcoll()
 | 
| 17 |   // int toupper(), tolower(), toupper_l() can be passed locale
 | 
| 18 |   //
 | 
| 19 |   // See doc/unicode.md
 | 
| 20 | 
 | 
| 21 |   // We could have pyext/libc.c wrappers for this, rather than using Python
 | 
| 22 |   // str.upper().  Maybe remove Str::{upper,lower}() from the Yaks language,
 | 
| 23 |   // since it depends on Unicode.
 | 
| 24 | 
 | 
| 25 |   int c;
 | 
| 26 |   c = toupper((unsigned char)'a');
 | 
| 27 |   log("toupper %c", c);
 | 
| 28 | 
 | 
| 29 |   c = tolower((unsigned char)c);
 | 
| 30 |   log("tolower %c", c);
 | 
| 31 | }
 | 
| 32 | 
 | 
| 33 | TEST isspace_demo() {
 | 
| 34 |   int x;
 | 
| 35 | 
 | 
| 36 |   // 0xa0 from
 | 
| 37 |   // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#white_space
 | 
| 38 |   //
 | 
| 39 |   // Somehow it's false
 | 
| 40 |   //
 | 
| 41 |   // In Python we have
 | 
| 42 |   // >>> '\u00a0'.isspace()
 | 
| 43 |   // True
 | 
| 44 | 
 | 
| 45 |   // U+00A0 is non-breaking space
 | 
| 46 |   // U+FEFF is zero-width no break space - this is true
 | 
| 47 |   int cases[] = {'\0', '\t', '\v', '\f', ' ', 'a', 0xa0, 0xfeff};
 | 
| 48 |   int n = sizeof(cases) / sizeof(cases[0]);
 | 
| 49 | 
 | 
| 50 |   for (int i = 0; i < n; ++i) {
 | 
| 51 |     int x = isspace(cases[i]);
 | 
| 52 |     log("isspace %x %d", cases[i], x);
 | 
| 53 |   }
 | 
| 54 |   PASS();
 | 
| 55 | }
 | 
| 56 | 
 | 
| 57 | GREATEST_MAIN_DEFS();
 | 
| 58 | 
 | 
| 59 | int main(int argc, char **argv) {
 | 
| 60 |   // gHeap.Init();
 | 
| 61 | 
 | 
| 62 |   GREATEST_MAIN_BEGIN();
 | 
| 63 | 
 | 
| 64 |   RUN_TEST(libc_demo);
 | 
| 65 |   RUN_TEST(isspace_demo);
 | 
| 66 | 
 | 
| 67 |   // gHeap.CleanProcessExit();
 | 
| 68 | 
 | 
| 69 |   GREATEST_MAIN_END();
 | 
| 70 |   return 0;
 | 
| 71 | }
 |