f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * Copyright (c) 2005, 2008 Sun Microsystems, Inc. All Rights Reserved.
f82568a780e35e8786958c49a1259434e2088b9cniq * Use is subject to license terms.
f82568a780e35e8786958c49a1259434e2088b9cniq *
11e076839c8d5a82d55e710194d0daac51390dbdsf * Copyright (c) 1984 AT&T
11e076839c8d5a82d55e710194d0daac51390dbdsf * All Rights Reserved
f82568a780e35e8786958c49a1259434e2088b9cniq *
f82568a780e35e8786958c49a1259434e2088b9cniq * Licensed under the Apache License, Version 2.0 (the "License");
f82568a780e35e8786958c49a1259434e2088b9cniq * you may not use this file except in compliance with the License.
f82568a780e35e8786958c49a1259434e2088b9cniq * You may obtain a copy of the License at
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * http://www.apache.org/licenses/LICENSE-2.0.
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim *
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * Unless required by applicable law or agreed to in writing, software
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * distributed under the License is distributed on an "AS IS" BASIS,
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * or implied.
f82568a780e35e8786958c49a1259434e2088b9cniq * See the License for the specific language governing permissions and
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * limitations under the License.
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq#include "apr.h"
f82568a780e35e8786958c49a1259434e2088b9cniq#include "apr_lib.h"
f82568a780e35e8786958c49a1259434e2088b9cniq#include "libsed.h"
f82568a780e35e8786958c49a1259434e2088b9cniq#include "sed.h"
f82568a780e35e8786958c49a1259434e2088b9cniq#include "apr_strings.h"
f82568a780e35e8786958c49a1259434e2088b9cniq#include "regexp.h"
f82568a780e35e8786958c49a1259434e2088b9cniq
7bccdbc7016c4ea9d196a15c391d5e629d886e34jortonstatic const char *const trans[040] = {
f82568a780e35e8786958c49a1259434e2088b9cniq "\\01",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\02",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\03",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\04",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\05",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\06",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\07",
6fde49e04de4cc97908b20ea01f0c3940f3a1e54rpluem "\\10",
6fde49e04de4cc97908b20ea01f0c3940f3a1e54rpluem "\\11",
f82568a780e35e8786958c49a1259434e2088b9cniq "\n",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\13",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\14",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\15",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\16",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\17",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\20",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\21",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\22",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\23",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\24",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\25",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\26",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\27",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\30",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\31",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\32",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\33",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\34",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\35",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\36",
f82568a780e35e8786958c49a1259434e2088b9cniq "\\37"
f82568a780e35e8786958c49a1259434e2088b9cniq};
7bccdbc7016c4ea9d196a15c391d5e629d886e34jortonstatic const char rub[] = {"\\177"};
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniqextern int sed_step(char *p1, char *p2, int circf, step_vars_storage *vars);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic int substitute(sed_eval_t *eval, sed_reptr_t *ipc,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t execute(sed_eval_t *eval);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic int match(sed_eval_t *eval, char *expbuf, int gf,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t dosub(sed_eval_t *eval, char *rhsbuf, int n,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic char *place(sed_eval_t *eval, char *asp, char *al1, char *al2);
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniqstatic apr_status_t wline(sed_eval_t *eval, char *buf, int sz);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniqstatic apr_status_t arout(sed_eval_t *eval);
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void eval_errf(sed_eval_t *eval, const char *fmt, ...)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->errfn && eval->pool) {
f82568a780e35e8786958c49a1259434e2088b9cniq va_list args;
f82568a780e35e8786958c49a1259434e2088b9cniq const char* error;
f82568a780e35e8786958c49a1259434e2088b9cniq va_start(args, fmt);
f82568a780e35e8786958c49a1259434e2088b9cniq error = apr_pvsprintf(eval->pool, fmt, args);
f82568a780e35e8786958c49a1259434e2088b9cniq eval->errfn(eval->data, error);
f82568a780e35e8786958c49a1259434e2088b9cniq va_end(args);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq#define INIT_BUF_SIZE 1024
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * grow_buffer
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void grow_buffer(apr_pool_t *pool, char **buffer,
f82568a780e35e8786958c49a1259434e2088b9cniq char **spend, unsigned int *cursize,
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int newsize)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq char* newbuffer = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq int spendsize = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq if (*cursize >= newsize)
f82568a780e35e8786958c49a1259434e2088b9cniq return;
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem /* Avoid number of times realloc is called. It could cause huge memory
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem * requirement if line size is huge e.g 2 MB */
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem if (newsize < *cursize * 2) {
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem newsize = *cursize * 2;
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem }
ab2b977442827214b1d884decf3e3f1579fd45e1rpluem
f82568a780e35e8786958c49a1259434e2088b9cniq /* Align it to 4 KB boundary */
f82568a780e35e8786958c49a1259434e2088b9cniq newsize = (newsize + ((1 << 12) - 1)) & ~((1 << 12) -1);
f82568a780e35e8786958c49a1259434e2088b9cniq newbuffer = apr_pcalloc(pool, newsize);
f82568a780e35e8786958c49a1259434e2088b9cniq if (*spend && *buffer && (*cursize > 0)) {
f82568a780e35e8786958c49a1259434e2088b9cniq spendsize = *spend - *buffer;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if ((*cursize > 0) && *buffer) {
f82568a780e35e8786958c49a1259434e2088b9cniq memcpy(newbuffer, *buffer, *cursize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq *buffer = newbuffer;
f82568a780e35e8786958c49a1259434e2088b9cniq *cursize = newsize;
f82568a780e35e8786958c49a1259434e2088b9cniq if (spend != buffer) {
f82568a780e35e8786958c49a1259434e2088b9cniq *spend = *buffer + spendsize;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * grow_line_buffer
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void grow_line_buffer(sed_eval_t *eval, int newsize)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq grow_buffer(eval->pool, &eval->linebuf, &eval->lspend,
f82568a780e35e8786958c49a1259434e2088b9cniq &eval->lsize, newsize);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * grow_hold_buffer
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void grow_hold_buffer(sed_eval_t *eval, int newsize)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq grow_buffer(eval->pool, &eval->holdbuf, &eval->hspend,
f82568a780e35e8786958c49a1259434e2088b9cniq &eval->hsize, newsize);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * grow_gen_buffer
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void grow_gen_buffer(sed_eval_t *eval, int newsize,
f82568a780e35e8786958c49a1259434e2088b9cniq char **gspend)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq if (gspend == NULL) {
f82568a780e35e8786958c49a1259434e2088b9cniq gspend = &eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq grow_buffer(eval->pool, &eval->genbuf, gspend,
f82568a780e35e8786958c49a1259434e2088b9cniq &eval->gsize, newsize);
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lcomend = &eval->genbuf[71];
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * appendmem_to_linebuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void appendmem_to_linebuf(sed_eval_t *eval, const char* sz, int len)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int reqsize = (eval->lspend - eval->linebuf) + len;
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lsize < reqsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq grow_line_buffer(eval, reqsize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq memcpy(eval->lspend, sz, len);
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend += len;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * append_to_linebuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void append_to_linebuf(sed_eval_t *eval, const char* sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int len = strlen(sz);
f82568a780e35e8786958c49a1259434e2088b9cniq /* Copy string including null character */
f82568a780e35e8786958c49a1259434e2088b9cniq appendmem_to_linebuf(eval, sz, len + 1);
f82568a780e35e8786958c49a1259434e2088b9cniq --eval->lspend; /* lspend will now point to NULL character */
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * copy_to_linebuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void copy_to_linebuf(sed_eval_t *eval, const char* sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_linebuf(eval, sz);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * append_to_holdbuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void append_to_holdbuf(sed_eval_t *eval, const char* sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int len = strlen(sz);
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int reqsize = (eval->hspend - eval->holdbuf) + len + 1;
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->hsize <= reqsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq grow_hold_buffer(eval, reqsize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq strcpy(eval->hspend, sz);
f82568a780e35e8786958c49a1259434e2088b9cniq /* hspend will now point to NULL character */
f82568a780e35e8786958c49a1259434e2088b9cniq eval->hspend += len;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * copy_to_holdbuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void copy_to_holdbuf(sed_eval_t *eval, const char* sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq eval->hspend = eval->holdbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_holdbuf(eval, sz);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * append_to_genbuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void append_to_genbuf(sed_eval_t *eval, const char* sz, char **gspend)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int len = strlen(sz);
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int reqsize = (*gspend - eval->genbuf) + len + 1;
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->gsize < reqsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq grow_gen_buffer(eval, reqsize, gspend);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq strcpy(*gspend, sz);
f82568a780e35e8786958c49a1259434e2088b9cniq /* *gspend will now point to NULL character */
f82568a780e35e8786958c49a1259434e2088b9cniq *gspend += len;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * copy_to_genbuf
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic void copy_to_genbuf(sed_eval_t *eval, const char* sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int len = strlen(sz);
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int reqsize = len + 1;
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->gsize < reqsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq grow_gen_buffer(eval, reqsize, NULL);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_init_eval
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqapr_status_t sed_init_eval(sed_eval_t *eval, sed_commands_t *commands, sed_err_fn_t *errfn, void *data, sed_write_fn_t *writefn, apr_pool_t* p)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq memset(eval, 0, sizeof(*eval));
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pool = p;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->writefn = writefn;
f82568a780e35e8786958c49a1259434e2088b9cniq return sed_reset_eval(eval, commands, errfn, data);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_reset_eval
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqapr_status_t sed_reset_eval(sed_eval_t *eval, sed_commands_t *commands, sed_err_fn_t *errfn, void *data)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int i;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->errfn = errfn;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->data = data;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->commands = commands;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lnum = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->fout = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->linebuf == NULL) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lsize = INIT_BUF_SIZE;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->linebuf = apr_pcalloc(eval->pool, eval->lsize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->holdbuf == NULL) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->hsize = INIT_BUF_SIZE;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->holdbuf = apr_pcalloc(eval->pool, eval->hsize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->genbuf == NULL) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->gsize = INIT_BUF_SIZE;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->genbuf = apr_pcalloc(eval->pool, eval->gsize);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->hspend = eval->holdbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lcomend = &eval->genbuf[71];
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq for (i = 0; i < sizeof(eval->abuf) / sizeof(eval->abuf[0]); i++)
f82568a780e35e8786958c49a1259434e2088b9cniq eval->abuf[i] = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->aptr = eval->abuf;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pending = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar = apr_pcalloc(eval->pool, commands->nrep * sizeof(unsigned char));
f82568a780e35e8786958c49a1259434e2088b9cniq eval->nrep = commands->nrep;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->dolflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->sflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->jflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->delflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lreadyflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->quitflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->finalflag = 1; /* assume we're evaluating only one file/stream */
f82568a780e35e8786958c49a1259434e2088b9cniq eval->numpass = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->nullmatch = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->col = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq for (i = 0; i < commands->nfiles; i++) {
f82568a780e35e8786958c49a1259434e2088b9cniq const char* filename = commands->fname[i];
f82568a780e35e8786958c49a1259434e2088b9cniq if (apr_file_open(&eval->fcode[i], filename,
f82568a780e35e8786958c49a1259434e2088b9cniq APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pool) != APR_SUCCESS) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval_errf(eval, SEDERR_COMES, filename);
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_destroy_eval
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqvoid sed_destroy_eval(sed_eval_t *eval)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int i;
f82568a780e35e8786958c49a1259434e2088b9cniq /* eval->linebuf, eval->holdbuf, eval->genbuf and eval->inar are allocated
f82568a780e35e8786958c49a1259434e2088b9cniq * on pool. It will be freed when pool will be freed */
f82568a780e35e8786958c49a1259434e2088b9cniq for (i = 0; i < eval->commands->nfiles; i++) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->fcode[i] != NULL) {
f82568a780e35e8786958c49a1259434e2088b9cniq apr_file_close(eval->fcode[i]);
f82568a780e35e8786958c49a1259434e2088b9cniq eval->fcode[i] = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_eval_file
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqapr_status_t sed_eval_file(sed_eval_t *eval, apr_file_t *fin, void *fout)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq for (;;) {
f82568a780e35e8786958c49a1259434e2088b9cniq char buf[1024];
f82568a780e35e8786958c49a1259434e2088b9cniq apr_size_t read_bytes = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq read_bytes = sizeof(buf);
f82568a780e35e8786958c49a1259434e2088b9cniq if (apr_file_read(fin, buf, &read_bytes) != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (sed_eval_buffer(eval, buf, read_bytes, fout) != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->quitflag)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq return sed_finalize_eval(eval, fout);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_eval_buffer
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqapr_status_t sed_eval_buffer(sed_eval_t *eval, const char *buf, int bufsz, void *fout)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq apr_status_t rv;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->quitflag)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (!sed_canbe_finalized(eval->commands)) {
f82568a780e35e8786958c49a1259434e2088b9cniq /* Commands were not finalized properly. */
f82568a780e35e8786958c49a1259434e2088b9cniq const char* error = sed_get_finalize_error(eval->commands, eval->pool);
f82568a780e35e8786958c49a1259434e2088b9cniq if (error) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval_errf(eval, error);
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->fout = fout;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq /* Process leftovers */
f82568a780e35e8786958c49a1259434e2088b9cniq if (bufsz && eval->lreadyflag) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lreadyflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend--;
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->lspend = '\0';
f82568a780e35e8786958c49a1259434e2088b9cniq rv = execute(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq while (bufsz) {
f82568a780e35e8786958c49a1259434e2088b9cniq char *n;
f82568a780e35e8786958c49a1259434e2088b9cniq int llen;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq n = memchr(buf, '\n', bufsz);
f82568a780e35e8786958c49a1259434e2088b9cniq if (n == NULL)
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq llen = n - buf;
f82568a780e35e8786958c49a1259434e2088b9cniq if (llen == bufsz - 1) {
f82568a780e35e8786958c49a1259434e2088b9cniq /* This might be the last line; delay its processing */
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lreadyflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq }
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim
f82568a780e35e8786958c49a1259434e2088b9cniq appendmem_to_linebuf(eval, buf, llen + 1);
f82568a780e35e8786958c49a1259434e2088b9cniq --eval->lspend;
f82568a780e35e8786958c49a1259434e2088b9cniq /* replace new line character with NULL */
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->lspend = '\0';
f82568a780e35e8786958c49a1259434e2088b9cniq buf += (llen + 1);
f82568a780e35e8786958c49a1259434e2088b9cniq bufsz -= (llen + 1);
f82568a780e35e8786958c49a1259434e2088b9cniq rv = execute(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->quitflag)
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq /* Save the leftovers for later */
f82568a780e35e8786958c49a1259434e2088b9cniq if (bufsz) {
f82568a780e35e8786958c49a1259434e2088b9cniq appendmem_to_linebuf(eval, buf, bufsz);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * sed_finalize_eval
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqapr_status_t sed_finalize_eval(sed_eval_t *eval, void *fout)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->quitflag)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->finalflag)
f82568a780e35e8786958c49a1259434e2088b9cniq eval->dolflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->fout = fout;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq /* Process leftovers */
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lspend > eval->linebuf) {
f82568a780e35e8786958c49a1259434e2088b9cniq apr_status_t rv;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lreadyflag) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lreadyflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend--;
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq /* Code can probably reach here when last character in output
f82568a780e35e8786958c49a1259434e2088b9cniq * buffer is not a newline.
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniq /* Assure space for NULL */
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_linebuf(eval, "");
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->lspend = '\0';
f82568a780e35e8786958c49a1259434e2088b9cniq rv = execute(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->quitflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * execute
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t execute(sed_eval_t *eval)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq sed_reptr_t *ipc = eval->commands->ptrspace;
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage step_vars;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq apr_status_t rv = APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lnum++;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->sflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->pending) {
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = eval->pending;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pending = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq memset(&step_vars, 0, sizeof(step_vars));
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq while (ipc->command) {
f82568a780e35e8786958c49a1259434e2088b9cniq char *p1;
f82568a780e35e8786958c49a1259434e2088b9cniq char *p2;
f82568a780e35e8786958c49a1259434e2088b9cniq int c;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = ipc->ad1;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = ipc->ad2;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (p1) {
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->inar[ipc->nrep]) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (*p2 == CEND) {
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq } else if (*p2 == CLNUM) {
f82568a780e35e8786958c49a1259434e2088b9cniq c = (unsigned char)p2[1];
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lnum > eval->commands->tlno[c]) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar[ipc->nrep] = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->negfl)
f82568a780e35e8786958c49a1259434e2088b9cniq goto yes;
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lnum == eval->commands->tlno[c]) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar[ipc->nrep] = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else if (match(eval, p2, 0, &step_vars)) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar[ipc->nrep] = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else if (*p1 == CEND) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (!eval->dolflag) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->negfl)
f82568a780e35e8786958c49a1259434e2088b9cniq goto yes;
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else if (*p1 == CLNUM) {
f82568a780e35e8786958c49a1259434e2088b9cniq c = (unsigned char)p1[1];
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->lnum != eval->commands->tlno[c]) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->negfl)
f82568a780e35e8786958c49a1259434e2088b9cniq goto yes;
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if (p2)
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar[ipc->nrep] = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq } else if (match(eval, p1, 0, &step_vars)) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (p2)
f82568a780e35e8786958c49a1259434e2088b9cniq eval->inar[ipc->nrep] = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->negfl)
f82568a780e35e8786958c49a1259434e2088b9cniq goto yes;
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->negfl) {
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniqyes:
f82568a780e35e8786958c49a1259434e2088b9cniq rv = command(eval, ipc, &step_vars);
f82568a780e35e8786958c49a1259434e2088b9cniq if (rv != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->quitflag)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->pending)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->delflag)
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->jflag) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->jflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq if ((ipc = ipc->lb1) == 0) {
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = eval->commands->ptrspace;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else
f82568a780e35e8786958c49a1259434e2088b9cniq ipc = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (!eval->commands->nflag && !eval->delflag) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->aptr > eval->abuf)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = arout(eval);
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->delflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * match
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic int match(sed_eval_t *eval, char *expbuf, int gf,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq char *p1;
f82568a780e35e8786958c49a1259434e2088b9cniq int circf;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if(gf) {
f82568a780e35e8786958c49a1259434e2088b9cniq if(*expbuf) return(0);
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars->locs = p1 = step_vars->loc2;
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars->locs = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq circf = *expbuf++;
f82568a780e35e8786958c49a1259434e2088b9cniq return(sed_step(p1, expbuf, circf, step_vars));
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * substitute
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic int substitute(sed_eval_t *eval, sed_reptr_t *ipc,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq if(match(eval, ipc->re1, 0, step_vars) == 0) return(0);
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->numpass = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->sflag = 0; /* Flags if any substitution was made */
f82568a780e35e8786958c49a1259434e2088b9cniq if (dosub(eval, ipc->rhs, ipc->gfl, step_vars) != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq return -1;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if(ipc->gfl) {
f82568a780e35e8786958c49a1259434e2088b9cniq while(*step_vars->loc2) {
f82568a780e35e8786958c49a1259434e2088b9cniq if(match(eval, ipc->re1, 1, step_vars) == 0) break;
f82568a780e35e8786958c49a1259434e2088b9cniq if (dosub(eval, ipc->rhs, ipc->gfl, step_vars) != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq return -1;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq return(eval->sflag);
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * dosub
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t dosub(sed_eval_t *eval, char *rhsbuf, int n,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq char *lp, *sp, *rp;
f82568a780e35e8786958c49a1259434e2088b9cniq int c;
f82568a780e35e8786958c49a1259434e2088b9cniq apr_status_t rv = APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if(n > 0 && n < 999) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->numpass++;
f82568a780e35e8786958c49a1259434e2088b9cniq if(n != eval->numpass) return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq eval->sflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq lp = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq sp = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq rp = rhsbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq sp = place(eval, sp, lp, step_vars->loc1);
f82568a780e35e8786958c49a1259434e2088b9cniq while ((c = *rp++) != 0) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (c == '&') {
f82568a780e35e8786958c49a1259434e2088b9cniq sp = place(eval, sp, step_vars->loc1, step_vars->loc2);
f82568a780e35e8786958c49a1259434e2088b9cniq if (sp == NULL)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq else if (c == '\\') {
f82568a780e35e8786958c49a1259434e2088b9cniq c = *rp++;
f82568a780e35e8786958c49a1259434e2088b9cniq if (c >= '1' && c < NBRA+'1') {
f82568a780e35e8786958c49a1259434e2088b9cniq sp = place(eval, sp, step_vars->braslist[c-'1'],
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars->braelist[c-'1']);
f82568a780e35e8786958c49a1259434e2088b9cniq if (sp == NULL)
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq else
f82568a780e35e8786958c49a1259434e2088b9cniq *sp++ = c;
f82568a780e35e8786958c49a1259434e2088b9cniq } else
f82568a780e35e8786958c49a1259434e2088b9cniq *sp++ = c;
f82568a780e35e8786958c49a1259434e2088b9cniq if (sp >= eval->genbuf + eval->gsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq /* expand genbuf and set the sp appropriately */
f82568a780e35e8786958c49a1259434e2088b9cniq grow_gen_buffer(eval, eval->gsize + 1024, &sp);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq lp = step_vars->loc2;
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars->loc2 = sp - eval->genbuf + eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_genbuf(eval, lp, &sp);
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_linebuf(eval, eval->genbuf);
f82568a780e35e8786958c49a1259434e2088b9cniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * place
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic char *place(sed_eval_t *eval, char *asp, char *al1, char *al2)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq char *sp = asp;
f82568a780e35e8786958c49a1259434e2088b9cniq int n = al2 - al1;
f82568a780e35e8786958c49a1259434e2088b9cniq unsigned int reqsize = (sp - eval->genbuf) + n + 1;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (eval->gsize < reqsize) {
f82568a780e35e8786958c49a1259434e2088b9cniq grow_gen_buffer(eval, reqsize, &sp);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq memcpy(sp, al1, n);
f82568a780e35e8786958c49a1259434e2088b9cniq return sp + n;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * command
f82568a780e35e8786958c49a1259434e2088b9cniq */
f82568a780e35e8786958c49a1259434e2088b9cniqstatic apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc,
f82568a780e35e8786958c49a1259434e2088b9cniq step_vars_storage *step_vars)
f82568a780e35e8786958c49a1259434e2088b9cniq{
f82568a780e35e8786958c49a1259434e2088b9cniq int i;
7bccdbc7016c4ea9d196a15c391d5e629d886e34jorton char *p1, *p2;
7bccdbc7016c4ea9d196a15c391d5e629d886e34jorton const char *p3;
f82568a780e35e8786958c49a1259434e2088b9cniq int length;
f82568a780e35e8786958c49a1259434e2088b9cniq char sz[32]; /* 32 bytes enough to store 64 bit integer in decimal */
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq apr_status_t rv = APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq switch(ipc->command) {
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case ACOM:
f82568a780e35e8786958c49a1259434e2088b9cniq if(eval->aptr >= &eval->abuf[SED_ABUFSIZE]) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval_errf(eval, SEDERR_TMAMES, eval->lnum);
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->aptr++ = ipc;
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->aptr = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case CCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq eval->delflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq if(!eval->inar[ipc->nrep] || eval->dolflag) {
f82568a780e35e8786958c49a1259434e2088b9cniq for (p1 = ipc->re1; *p1; p1++)
f82568a780e35e8786958c49a1259434e2088b9cniq ;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, ipc->re1, p1 - ipc->re1);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case DCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq eval->delflag++;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case CDCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq while(*p1 != '\n') {
f82568a780e35e8786958c49a1259434e2088b9cniq if(*p1++ == 0) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval->delflag++;
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq p1++;
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_linebuf(eval, p1);
f82568a780e35e8786958c49a1259434e2088b9cniq eval->jflag++;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case EQCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq length = apr_snprintf(sz, sizeof(sz), "%d", (int) eval->lnum);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, sz, length);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case GCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_linebuf(eval, eval->holdbuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case CGCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_linebuf(eval, "\n");
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_linebuf(eval, eval->holdbuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case HCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_holdbuf(eval, eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case CHCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_holdbuf(eval, "\n");
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_holdbuf(eval, eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case ICOM:
f82568a780e35e8786958c49a1259434e2088b9cniq for (p1 = ipc->re1; *p1; p1++);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, ipc->re1, p1 - ipc->re1);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case BCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq eval->jflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case LCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->genbuf[72] = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq while(*p1)
f82568a780e35e8786958c49a1259434e2088b9cniq if((unsigned char)*p1 >= 040) {
f82568a780e35e8786958c49a1259434e2088b9cniq if(*p1 == 0177) {
f82568a780e35e8786958c49a1259434e2088b9cniq p3 = rub;
f82568a780e35e8786958c49a1259434e2088b9cniq while ((*p2++ = *p3++) != 0)
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq p2--;
f82568a780e35e8786958c49a1259434e2088b9cniq p1++;
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if(!isprint(*p1 & 0377)) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2++ = '\\';
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq *p2++ = (*p1 >> 6) + '0';
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq *p2++ = ((*p1 >> 3) & 07) + '0';
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq *p2++ = (*p1++ & 07) + '0';
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2++ = *p1++;
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq p3 = trans[(unsigned char)*p1-1];
f82568a780e35e8786958c49a1259434e2088b9cniq while ((*p2++ = *p3++) != 0)
f82568a780e35e8786958c49a1259434e2088b9cniq if(p2 >= eval->lcomend) {
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = '\\';
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf,
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq strlen(eval->genbuf));
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = eval->genbuf;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq p2--;
f82568a780e35e8786958c49a1259434e2088b9cniq p1++;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq *p2 = 0;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->genbuf, strlen(eval->genbuf));
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case NCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq if(!eval->commands->nflag) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if(eval->aptr > eval->abuf) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = arout(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq eval->lspend = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pending = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case CNCOM:
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if(eval->aptr > eval->abuf) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = arout(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq append_to_linebuf(eval, "\n");
f82568a780e35e8786958c49a1259434e2088b9cniq eval->pending = ipc->next;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case PCOM:
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case CPCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, p1 - eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case QCOM:
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (!eval->commands->nflag) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq break;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if(eval->aptr > eval->abuf) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = arout(eval);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq eval->quitflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case RCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq if(eval->aptr >= &eval->abuf[SED_ABUFSIZE]) {
f82568a780e35e8786958c49a1259434e2088b9cniq eval_errf(eval, SEDERR_TMRMES, eval->lnum);
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->aptr++ = ipc;
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->aptr = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case SCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq i = substitute(eval, ipc, step_vars);
f82568a780e35e8786958c49a1259434e2088b9cniq if (i == -1) {
f82568a780e35e8786958c49a1259434e2088b9cniq return APR_EGENERAL;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if(ipc->pfl && eval->commands->nflag && i) {
f82568a780e35e8786958c49a1259434e2088b9cniq if(ipc->pfl == 1) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, eval->lspend -
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq eval->linebuf);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, eval->linebuf, p1 - eval->linebuf);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq if (i && (ipc->findex >= 0) && eval->fcode[ipc->findex])
f82568a780e35e8786958c49a1259434e2088b9cniq apr_file_printf(eval->fcode[ipc->findex], "%s\n",
f82568a780e35e8786958c49a1259434e2088b9cniq eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case TCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq if(eval->sflag == 0) break;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->sflag = 0;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->jflag = 1;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq case WCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq if (ipc->findex >= 0)
f82568a780e35e8786958c49a1259434e2088b9cniq apr_file_printf(eval->fcode[ipc->findex], "%s\n",
f82568a780e35e8786958c49a1259434e2088b9cniq eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq case XCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_genbuf(eval, eval->linebuf);
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_linebuf(eval, eval->holdbuf);
f82568a780e35e8786958c49a1259434e2088b9cniq copy_to_holdbuf(eval, eval->genbuf);
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim case YCOM:
f82568a780e35e8786958c49a1259434e2088b9cniq p1 = eval->linebuf;
f82568a780e35e8786958c49a1259434e2088b9cniq p2 = ipc->re1;
f82568a780e35e8786958c49a1259434e2088b9cniq while((*p1 = p2[(unsigned char)*p1]) != 0) p1++;
f82568a780e35e8786958c49a1259434e2088b9cniq break;
f82568a780e35e8786958c49a1259434e2088b9cniq }
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * arout
f82568a780e35e8786958c49a1259434e2088b9cniq */
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniqstatic apr_status_t arout(sed_eval_t *eval)
f82568a780e35e8786958c49a1259434e2088b9cniq{
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq apr_status_t rv = APR_SUCCESS;
f82568a780e35e8786958c49a1259434e2088b9cniq eval->aptr = eval->abuf - 1;
f82568a780e35e8786958c49a1259434e2088b9cniq while (*++eval->aptr) {
f82568a780e35e8786958c49a1259434e2088b9cniq if ((*eval->aptr)->command == ACOM) {
f82568a780e35e8786958c49a1259434e2088b9cniq char *p1;
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq for (p1 = (*eval->aptr)->re1; *p1; p1++);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = wline(eval, (*eval->aptr)->re1, p1 - (*eval->aptr)->re1);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq } else {
f82568a780e35e8786958c49a1259434e2088b9cniq apr_file_t *fi = NULL;
f82568a780e35e8786958c49a1259434e2088b9cniq char buf[512];
f82568a780e35e8786958c49a1259434e2088b9cniq apr_size_t n = sizeof(buf);
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq if (apr_file_open(&fi, (*eval->aptr)->re1, APR_READ, 0, eval->pool)
f82568a780e35e8786958c49a1259434e2088b9cniq != APR_SUCCESS)
f82568a780e35e8786958c49a1259434e2088b9cniq continue;
f82568a780e35e8786958c49a1259434e2088b9cniq while ((apr_file_read(fi, buf, &n)) == APR_SUCCESS) {
f82568a780e35e8786958c49a1259434e2088b9cniq if (n == 0)
f82568a780e35e8786958c49a1259434e2088b9cniq break;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = eval->writefn(eval->fout, buf, n);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS) {
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq apr_file_close(fi);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq }
f82568a780e35e8786958c49a1259434e2088b9cniq n = sizeof(buf);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq apr_file_close(fi);
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq }
f82568a780e35e8786958c49a1259434e2088b9cniq eval->aptr = eval->abuf;
f82568a780e35e8786958c49a1259434e2088b9cniq *eval->aptr = NULL;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq
f82568a780e35e8786958c49a1259434e2088b9cniq/*
f82568a780e35e8786958c49a1259434e2088b9cniq * wline
f82568a780e35e8786958c49a1259434e2088b9cniq */
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniqstatic apr_status_t wline(sed_eval_t *eval, char *buf, int sz)
f82568a780e35e8786958c49a1259434e2088b9cniq{
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq apr_status_t rv = APR_SUCCESS;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = eval->writefn(eval->fout, buf, sz);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq if (rv != APR_SUCCESS)
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq rv = eval->writefn(eval->fout, "\n", 1);
0134ffd85f3bcfd84cf0bea0f4b797a885eb78adniq return rv;
f82568a780e35e8786958c49a1259434e2088b9cniq}
f82568a780e35e8786958c49a1259434e2088b9cniq