6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
47693af92e50a1ad81825eb01b7157a211269613mx * Copyright (c) 2005, 2008 Sun Microsystems, Inc. All Rights Reserved.
47693af92e50a1ad81825eb01b7157a211269613mx * Use is subject to license terms.
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
47693af92e50a1ad81825eb01b7157a211269613mx * All Rights Reserved
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * University Copyright- Copyright (c) 1982, 1986, 1988
47693af92e50a1ad81825eb01b7157a211269613mx * The Regents of the University of California
47693af92e50a1ad81825eb01b7157a211269613mx * All Rights Reserved
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * University Acknowledgment- Portions of this document are derived from
47693af92e50a1ad81825eb01b7157a211269613mx * software developed by the University of California, Berkeley, and its
47693af92e50a1ad81825eb01b7157a211269613mx * contributors.
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * Licensed under the Apache License, Version 2.0 (the "License");
47693af92e50a1ad81825eb01b7157a211269613mx * you may not use this file except in compliance with the License.
47693af92e50a1ad81825eb01b7157a211269613mx * You may obtain a copy of the License at
47693af92e50a1ad81825eb01b7157a211269613mx * http://www.apache.org/licenses/LICENSE-2.0.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Unless required by applicable law or agreed to in writing, software
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * distributed under the License is distributed on an "AS IS" BASIS,
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
47693af92e50a1ad81825eb01b7157a211269613mx * or implied.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * See the License for the specific language governing permissions and
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * limitations under the License.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China/* Code moved from regexp.h */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "apr.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "apr_lib.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#ifdef APR_HAVE_LIMITS_H
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include <limits.h>
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#endif
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#if APR_HAVE_STDLIB_H
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include <stdlib.h>
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#endif
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "libsed.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "regexp.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "sed.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define GETC() ((unsigned char)*sp++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define PEEKC() ((unsigned char)*sp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define UNGETC(c) (--sp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define SEDCOMPILE_ERROR(c) { \
6f3e57ac9d0b054c3169579f3422080b8ba10105mx regerrno = c; \
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto out; \
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define ecmp(s1, s2, n) (strncmp(s1, s2, n) == 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#define uletter(c) (isalpha(c) || c == '_')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic unsigned char bittab[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int regerr(sed_commands_t *commands, int err);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void comperr(sed_commands_t *commands, char *msg);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void getrnge(char *str, step_vars_storage *vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int _advance(char *, char *, step_vars_storage *);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxextern int sed_step(char *p1, char *p2, int circf, step_vars_storage *vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void comperr(sed_commands_t *commands, char *msg)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx command_errf(commands, msg, commands->linebuf);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx*/
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int regerr(sed_commands_t *commands, int err)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch(err) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 0:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* No error */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 11:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "Range endpoint too large: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 16:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "Bad number: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 25:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "``\\digit'' out of range: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 36:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "Illegal or missing delimiter: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 41:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "No remembered search string: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 42:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "\\( \\) imbalance: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 43:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "Too many \\(: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 44:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "More than 2 numbers given in \\{ \\}: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 45:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "} expected after \\: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 46:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "First number exceeds second in \\{ \\}: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 49:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "[ ] imbalance: %s");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 50:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, SEDERR_TMMES);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx default:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx comperr(commands, "Unknown regexp error code %s\n");
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxchar *sed_compile(sed_commands_t *commands, sed_comp_args *compargs,
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char *ep, char *endbuf, int seof)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int eof = seof;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char *lastep;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int cclcnt;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char bracket[NBRA], *bracketp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int closed;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int neg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int lc;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int i, cflg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int iflag; /* used for non-ascii characters in brackets */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char *sp = commands->cp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int regerrno = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lastep = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c = GETC()) == eof || c == '\n') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == '\n') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx UNGETC(c);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx commands->cp = sp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto out;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx bracketp = bracket;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx compargs->circf = closed = compargs->nbra = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == '^')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx compargs->circf++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx else
6f3e57ac9d0b054c3169579f3422080b8ba10105mx UNGETC(c);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (1) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (ep >= endbuf)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(50);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = GETC();
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c != '*' && ((c != '\\') || (PEEKC() != '{')))
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lastep = ep;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == eof) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CCEOF;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (bracketp != bracket)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(42);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx commands->cp = sp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto out;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (c) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '.':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CDOT;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '\n':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(36);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx commands->cp = sp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto out;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '*':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (lastep == 0 || *lastep == CBRA || *lastep == CKET)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto defchar;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *lastep |= STAR;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '$':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (PEEKC() != eof && PEEKC() != '\n')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto defchar;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CDOL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '[':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (&ep[17] >= endbuf)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(50);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CCL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lc = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx for (i = 0; i < 16; i++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[i] = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx neg = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c = GETC()) == '^') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx neg = 1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = GETC();
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx iflag = 1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c &= 0377;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == '\0' || c == '\n')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(49);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c & 0200) && iflag) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx iflag = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (&ep[32] >= endbuf)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(50);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[-1] = CXCL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx for (i = 16; i < 32; i++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[i] = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == '-' && lc != 0) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c = GETC()) == ']') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx PLACE('-');
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c & 0200) && iflag) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx iflag = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (&ep[32] >= endbuf)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(50);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[-1] = CXCL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx for (i = 16; i < 32; i++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[i] = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (lc < c) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx PLACE(lc);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lc++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lc = c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx PLACE(c);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while ((c = GETC()) != ']');
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (iflag)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx iflag = 16;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx else
6f3e57ac9d0b054c3169579f3422080b8ba10105mx iflag = 32;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (neg) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (iflag == 32) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx for (cclcnt = 0; cclcnt < iflag;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx cclcnt++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[cclcnt] ^= 0377;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[0] &= 0376;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } else {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[-1] = NCCL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* make nulls match so test fails */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep[0] |= 01;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += iflag;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '\\':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (c = GETC()) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '(':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (compargs->nbra >= NBRA)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(43);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *bracketp++ = compargs->nbra;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CBRA;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = compargs->nbra++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case ')':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (bracketp <= bracket)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(42);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CKET;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = *--bracketp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx closed++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '{':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (lastep == (char *) 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto defchar;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *lastep |= RNGE;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx cflg = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nlim:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = GETC();
6f3e57ac9d0b054c3169579f3422080b8ba10105mx i = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ('0' <= c && c <= '9')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx i = 10 * i + c - '0';
6f3e57ac9d0b054c3169579f3422080b8ba10105mx else
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(16);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (((c = GETC()) != '\\') && (c != ','));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (i >= 255)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(11);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = i;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c == ',') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (cflg++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(44);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c = GETC()) == '\\')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = (char) 255;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx else {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx UNGETC(c);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto nlim;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* get 2'nd number */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (GETC() != '}')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(45);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (!cflg) /* one number */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = i;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx else if ((ep[-1] & 0377) < (ep[-2] & 0377))
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(46);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case '\n':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(36);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 'n':
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = '\n';
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto defchar;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx default:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (c >= '1' && c <= '9') {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if ((c -= '1') >= closed)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx SEDCOMPILE_ERROR(25);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CBACK;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Drop through to default to use \ to turn off special chars */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx defchar:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx default:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lastep = ep;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = CCHR;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx *ep++ = c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mxout:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (regerrno) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx regerr(commands, regerrno);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (char*) NULL;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* XXX : Basant : what extra */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* int reglength = (int)(ep - expbuf); */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return ep;
a55f711916b9f7718fabc2d1822bf5719aa6140fMiles Xu, Sun Microsystems}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxint sed_step(char *p1, char *p2, int circf, step_vars_storage *vars)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (circf) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->loc1 = p1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (_advance(p1, p2, vars));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* fast check for first character */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*p2 == CCHR) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = p2[1];
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*p1 != c)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (_advance(p1, p2, vars)) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->loc1 = p1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (1);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (*p1++);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* regular algorithm */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (_advance(p1, p2, vars)) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->loc1 = p1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (1);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (*p1++);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int _advance(char *lp, char *ep, step_vars_storage *vars)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char *curlp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int c;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char *bbeg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char neg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int ct;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int epint; /* int value of *ep */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (1) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx neg = 0;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (*ep++) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCHR:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*ep++ == *lp++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CDOT:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp++)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CDOL:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp == 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCEOF:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->loc2 = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (1);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CXCL:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = (unsigned char)*lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (ISTHERE(c)) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 32;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NCCL:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx neg = 1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCL:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = *lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (((c & 0200) == 0 && ISTHERE(c)) ^ neg) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 16;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CBRA:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx epint = (int) *ep;
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj vars->braslist[epint] = lp;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems ep++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CKET:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx epint = (int) *ep;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->braelist[epint] = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx continue;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCHR | RNGE:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = *ep++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx getrnge(ep, vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->low--)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp++ != c)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->size--)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp++ != c)
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj break;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems if (vars->size < 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 2;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CDOT | RNGE:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx getrnge(ep, vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->low--)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp++ == '\0')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->size--)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (*lp++ == '\0')
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (vars->size < 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 2;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems case CXCL | RNGE:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx getrnge(ep + 32, vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->low--) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = (unsigned char)*lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (!ISTHERE(c))
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->size--) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = (unsigned char)*lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (!ISTHERE(c))
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (vars->size < 0)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 34; /* 32 + 2 */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj case NCCL | RNGE:
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems neg = 1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCL | RNGE:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx getrnge(ep + 16, vars);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->low--) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = *lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (((c & 0200) || !ISTHERE(c)) ^ neg)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (vars->size--) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = *lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (((c & 0200) || !ISTHERE(c)) ^ neg)
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems break;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems }
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems if (vars->size < 0)
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems lp++;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems ep += 18; /* 16 + 2 */
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems goto star;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems case CBACK:
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems epint = (int) *ep;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems bbeg = vars->braslist[epint];
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems ct = vars->braelist[epint] - bbeg;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems ep++;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems if (ecmp(bbeg, lp, ct)) {
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems lp += ct;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems continue;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems }
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems return (0);
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China case CBACK | STAR:
9fa05d92f6b225eb418fb782225c991b887ea8b7Winson Wang - Sun Microsystems - Beijing China epint = (int) *ep;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China bbeg = vars->braslist[epint];
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ct = vars->braelist[epint] - bbeg;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ep++;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China curlp = lp;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China while (ecmp(bbeg, lp, ct))
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China lp += ct;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China while (lp >= curlp) {
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China if (_advance(lp, ep, vars))
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China return (1);
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China lp -= ct;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China }
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China return (0);
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China case CDOT | STAR:
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx while (*lp++);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCHR | STAR:
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj curlp = lp;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems while (*lp++ == *ep);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CXCL | STAR:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = (unsigned char)*lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (ISTHERE(c));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 32;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NCCL | STAR:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx neg = 1;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case CCL | STAR:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx curlp = lp;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx c = *lp++;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (((c & 0200) == 0 && ISTHERE(c)) ^ neg);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ep += 16;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx goto star;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx star:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx do {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (--lp == vars->locs)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx if (_advance(lp, ep, vars))
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (1);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx } while (lp > curlp);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void getrnge(char *str, step_vars_storage *vars)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->low = *str++ & 0377;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx vars->size = ((*str & 0377) == 255)? 20000: (*str &0377) - vars->low;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx