diff options
Diffstat (limited to 'sed/compile.c')
-rw-r--r-- | sed/compile.c | 1212 |
1 files changed, 606 insertions, 606 deletions
diff --git a/sed/compile.c b/sed/compile.c index 07e3837..77aec27 100644 --- a/sed/compile.c +++ b/sed/compile.c @@ -191,13 +191,13 @@ bad_prog(why) { if (cur_input.name) fprintf(stderr, _("%s: file %s line %lu: %s\n"), - myname, cur_input.name, (unsigned long)cur_input.line, why); + myname, cur_input.name, (unsigned long)cur_input.line, why); else fprintf(stderr, _("%s: -e expression #%lu, char %lu: %s\n"), - myname, - (unsigned long)cur_input.string_expr_count, - (unsigned long)(prog.cur-prog.base), - why); + myname, + (unsigned long)cur_input.string_expr_count, + (unsigned long)(prog.cur-prog.base), + why); exit(EXIT_FAILURE); } @@ -214,12 +214,12 @@ inchar() if (prog.cur) { if (prog.cur < prog.end) - ch = *prog.cur++; + ch = *prog.cur++; } else if (prog.file) { if (!feof(prog.file)) - ch = getc(prog.file); + ch = getc(prog.file); } if (ch == '\n') ++cur_input.line; @@ -239,8 +239,8 @@ savchar(ch) if (prog.cur) { if (prog.cur <= prog.base || *--prog.cur != ch) - panic("Called savchar() with unexpected pushback (%x)", - (unsigned char)ch); + panic("Called savchar() with unexpected pushback (%x)", + (unsigned char)ch); } else ungetc(ch, prog.file); @@ -301,26 +301,26 @@ convert_number(result, buf, bufend, base) { int d = -1; switch (*p) - { - case '0': d = 0x0; break; - case '1': d = 0x1; break; - case '2': d = 0x2; break; - case '3': d = 0x3; break; - case '4': d = 0x4; break; - case '5': d = 0x5; break; - case '6': d = 0x6; break; - case '7': d = 0x7; break; - case '8': d = 0x8; break; - case '9': d = 0x9; break; - case 'A': case 'a': d = 0xa; break; - case 'B': case 'b': d = 0xb; break; - case 'C': case 'c': d = 0xc; break; - case 'D': case 'd': d = 0xd; break; - case 'E': case 'e': d = 0xe; break; - case 'F': case 'f': d = 0xf; break; - } + { + case '0': d = 0x0; break; + case '1': d = 0x1; break; + case '2': d = 0x2; break; + case '3': d = 0x3; break; + case '4': d = 0x4; break; + case '5': d = 0x5; break; + case '6': d = 0x6; break; + case '7': d = 0x7; break; + case '8': d = 0x8; break; + case '9': d = 0x9; break; + case 'A': case 'a': d = 0xa; break; + case 'B': case 'b': d = 0xb; break; + case 'C': case 'c': d = 0xc; break; + case 'D': case 'd': d = 0xd; break; + case 'E': case 'e': d = 0xe; break; + case 'F': case 'f': d = 0xf; break; + } if (d < 0 || base <= d) - break; + break; n = n * base + d; } if (p == buf+1) @@ -345,11 +345,11 @@ read_filename() { #if 0 /*XXX ZZZ 1998-09-12 kpp: added, then had second thoughts*/ if (posixicity == POSIXLY_EXTENDED) - if (ch == ';' || ch == '#') - { - savchar(ch); - break; - } + if (ch == ';' || ch == '#') + { + savchar(ch); + break; + } #endif ch = add_then_next(b, ch); } @@ -385,9 +385,9 @@ get_openfile(file_ptrs, mode, fail) for (special = special_files; special->outf.name; special++) if (strcmp(special->outf.name, file_name) == 0) { - special->outf.fp = *special->pfp; - free_buffer (b); - return &special->outf; + special->outf.fp = *special->pfp; + free_buffer (b); + return &special->outf; } } @@ -449,61 +449,61 @@ snarf_char_class(b, cur_stat) ch = add_then_next(b, ch); /* States are: - 0 outside a collation element, character class or collation class - 1 after the bracket - 2 after the opening ./:/= - 3 after the closing ./:/= */ + 0 outside a collation element, character class or collation class + 1 after the bracket + 2 after the opening ./:/= + 3 after the closing ./:/= */ for (;; ch = add_then_next (b, ch)) { pending_mb = BRLEN (ch, cur_stat) != 1; switch (ch) - { - case EOF: - case '\n': - return ch; - - case '.': - case ':': - case '=': - if (pending_mb) - continue; - - if (state == 1) - { - delim = ch; - state = 2; - } - else if (state == 2 && ch == delim) - state = 3; - else - break; - - continue; - - case OPEN_BRACKET: - if (pending_mb) - continue; - - if (state == 0) - state = 1; - continue; - - case CLOSE_BRACKET: - if (pending_mb) - continue; - - if (state == 0 || state == 1) - return ch; - else if (state == 3) - state = 0; - - break; - - default: - break; - } + { + case EOF: + case '\n': + return ch; + + case '.': + case ':': + case '=': + if (pending_mb) + continue; + + if (state == 1) + { + delim = ch; + state = 2; + } + else if (state == 2 && ch == delim) + state = 3; + else + break; + + continue; + + case OPEN_BRACKET: + if (pending_mb) + continue; + + if (state == 0) + state = 1; + continue; + + case CLOSE_BRACKET: + if (pending_mb) + continue; + + if (state == 0 || state == 1) + return ch; + else if (state == 3) + state = 0; + + break; + + default: + break; + } /* Getting a character different from .=: whilst in state 1 goes back to state 0, getting a character different from ] @@ -535,29 +535,29 @@ match_slash(slash, regex) { bool pending_mb = !MBSINIT (&cur_stat); if (BRLEN (ch, &cur_stat) == 1 && !pending_mb) - { - if (ch == slash) - return b; - else if (ch == '\\') - { - ch = inchar(); - if (ch == EOF) - break; + { + if (ch == slash) + return b; + else if (ch == '\\') + { + ch = inchar(); + if (ch == EOF) + break; #ifndef REG_PERL - else if (ch == 'n' && regex) - ch = '\n'; + else if (ch == 'n' && regex) + ch = '\n'; #endif - else if (ch != '\n' && (ch != slash || (!regex && ch == '&'))) - add1_buffer(b, '\\'); - } + else if (ch != '\n' && (ch != slash || (!regex && ch == '&'))) + add1_buffer(b, '\\'); + } else if (ch == OPEN_BRACKET && regex) - { - add1_buffer(b, ch); - ch = snarf_char_class(b, &cur_stat); - if (ch != CLOSE_BRACKET) - break; - } - } + { + add1_buffer(b, ch); + ch = snarf_char_class(b, &cur_stat); + if (ch != CLOSE_BRACKET) + break; + } + } add1_buffer(b, ch); } @@ -587,82 +587,82 @@ mark_subst_opts(cmd) { case 'i': /* GNU extension */ case 'I': /* GNU extension */ - if (posixicity == POSIXLY_BASIC) - bad_prog(_(UNKNOWN_S_OPT)); - flags |= REG_ICASE; - break; + if (posixicity == POSIXLY_BASIC) + bad_prog(_(UNKNOWN_S_OPT)); + flags |= REG_ICASE; + break; #ifdef REG_PERL case 's': /* GNU extension */ case 'S': /* GNU extension */ - if (posixicity == POSIXLY_BASIC) - bad_prog(_(UNKNOWN_S_OPT)); - if (extended_regexp_flags & REG_PERL) - flags |= REG_DOTALL; - break; + if (posixicity == POSIXLY_BASIC) + bad_prog(_(UNKNOWN_S_OPT)); + if (extended_regexp_flags & REG_PERL) + flags |= REG_DOTALL; + break; case 'x': /* GNU extension */ case 'X': /* GNU extension */ - if (posixicity == POSIXLY_BASIC) - bad_prog(_(UNKNOWN_S_OPT)); - if (extended_regexp_flags & REG_PERL) - flags |= REG_EXTENDED; - break; + if (posixicity == POSIXLY_BASIC) + bad_prog(_(UNKNOWN_S_OPT)); + if (extended_regexp_flags & REG_PERL) + flags |= REG_EXTENDED; + break; #endif case 'm': /* GNU extension */ case 'M': /* GNU extension */ - if (posixicity == POSIXLY_BASIC) - bad_prog(_(UNKNOWN_S_OPT)); - flags |= REG_NEWLINE; - break; + if (posixicity == POSIXLY_BASIC) + bad_prog(_(UNKNOWN_S_OPT)); + flags |= REG_NEWLINE; + break; case 'e': - cmd->eval = true; - break; + cmd->eval = true; + break; case 'p': - if (cmd->print) - bad_prog(_(EXCESS_P_OPT)); - cmd->print |= (1 << cmd->eval); /* 1=before eval, 2=after */ - break; + if (cmd->print) + bad_prog(_(EXCESS_P_OPT)); + cmd->print |= (1 << cmd->eval); /* 1=before eval, 2=after */ + break; case 'g': - if (cmd->global) - bad_prog(_(EXCESS_G_OPT)); - cmd->global = true; - break; + if (cmd->global) + bad_prog(_(EXCESS_G_OPT)); + cmd->global = true; + break; case 'w': - cmd->outf = get_openfile(&file_write, write_mode, true); - return flags; + cmd->outf = get_openfile(&file_write, write_mode, true); + return flags; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - if (cmd->numb) - bad_prog(_(EXCESS_N_OPT)); - cmd->numb = in_integer(ch); - if (!cmd->numb) - bad_prog(_(ZERO_N_OPT)); - break; + if (cmd->numb) + bad_prog(_(EXCESS_N_OPT)); + cmd->numb = in_integer(ch); + if (!cmd->numb) + bad_prog(_(ZERO_N_OPT)); + break; case CLOSE_BRACE: case '#': - savchar(ch); - /* Fall Through */ + savchar(ch); + /* Fall Through */ case EOF: case '\n': case ';': - return flags; + return flags; case '\r': - if (inchar() == '\n') - return flags; - /* FALLTHROUGH */ + if (inchar() == '\n') + return flags; + /* FALLTHROUGH */ default: - bad_prog(_(UNKNOWN_S_OPT)); - /*NOTREACHED*/ + bad_prog(_(UNKNOWN_S_OPT)); + /*NOTREACHED*/ } } @@ -680,7 +680,7 @@ read_label() ch = in_nonblank(); while (ch != EOF && ch != '\n' - && !ISBLANK(ch) && ch != ';' && ch != CLOSE_BRACE && ch != '#') + && !ISBLANK(ch) && ch != ';' && ch != CLOSE_BRACE && ch != '#') ch = add_then_next (b, ch); savchar(ch); @@ -770,77 +770,77 @@ setup_replacement(sub, text, length) for (p=base; p<text_end; ++p) { if (*p == '\\') - { - /* Preceding the backslash may be some literal text: */ - tail = tail->next = - new_replacement(base, (size_t)(p - base), repl_type); - - repl_type = save_type; - - /* Skip the backslash and look for a numeric back-reference, - or a case-munging escape if not in POSIX mode: */ - ++p; - if (p == text_end) - ++tail->prefix_length; - - else if (posixicity == POSIXLY_BASIC && !ISDIGIT (*p)) - { - p[-1] = *p; - ++tail->prefix_length; - } - - else - switch (*p) - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - tail->subst_id = *p - '0'; - if (sub->max_id < tail->subst_id) - sub->max_id = tail->subst_id; - break; - - case 'L': - repl_type = REPL_LOWERCASE; - save_type = REPL_LOWERCASE; - break; - - case 'U': - repl_type = REPL_UPPERCASE; - save_type = REPL_UPPERCASE; - break; - - case 'E': - repl_type = REPL_ASIS; - save_type = REPL_ASIS; - break; - - case 'l': - save_type = repl_type; - repl_type |= REPL_LOWERCASE_FIRST; - break; - - case 'u': - save_type = repl_type; - repl_type |= REPL_UPPERCASE_FIRST; - break; - - default: - p[-1] = *p; - ++tail->prefix_length; - } - - base = p + 1; - } + { + /* Preceding the backslash may be some literal text: */ + tail = tail->next = + new_replacement(base, (size_t)(p - base), repl_type); + + repl_type = save_type; + + /* Skip the backslash and look for a numeric back-reference, + or a case-munging escape if not in POSIX mode: */ + ++p; + if (p == text_end) + ++tail->prefix_length; + + else if (posixicity == POSIXLY_BASIC && !ISDIGIT (*p)) + { + p[-1] = *p; + ++tail->prefix_length; + } + + else + switch (*p) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + tail->subst_id = *p - '0'; + if (sub->max_id < tail->subst_id) + sub->max_id = tail->subst_id; + break; + + case 'L': + repl_type = REPL_LOWERCASE; + save_type = REPL_LOWERCASE; + break; + + case 'U': + repl_type = REPL_UPPERCASE; + save_type = REPL_UPPERCASE; + break; + + case 'E': + repl_type = REPL_ASIS; + save_type = REPL_ASIS; + break; + + case 'l': + save_type = repl_type; + repl_type |= REPL_LOWERCASE_FIRST; + break; + + case 'u': + save_type = repl_type; + repl_type |= REPL_UPPERCASE_FIRST; + break; + + default: + p[-1] = *p; + ++tail->prefix_length; + } + + base = p + 1; + } else if (*p == '&') - { - /* Preceding the ampersand may be some literal text: */ - tail = tail->next = - new_replacement(base, (size_t)(p - base), repl_type); - - repl_type = save_type; - tail->subst_id = 0; - base = p + 1; - } + { + /* Preceding the ampersand may be some literal text: */ + tail = tail->next = + new_replacement(base, (size_t)(p - base), repl_type); + + repl_type = save_type; + tail->subst_id = 0; + base = p + 1; + } } /* There may be some trailing literal text: */ if (base < text_end) @@ -863,7 +863,7 @@ read_text(buf, leadin_ch) if (buf) { if (pending_text) - free_buffer(pending_text); + free_buffer(pending_text); pending_text = init_buffer(); buf->text = NULL; buf->text_length = 0; @@ -881,17 +881,17 @@ read_text(buf, leadin_ch) while (ch != EOF && ch != '\n') { if (ch == '\\') - { - ch = inchar(); - if (ch != EOF) - add1_buffer (pending_text, '\\'); - } + { + ch = inchar(); + if (ch != EOF) + add1_buffer (pending_text, '\\'); + } if (ch == EOF) - { - add1_buffer (pending_text, '\n'); - return; - } + { + add1_buffer (pending_text, '\n'); + return; + } ch = add_then_next (pending_text, ch); } @@ -900,7 +900,7 @@ read_text(buf, leadin_ch) if (!buf) buf = old_text_buf; buf->text_length = normalize_text (get_buffer (pending_text), - size_buffer (pending_text), TEXT_BUFFER); + size_buffer (pending_text), TEXT_BUFFER); buf->text = MEMDUP(get_buffer(pending_text), buf->text_length, char); free_buffer(pending_text); pending_text = NULL; @@ -928,45 +928,45 @@ compile_address(addr, ch) struct buffer *b; addr->addr_type = ADDR_IS_REGEX; if (ch == '\\') - ch = inchar(); + ch = inchar(); if ( !(b = match_slash(ch, true)) ) - bad_prog(_(UNTERM_ADDR_RE)); + bad_prog(_(UNTERM_ADDR_RE)); for(;;) - { - ch = in_nonblank(); - if (posixicity == POSIXLY_BASIC) - goto posix_address_modifier; + { + ch = in_nonblank(); + if (posixicity == POSIXLY_BASIC) + goto posix_address_modifier; switch(ch) - { - case 'I': /* GNU extension */ - flags |= REG_ICASE; - break; + { + case 'I': /* GNU extension */ + flags |= REG_ICASE; + break; #ifdef REG_PERL - case 'S': /* GNU extension */ - if (extended_regexp_flags & REG_PERL) - flags |= REG_DOTALL; - break; - - case 'X': /* GNU extension */ - if (extended_regexp_flags & REG_PERL) - flags |= REG_EXTENDED; - break; + case 'S': /* GNU extension */ + if (extended_regexp_flags & REG_PERL) + flags |= REG_DOTALL; + break; + + case 'X': /* GNU extension */ + if (extended_regexp_flags & REG_PERL) + flags |= REG_EXTENDED; + break; #endif - case 'M': /* GNU extension */ - flags |= REG_NEWLINE; - break; - - default: - posix_address_modifier: - savchar (ch); - addr->addr_regex = compile_regex (b, flags, 0); - free_buffer(b); - return true; - } - } + case 'M': /* GNU extension */ + flags |= REG_NEWLINE; + break; + + default: + posix_address_modifier: + savchar (ch); + addr->addr_regex = compile_regex (b, flags, 0); + free_buffer(b); + return true; + } + } } else if (ISDIGIT(ch)) { @@ -974,28 +974,28 @@ compile_address(addr, ch) addr->addr_type = ADDR_IS_NUM; ch = in_nonblank(); if (ch != '~' || posixicity == POSIXLY_BASIC) - { - savchar(ch); - } + { + savchar(ch); + } else - { - countT step = in_integer(in_nonblank()); - if (step > 0) - { - addr->addr_step = step; - addr->addr_type = ADDR_IS_NUM_MOD; - } - } + { + countT step = in_integer(in_nonblank()); + if (step > 0) + { + addr->addr_step = step; + addr->addr_type = ADDR_IS_NUM_MOD; + } + } } else if ((ch == '+' || ch == '~') && posixicity != POSIXLY_BASIC) { addr->addr_step = in_integer(in_nonblank()); if (addr->addr_step==0) - ; /* default to ADDR_IS_NULL; forces matching to stop on next line */ + ; /* default to ADDR_IS_NULL; forces matching to stop on next line */ else if (ch == '+') - addr->addr_type = ADDR_IS_STEP; + addr->addr_type = ADDR_IS_STEP; else - addr->addr_type = ADDR_IS_STEP_MOD; + addr->addr_type = ADDR_IS_STEP_MOD; } else if (ch == '$') { @@ -1035,44 +1035,44 @@ compile_program(vector) struct addr a; while ((ch=inchar()) == ';' || ISSPACE(ch)) - ; + ; if (ch == EOF) - break; + break; cur_cmd = next_cmd_entry(&vector); if (compile_address(&a, ch)) - { - if (a.addr_type == ADDR_IS_STEP - || a.addr_type == ADDR_IS_STEP_MOD) - bad_prog(_(BAD_STEP)); - - cur_cmd->a1 = MEMDUP(&a, 1, struct addr); - ch = in_nonblank(); - if (ch == ',') - { - if (!compile_address(&a, in_nonblank())) - bad_prog(_(BAD_COMMA)); - - cur_cmd->a2 = MEMDUP(&a, 1, struct addr); - ch = in_nonblank(); - } - - if ((cur_cmd->a1->addr_type == ADDR_IS_NUM - && cur_cmd->a1->addr_number == 0) - && ((!cur_cmd->a2 || cur_cmd->a2->addr_type != ADDR_IS_REGEX) - || posixicity == POSIXLY_BASIC)) - bad_prog(_(INVALID_LINE_0)); - } + { + if (a.addr_type == ADDR_IS_STEP + || a.addr_type == ADDR_IS_STEP_MOD) + bad_prog(_(BAD_STEP)); + + cur_cmd->a1 = MEMDUP(&a, 1, struct addr); + ch = in_nonblank(); + if (ch == ',') + { + if (!compile_address(&a, in_nonblank())) + bad_prog(_(BAD_COMMA)); + + cur_cmd->a2 = MEMDUP(&a, 1, struct addr); + ch = in_nonblank(); + } + + if ((cur_cmd->a1->addr_type == ADDR_IS_NUM + && cur_cmd->a1->addr_number == 0) + && ((!cur_cmd->a2 || cur_cmd->a2->addr_type != ADDR_IS_REGEX) + || posixicity == POSIXLY_BASIC)) + bad_prog(_(INVALID_LINE_0)); + } if (ch == '!') - { - cur_cmd->addr_bang = true; - ch = in_nonblank(); - if (ch == '!') - bad_prog(_(BAD_BANG)); - } + { + cur_cmd->addr_bang = true; + ch = in_nonblank(); + if (ch == '!') + bad_prog(_(BAD_BANG)); + } /* Do not accept extended commands in --posix mode. Also, - a few commands only accept one address in that mode. */ + a few commands only accept one address in that mode. */ if (posixicity == POSIXLY_BASIC) switch (ch) { @@ -1080,131 +1080,131 @@ compile_program(vector) case 'Q': case 'T': case 'R': case 'W': bad_command(ch); - case 'a': case 'i': case 'l': - case '=': case 'r': - if (cur_cmd->a2) - bad_prog(_(ONE_ADDR)); - } + case 'a': case 'i': case 'l': + case '=': case 'r': + if (cur_cmd->a2) + bad_prog(_(ONE_ADDR)); + } cur_cmd->cmd = ch; switch (ch) - { - case '#': - if (cur_cmd->a1) - bad_prog(_(NO_SHARP_ADDR)); - ch = inchar(); - if (ch=='n' && first_script && cur_input.line < 2) - if ( (prog.base && prog.cur==2+prog.base) - || (prog.file && !prog.base && 2==ftell(prog.file))) - no_default_output = true; - while (ch != EOF && ch != '\n') - ch = inchar(); - continue; /* restart the for (;;) loop */ - - case 'v': - /* This is an extension. Programs needing GNU sed might start - * with a `v' command so that other seds will stop. - * We compare the version and ignore POSIXLY_CORRECT. - */ - { - char *version = read_label (); - char *compared_version; - compared_version = (*version == '\0') ? "4.0" : version; - if (strverscmp (compared_version, SED_FEATURE_VERSION) > 0) - bad_prog(_(ANCIENT_VERSION)); - - free (version); - posixicity = POSIXLY_EXTENDED; - } - continue; - - case '{': - blocks = setup_label(blocks, vector->v_length, NULL, &cur_input); - cur_cmd->addr_bang = !cur_cmd->addr_bang; - break; - - case '}': - if (!blocks) - bad_prog(_(EXCESS_CLOSE_BRACE)); - if (cur_cmd->a1) - bad_prog(_(NO_CLOSE_BRACE_ADDR)); - ch = in_nonblank(); - if (ch == CLOSE_BRACE || ch == '#') - savchar(ch); - else if (ch != EOF && ch != '\n' && ch != ';') - bad_prog(_(EXCESS_JUNK)); - - vector->v[blocks->v_index].x.jump_index = vector->v_length; - blocks = release_label(blocks); /* done with this entry */ - break; - - case 'e': - ch = in_nonblank(); - if (ch == EOF || ch == '\n') - { - cur_cmd->x.cmd_txt.text_length = 0; - break; - } - else - goto read_text_to_slash; - - case 'a': - case 'i': - case 'c': - ch = in_nonblank(); - - read_text_to_slash: - if (ch == EOF) - bad_prog(_(EXPECTED_SLASH)); - - if (ch == '\\') - ch = inchar(); - else - { - if (posixicity == POSIXLY_BASIC) - bad_prog(_(EXPECTED_SLASH)); - savchar(ch); - ch = '\n'; - } - - read_text(&cur_cmd->x.cmd_txt, ch); - break; - - case ':': - if (cur_cmd->a1) - bad_prog(_(NO_COLON_ADDR)); - labels = setup_label(labels, vector->v_length, read_label(), NULL); - break; - - case 'T': - case 'b': - case 't': - jumps = setup_label(jumps, vector->v_length, read_label(), NULL); - break; - - case 'Q': - case 'q': - if (cur_cmd->a2) - bad_prog(_(ONE_ADDR)); - /* Fall through */ - - case 'L': - case 'l': - ch = in_nonblank(); - if (ISDIGIT(ch) && posixicity != POSIXLY_BASIC) - { - cur_cmd->x.int_arg = in_integer(ch); - ch = in_nonblank(); - } - else - cur_cmd->x.int_arg = -1; - - if (ch == CLOSE_BRACE || ch == '#') - savchar(ch); - else if (ch != EOF && ch != '\n' && ch != ';') - bad_prog(_(EXCESS_JUNK)); - - break; + { + case '#': + if (cur_cmd->a1) + bad_prog(_(NO_SHARP_ADDR)); + ch = inchar(); + if (ch=='n' && first_script && cur_input.line < 2) + if ( (prog.base && prog.cur==2+prog.base) + || (prog.file && !prog.base && 2==ftell(prog.file))) + no_default_output = true; + while (ch != EOF && ch != '\n') + ch = inchar(); + continue; /* restart the for (;;) loop */ + + case 'v': + /* This is an extension. Programs needing GNU sed might start + * with a `v' command so that other seds will stop. + * We compare the version and ignore POSIXLY_CORRECT. + */ + { + char *version = read_label (); + char *compared_version; + compared_version = (*version == '\0') ? "4.0" : version; + if (strverscmp (compared_version, SED_FEATURE_VERSION) > 0) + bad_prog(_(ANCIENT_VERSION)); + + free (version); + posixicity = POSIXLY_EXTENDED; + } + continue; + + case '{': + blocks = setup_label(blocks, vector->v_length, NULL, &cur_input); + cur_cmd->addr_bang = !cur_cmd->addr_bang; + break; + + case '}': + if (!blocks) + bad_prog(_(EXCESS_CLOSE_BRACE)); + if (cur_cmd->a1) + bad_prog(_(NO_CLOSE_BRACE_ADDR)); + ch = in_nonblank(); + if (ch == CLOSE_BRACE || ch == '#') + savchar(ch); + else if (ch != EOF && ch != '\n' && ch != ';') + bad_prog(_(EXCESS_JUNK)); + + vector->v[blocks->v_index].x.jump_index = vector->v_length; + blocks = release_label(blocks); /* done with this entry */ + break; + + case 'e': + ch = in_nonblank(); + if (ch == EOF || ch == '\n') + { + cur_cmd->x.cmd_txt.text_length = 0; + break; + } + else + goto read_text_to_slash; + + case 'a': + case 'i': + case 'c': + ch = in_nonblank(); + + read_text_to_slash: + if (ch == EOF) + bad_prog(_(EXPECTED_SLASH)); + + if (ch == '\\') + ch = inchar(); + else + { + if (posixicity == POSIXLY_BASIC) + bad_prog(_(EXPECTED_SLASH)); + savchar(ch); + ch = '\n'; + } + + read_text(&cur_cmd->x.cmd_txt, ch); + break; + + case ':': + if (cur_cmd->a1) + bad_prog(_(NO_COLON_ADDR)); + labels = setup_label(labels, vector->v_length, read_label(), NULL); + break; + + case 'T': + case 'b': + case 't': + jumps = setup_label(jumps, vector->v_length, read_label(), NULL); + break; + + case 'Q': + case 'q': + if (cur_cmd->a2) + bad_prog(_(ONE_ADDR)); + /* Fall through */ + + case 'L': + case 'l': + ch = in_nonblank(); + if (ISDIGIT(ch) && posixicity != POSIXLY_BASIC) + { + cur_cmd->x.int_arg = in_integer(ch); + ch = in_nonblank(); + } + else + cur_cmd->x.int_arg = -1; + + if (ch == CLOSE_BRACE || ch == '#') + savchar(ch); + else if (ch != EOF && ch != '\n' && ch != ';') + bad_prog(_(EXCESS_JUNK)); + + break; case '=': case 'd': @@ -1213,79 +1213,79 @@ compile_program(vector) case 'g': case 'G': case 'h': - case 'H': - case 'n': - case 'N': - case 'p': - case 'P': - case 'z': - case 'x': - ch = in_nonblank(); - if (ch == CLOSE_BRACE || ch == '#') - savchar(ch); - else if (ch != EOF && ch != '\n' && ch != ';') - bad_prog(_(EXCESS_JUNK)); - break; - - case 'r': - b = read_filename(); - cur_cmd->x.fname = ck_strdup(get_buffer(b)); - free_buffer(b); - break; + case 'H': + case 'n': + case 'N': + case 'p': + case 'P': + case 'z': + case 'x': + ch = in_nonblank(); + if (ch == CLOSE_BRACE || ch == '#') + savchar(ch); + else if (ch != EOF && ch != '\n' && ch != ';') + bad_prog(_(EXCESS_JUNK)); + break; + + case 'r': + b = read_filename(); + cur_cmd->x.fname = ck_strdup(get_buffer(b)); + free_buffer(b); + break; case 'R': - cur_cmd->x.fp = get_openfile(&file_read, read_mode, false)->fp; - break; + cur_cmd->x.fp = get_openfile(&file_read, read_mode, false)->fp; + break; case 'W': - case 'w': - cur_cmd->x.outf = get_openfile(&file_write, write_mode, true); - break; - - case 's': - { - struct buffer *b2; - int flags; - int slash; - - slash = inchar(); - if ( !(b = match_slash(slash, true)) ) - bad_prog(_(UNTERM_S_CMD)); - if ( !(b2 = match_slash(slash, false)) ) - bad_prog(_(UNTERM_S_CMD)); - - cur_cmd->x.cmd_subst = OB_MALLOC(&obs, 1, struct subst); - setup_replacement(cur_cmd->x.cmd_subst, - get_buffer(b2), size_buffer(b2)); - free_buffer(b2); - - flags = mark_subst_opts(cur_cmd->x.cmd_subst); - cur_cmd->x.cmd_subst->regx = - compile_regex(b, flags, cur_cmd->x.cmd_subst->max_id + 1); - free_buffer(b); - } - break; - - case 'y': - { - size_t len, dest_len; - int slash; - struct buffer *b2; + case 'w': + cur_cmd->x.outf = get_openfile(&file_write, write_mode, true); + break; + + case 's': + { + struct buffer *b2; + int flags; + int slash; + + slash = inchar(); + if ( !(b = match_slash(slash, true)) ) + bad_prog(_(UNTERM_S_CMD)); + if ( !(b2 = match_slash(slash, false)) ) + bad_prog(_(UNTERM_S_CMD)); + + cur_cmd->x.cmd_subst = OB_MALLOC(&obs, 1, struct subst); + setup_replacement(cur_cmd->x.cmd_subst, + get_buffer(b2), size_buffer(b2)); + free_buffer(b2); + + flags = mark_subst_opts(cur_cmd->x.cmd_subst); + cur_cmd->x.cmd_subst->regx = + compile_regex(b, flags, cur_cmd->x.cmd_subst->max_id + 1); + free_buffer(b); + } + break; + + case 'y': + { + size_t len, dest_len; + int slash; + struct buffer *b2; char *src_buf, *dest_buf; - slash = inchar(); - if ( !(b = match_slash(slash, false)) ) - bad_prog(_(UNTERM_Y_CMD)); + slash = inchar(); + if ( !(b = match_slash(slash, false)) ) + bad_prog(_(UNTERM_Y_CMD)); src_buf = get_buffer(b); - len = normalize_text(src_buf, size_buffer (b), TEXT_BUFFER); + len = normalize_text(src_buf, size_buffer (b), TEXT_BUFFER); if ( !(b2 = match_slash(slash, false)) ) - bad_prog(_(UNTERM_Y_CMD)); + bad_prog(_(UNTERM_Y_CMD)); dest_buf = get_buffer(b2); - dest_len = normalize_text(dest_buf, size_buffer (b2), TEXT_BUFFER); + dest_len = normalize_text(dest_buf, size_buffer (b2), TEXT_BUFFER); if (mb_cur_max > 1) - { + { int i, j, idx, src_char_num; size_t *src_lens = MALLOC(len, size_t); char **trans_pairs; @@ -1347,38 +1347,38 @@ compile_program(vector) } else { - unsigned char *translate = - OB_MALLOC(&obs, YMAP_LENGTH, unsigned char); + unsigned char *translate = + OB_MALLOC(&obs, YMAP_LENGTH, unsigned char); unsigned char *ustring = (unsigned char *)src_buf; - if (len != dest_len) + if (len != dest_len) bad_prog(_(Y_CMD_LEN)); - for (len = 0; len < YMAP_LENGTH; len++) - translate[len] = len; + for (len = 0; len < YMAP_LENGTH; len++) + translate[len] = len; while (dest_len--) translate[*ustring++] = (unsigned char)*dest_buf++; - cur_cmd->x.translate = translate; - } + cur_cmd->x.translate = translate; + } if ((ch = in_nonblank()) != EOF && ch != '\n' && ch != ';') bad_prog(_(EXCESS_JUNK)); free_buffer(b); free_buffer(b2); - } - break; + } + break; - case EOF: - bad_prog(_(NO_COMMAND)); - /*NOTREACHED*/ + case EOF: + bad_prog(_(NO_COMMAND)); + /*NOTREACHED*/ - default: - bad_command (ch); - /*NOTREACHED*/ - } + default: + bad_command (ch); + /*NOTREACHED*/ + } /* this is buried down here so that "continue" statements will miss it */ ++vector->v_length; @@ -1418,7 +1418,7 @@ normalize_text(buf, len, buftype) { mbclen = MBRLEN (p, bufend - p, &cur_stat); if (mbclen != 1) - { + { /* An invalid sequence, or a truncated multibyte character. We treat it as a singlebyte character. */ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0) @@ -1427,68 +1427,68 @@ normalize_text(buf, len, buftype) memmove (q, p, mbclen); q += mbclen; p += mbclen; - continue; - } + continue; + } if (*p == '\\' && p+1 < bufend && bracket_state == 0) - switch (*++p) - { + switch (*++p) + { #if defined __STDC__ && __STDC__-0 - case 'a': *q++ = '\a'; p++; continue; + case 'a': *q++ = '\a'; p++; continue; #else /* Not STDC; we'll just assume ASCII */ - case 'a': *q++ = '\007'; p++; continue; + case 'a': *q++ = '\007'; p++; continue; #endif - /* case 'b': *q++ = '\b'; p++; continue; --- conflicts with \b RE */ - case 'f': *q++ = '\f'; p++; continue; - case '\n': /*fall through */ - case 'n': *q++ = '\n'; p++; continue; - case 'r': *q++ = '\r'; p++; continue; - case 't': *q++ = '\t'; p++; continue; - case 'v': *q++ = '\v'; p++; continue; - - case 'd': /* decimal byte */ + /* case 'b': *q++ = '\b'; p++; continue; --- conflicts with \b RE */ + case 'f': *q++ = '\f'; p++; continue; + case '\n': /*fall through */ + case 'n': *q++ = '\n'; p++; continue; + case 'r': *q++ = '\r'; p++; continue; + case 't': *q++ = '\t'; p++; continue; + case 'v': *q++ = '\v'; p++; continue; + + case 'd': /* decimal byte */ base = 10; goto convert; - case 'x': /* hexadecimal byte */ + case 'x': /* hexadecimal byte */ base = 16; goto convert; #ifdef REG_PERL - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - if ((extended_regexp_flags & REG_PERL) - && p+1 < bufend - && p[1] >= '0' && p[1] <= '9') - { + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + if ((extended_regexp_flags & REG_PERL) + && p+1 < bufend + && p[1] >= '0' && p[1] <= '9') + { base = 8; goto convert; - } - else - { - /* we just pass the \ up one level for interpretation */ - if (buftype != TEXT_BUFFER) - *q++ = '\\'; - } - - continue; - - case 'o': /* octal byte */ - if (!(extended_regexp_flags & REG_PERL)) - { + } + else + { + /* we just pass the \ up one level for interpretation */ + if (buftype != TEXT_BUFFER) + *q++ = '\\'; + } + + continue; + + case 'o': /* octal byte */ + if (!(extended_regexp_flags & REG_PERL)) + { base = 8; goto convert; - } - else - { - /* we just pass the \ up one level for interpretation */ - if (buftype != TEXT_BUFFER) - *q++ = '\\'; - } - - continue; + } + else + { + /* we just pass the \ up one level for interpretation */ + if (buftype != TEXT_BUFFER) + *q++ = '\\'; + } + + continue; #else - case 'o': /* octal byte */ + case 'o': /* octal byte */ base = 8; #endif convert: @@ -1500,27 +1500,27 @@ convert: *q++ = ch; continue; - case 'c': - if (++p < bufend) - { - *q++ = toupper((unsigned char) *p) ^ 0x40; - p++; - continue; - } - else - { - /* we just pass the \ up one level for interpretation */ - if (buftype != TEXT_BUFFER) - *q++ = '\\'; - continue; - } - - default: - /* we just pass the \ up one level for interpretation */ - if (buftype != TEXT_BUFFER) - *q++ = '\\'; - break; - } + case 'c': + if (++p < bufend) + { + *q++ = toupper((unsigned char) *p) ^ 0x40; + p++; + continue; + } + else + { + /* we just pass the \ up one level for interpretation */ + if (buftype != TEXT_BUFFER) + *q++ = '\\'; + continue; + } + + default: + /* we just pass the \ up one level for interpretation */ + if (buftype != TEXT_BUFFER) + *q++ = '\\'; + break; + } else if (buftype == TEXT_REGEX && posixicity != POSIXLY_EXTENDED) switch (*p) { @@ -1529,16 +1529,16 @@ convert: bracket_state = -1; break; - case ':': - case '.': - case '=': + case ':': + case '.': + case '=': if (bracket_state == -1 && p[-1] == '[') bracket_state = *p; break; case ']': if (bracket_state == 0) - ; + ; else if (bracket_state == -1) bracket_state = 0; else if (p[-2] != bracket_state && p[-1] == bracket_state) @@ -1638,7 +1638,7 @@ check_final_program(program) old_text_buf->text_length = size_buffer(pending_text); if (old_text_buf->text_length) old_text_buf->text = MEMDUP(get_buffer(pending_text), - old_text_buf->text_length, char); + old_text_buf->text_length, char); free_buffer(pending_text); pending_text = NULL; } @@ -1646,18 +1646,18 @@ check_final_program(program) for (go = jumps; go; go = release_label(go)) { for (lbl = labels; lbl; lbl = lbl->next) - if (strcmp(lbl->name, go->name) == 0) - break; + if (strcmp(lbl->name, go->name) == 0) + break; if (lbl) - { - program->v[go->v_index].x.jump_index = lbl->v_index; - } + { + program->v[go->v_index].x.jump_index = lbl->v_index; + } else - { - if (*go->name) - panic(_("can't find label for jump to `%s'"), go->name); - program->v[go->v_index].x.jump_index = program->v_length; - } + { + if (*go->name) + panic(_("can't find label for jump to `%s'"), go->name); + program->v[go->v_index].x.jump_index = program->v_length; + } } jumps = NULL; @@ -1671,17 +1671,17 @@ check_final_program(program) for (p=file_read; p; p=p->link) if (p->name) - { - free(p->name); - p->name = NULL; - } + { + free(p->name); + p->name = NULL; + } for (p=file_write; p; p=p->link) if (p->name) - { - free(p->name); - p->name = NULL; - } + { + free(p->name); + p->name = NULL; + } } } @@ -1707,23 +1707,23 @@ finish_program(program) for (p=file_read; p; p=q) { - if (p->fp) - ck_fclose(p->fp); - q = p->link; + if (p->fp) + ck_fclose(p->fp); + q = p->link; #if 0 - /* We use obstacks. */ - free(p); + /* We use obstacks. */ + free(p); #endif } for (p=file_write; p; p=q) { - if (p->fp) - ck_fclose(p->fp); - q = p->link; + if (p->fp) + ck_fclose(p->fp); + q = p->link; #if 0 - /* We use obstacks. */ - free(p); + /* We use obstacks. */ + free(p); #endif } file_read = file_write = NULL; |