#include #include #include int main(void) { int l, n = 0; char *inp = "//sysnb pipe(p *[2]_C_int) (err error)"; char *out = __builtin_alloca(strlen(inp)*2+3); regex_t re; regmatch_t m[1]; strcpy(out, inp); #ifndef ERE # define ERE "[ (]*" #endif if (regcomp(&re, ERE, REG_EXTENDED) != 0) __builtin_abort(); do { l = strcspn(inp, "\n\0"); if (regexec(&re, inp, 1, m, 0) == 0 && m[0].rm_so <= l) { l = m[0].rm_so; if (m[0].rm_eo == 0) m[0].rm_eo++, l++; n++; } else { m[0].rm_eo = l; if (inp[l]) m[0].rm_eo++; } memcpy(out, inp, l); do { out[l] = '\0'; } while (++l < m[0].rm_eo); printf("[%2d] '%s'\n", n, out); while (*(out++) != '\0') continue; inp += m[0].rm_eo; } while (*inp); regfree(&re); return 0; } #if 0 + gcc '-DERE="[ (]*"' -o x regexec.c + ./x [ 1] '/' [ 2] '/' [ 3] 's' [ 4] 'y' [ 5] 's' [ 6] 'n' [ 7] 'b' [ 8] '' [ 9] 'p' [10] 'i' [11] 'p' [12] 'e' [13] '' [14] 'p' [15] '' [16] '*' [17] '[' [18] '2' [19] ']' [20] '_' [21] 'C' [22] '_' [23] 'i' [24] 'n' [25] 't' [26] ')' [27] '' [28] 'e' [29] 'r' [30] 'r' [31] '' [32] 'e' [33] 'r' [34] 'r' [35] 'o' [36] 'r' [37] ')' + gcc '-DERE="[ (]"' -o x regexec.c + ./x [ 1] '//sysnb' [ 2] 'pipe' [ 3] 'p' [ 4] '*[2]_C_int)' [ 5] '' [ 6] 'err' [ 6] 'error)' #endif