|
void get_regerror(int errcode, re_pattern_buffer *compiled, char *func) { size_t length = regerror (errcode, compiled, NULL, 0); char *buffer = xmalloc (length); regerror (errcode, compiled, buffer, length); fprintf(stderr, "%s: %s\n", func, buffer); free(buffer); } #define SET_FASTMAP() \ { \ unsigned this_char; \ \ memset (fastmap, invert, (1 << BYTEWIDTH)); \ \ for (this_char = 0; this_char < strlen (fastmap_string); this_char++)\ fastmap[fastmap_string[this_char]] = !invert; \ fastmap['\n'] = match_newline; \ } void unformat (char *string) { char *pattern; struct re_pattern_buffer compiled; char fastmap[1 << BYTEWIDTH]; const char *comperr; char *fastmap_string; unsigned invert, match_newline; struct re_registers *matches; int execerr, len, prelen, postlen, slen; re_set_syntax (RE_NO_BK_PARENS | RE_NO_BK_VBAR); pattern = "(<.>|</.>)"; invert = 0; match_newline = 0; fastmap_string = "/<>bi"; SET_FASTMAP (); memset (&compiled, 0, sizeof (compiled)); comperr = re_compile_pattern(pattern, strlen(pattern), &compiled); if (comperr) get_regerror((int)*comperr, &compiled, "re_compile_pattern"); /* Şablon derlendi. Biçim arıtmasına başlayabiliriz. */ slen = strlen(string); compiled.fastmap = fastmap; matches = alloca (sizeof(matches) * (compiled.re_nsub + 1)); while (1) { memset (matches, 0, sizeof (matches)); execerr = re_search (&compiled, string, slen, 0, slen, matches); if (execerr == - 1) { /* puts ("Eşleşme bulunamadı"); */ break; } if (execerr >= 0) { len = matches->end[0] - matches->start[0]; postlen = slen - matches->end[0]; prelen = matches->start[0]; strncpy(string + prelen, string + matches->end[0], postlen); slen = prelen + postlen; string[slen] = '\0'; } else { get_regerror(comperr, &compiled, "re_search"); } } }
|