/* extract_pattern: copy a pattern string from the command buffer; return pointer to the copy */ char * extract_pattern(int delimiter) { static char *lhbuf = NULL; /* buffer */ static int lhbufsz = 0; /* buffer size */ char *nd; int len; for (nd = ibufp; *nd != delimiter && *nd != '\n'; nd++) switch (*nd) { default: break; case '[': if ((nd = parse_char_class(++nd)) == NULL) { errmsg = "unbalanced brackets ([])"; return NULL; } break; case '\\': if (*++nd == '\n') { errmsg = "trailing backslash (\\)"; return NULL; } break; } len = nd - ibufp; REALLOC(lhbuf, lhbufsz, len + 1, NULL); memcpy(lhbuf, ibufp, len); lhbuf[len] = '\0'; ibufp = nd; return (isbinary) ? NUL_TO_NEWLINE(lhbuf, len) : lhbuf; }
/* copy a pattern string from the command buffer; return pointer to the copy */ static char *extract_pattern( const char **ibufpp, const int delimiter ) { static char *buf = 0; static int bufsz = 0; const char *nd = *ibufpp; int len; while( *nd != delimiter && *nd != '\n' ) { if( *nd == '[' ) { nd = parse_char_class( ++nd ); if( !nd ) { set_error_msg( "Unbalanced brackets ([])" ); return 0; } } else if( *nd == '\\' && *++nd == '\n' ) { set_error_msg( "Trailing backslash (\\)" ); return 0; } ++nd; } len = nd - *ibufpp; if( !resize_buffer( &buf, &bufsz, len + 1 ) ) return 0; memcpy( buf, *ibufpp, len ); buf[len] = 0; *ibufpp = nd; if( isbinary() ) nul_to_newline( buf, len ); return buf; }