iutf8expr.c - utf8expr - expr(1) for UTF-8 Err bitreich.org 70 hgit clone git://bitreich.org/utf8expr/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/utf8expr/ URL:git://bitreich.org/utf8expr/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/utf8expr/ bitreich.org 70 1Log /scm/utf8expr/log.gph bitreich.org 70 1Files /scm/utf8expr/files.gph bitreich.org 70 1Refs /scm/utf8expr/refs.gph bitreich.org 70 1Tags /scm/utf8expr/tag bitreich.org 70 1LICENSE /scm/utf8expr/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iutf8expr.c (2190B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * Copy me if you can. Err bitreich.org 70 i 3 * by 20h Err bitreich.org 70 i 4 */ Err bitreich.org 70 i 5 Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 Err bitreich.org 70 i 12 #include "arg.h" Err bitreich.org 70 i 13 Err bitreich.org 70 i 14 char *argv0; Err bitreich.org 70 i 15 Err bitreich.org 70 i 16 /* Err bitreich.org 70 i 17 * Idea taken from: Err bitreich.org 70 i 18 * http://canonical.org/~kragen/strlen-utf8.html Err bitreich.org 70 i 19 */ Err bitreich.org 70 i 20 size_t Err bitreich.org 70 i 21 utf8strlen(char *s) Err bitreich.org 70 i 22 { Err bitreich.org 70 i 23 size_t i; Err bitreich.org 70 i 24 Err bitreich.org 70 i 25 i = 0; Err bitreich.org 70 i 26 for (; s[0]; s++) { Err bitreich.org 70 i 27 if ((s[0] & 0xc0) != 0x80) Err bitreich.org 70 i 28 i++; Err bitreich.org 70 i 29 } Err bitreich.org 70 i 30 Err bitreich.org 70 i 31 return i; Err bitreich.org 70 i 32 } Err bitreich.org 70 i 33 Err bitreich.org 70 i 34 char * Err bitreich.org 70 i 35 utf8strchr(char *s, char *c) Err bitreich.org 70 i 36 { Err bitreich.org 70 i 37 size_t j, cl; Err bitreich.org 70 i 38 Err bitreich.org 70 i 39 cl = strlen(c); Err bitreich.org 70 i 40 if (cl == 0) Err bitreich.org 70 i 41 return NULL; Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 for (j = 0; ; s++) { Err bitreich.org 70 i 44 if (j > 6) Err bitreich.org 70 i 45 return NULL; Err bitreich.org 70 i 46 j++; Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') { Err bitreich.org 70 i 49 if (cl == j) { Err bitreich.org 70 i 50 if (!memcmp(&s[-j], c, cl)) Err bitreich.org 70 i 51 return &s[-j]; Err bitreich.org 70 i 52 } Err bitreich.org 70 i 53 j = 0; Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 if (s[0] == '\0') Err bitreich.org 70 i 56 break; Err bitreich.org 70 i 57 } Err bitreich.org 70 i 58 } Err bitreich.org 70 i 59 Err bitreich.org 70 i 60 return NULL; Err bitreich.org 70 i 61 } Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 char * Err bitreich.org 70 i 64 utf8substr(char *s, size_t pos, size_t *length) Err bitreich.org 70 i 65 { Err bitreich.org 70 i 66 size_t i, j, rl; Err bitreich.org 70 i 67 char *ret; Err bitreich.org 70 i 68 Err bitreich.org 70 i 69 if (*length < 1) Err bitreich.org 70 i 70 return NULL; Err bitreich.org 70 i 71 Err bitreich.org 70 i 72 ret = NULL; Err bitreich.org 70 i 73 rl = 0; Err bitreich.org 70 i 74 for (i = 0, j = 0; *length > 0; s++) { Err bitreich.org 70 i 75 if (j > 6) Err bitreich.org 70 i 76 return NULL; Err bitreich.org 70 i 77 j++; Err bitreich.org 70 i 78 Err bitreich.org 70 i 79 if (ret != NULL) Err bitreich.org 70 i 80 rl++; Err bitreich.org 70 i 81 Err bitreich.org 70 i 82 if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') { Err bitreich.org 70 i 83 if (i >= pos) { Err bitreich.org 70 i 84 if (ret == NULL) { Err bitreich.org 70 i 85 ret = &s[-j]; Err bitreich.org 70 i 86 rl = j; Err bitreich.org 70 i 87 } Err bitreich.org 70 i 88 (*length)--; Err bitreich.org 70 i 89 } Err bitreich.org 70 i 90 i++; Err bitreich.org 70 i 91 j = 0; Err bitreich.org 70 i 92 Err bitreich.org 70 i 93 if (s[0] == '\0') Err bitreich.org 70 i 94 break; Err bitreich.org 70 i 95 } Err bitreich.org 70 i 96 } Err bitreich.org 70 i 97 Err bitreich.org 70 i 98 *length = rl; Err bitreich.org 70 i 99 return ret; Err bitreich.org 70 i 100 } Err bitreich.org 70 i 101 Err bitreich.org 70 i 102 size_t Err bitreich.org 70 i 103 utf8index(char *s, char *chars) Err bitreich.org 70 i 104 { Err bitreich.org 70 i 105 size_t i, j; Err bitreich.org 70 i 106 char c[7]; Err bitreich.org 70 i 107 Err bitreich.org 70 i 108 j = 0; Err bitreich.org 70 i 109 for (i = 0; ; s++) { Err bitreich.org 70 i 110 if (j > 6) Err bitreich.org 70 i 111 return 0; Err bitreich.org 70 i 112 j++; Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') { Err bitreich.org 70 i 115 memset(c, 0, sizeof(c)); Err bitreich.org 70 i 116 memmove(c, &s[-j], j); Err bitreich.org 70 i 117 if (utf8strchr(chars, c)) Err bitreich.org 70 i 118 return i; Err bitreich.org 70 i 119 i++; Err bitreich.org 70 i 120 j = 0; Err bitreich.org 70 i 121 Err bitreich.org 70 i 122 if (s[0] == '\0') Err bitreich.org 70 i 123 break; Err bitreich.org 70 i 124 } Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 Err bitreich.org 70 i 127 return 0; Err bitreich.org 70 i 128 } Err bitreich.org 70 i 129 Err bitreich.org 70 i 130 void Err bitreich.org 70 i 131 usage(void) Err bitreich.org 70 i 132 { Err bitreich.org 70 i 133 fprintf(stderr, "usage: %s [substr|index|length] str [args ...]\n", Err bitreich.org 70 i 134 basename(argv0)); Err bitreich.org 70 i 135 exit(1); Err bitreich.org 70 i 136 } Err bitreich.org 70 i 137 Err bitreich.org 70 i 138 int Err bitreich.org 70 i 139 main(int argc, char *argv[]) Err bitreich.org 70 i 140 { Err bitreich.org 70 i 141 char *s; Err bitreich.org 70 i 142 size_t len; Err bitreich.org 70 i 143 Err bitreich.org 70 i 144 argv0 = argv[0]; Err bitreich.org 70 i 145 Err bitreich.org 70 i 146 if (argc < 3) Err bitreich.org 70 i 147 usage(); Err bitreich.org 70 i 148 Err bitreich.org 70 i 149 switch(argv[1][0]) { Err bitreich.org 70 i 150 case 'i': Err bitreich.org 70 i 151 if (argc < 4) Err bitreich.org 70 i 152 usage(); Err bitreich.org 70 i 153 printf("%ld\n", utf8index(argv[2], argv[3])); Err bitreich.org 70 i 154 break; Err bitreich.org 70 i 155 case 'l': Err bitreich.org 70 i 156 printf("%ld\n", utf8strlen(argv[2])); Err bitreich.org 70 i 157 break; Err bitreich.org 70 i 158 case 's': Err bitreich.org 70 i 159 if (argc < 5) Err bitreich.org 70 i 160 usage(); Err bitreich.org 70 i 161 len = atoi(argv[4]); Err bitreich.org 70 i 162 s = utf8substr(argv[2], atoi(argv[3]), &len); Err bitreich.org 70 i 163 if (s == NULL) Err bitreich.org 70 i 164 return -1; Err bitreich.org 70 i 165 printf("%.*s\n", (int)len, s); Err bitreich.org 70 i 166 break; Err bitreich.org 70 i 167 default: Err bitreich.org 70 i 168 usage(); Err bitreich.org 70 i 169 }; Err bitreich.org 70 i 170 Err bitreich.org 70 i 171 return 0; Err bitreich.org 70 i 172 } Err bitreich.org 70 i 173 Err bitreich.org 70 .