Home | History | Annotate | Line # | Download | only in sed
defs.h revision 1.1.1.2
      1 /*-
      2  * Copyright (c) 1992 Diomidis Spinellis.
      3  * Copyright (c) 1992, 1993
      4  *	The Regents of the University of California.  All rights reserved.
      5  *
      6  * This code is derived from software contributed to Berkeley by
      7  * Diomidis Spinellis of Imperial College, University of London.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  *
     33  *	@(#)defs.h	8.1 (Berkeley) 6/6/93
     34  * $FreeBSD: head/usr.bin/sed/defs.h 192732 2009-05-25 06:45:33Z brian $
     35  */
     36 
     37 /*
     38  * Types of address specifications
     39  */
     40 enum e_atype {
     41 	AT_RE	    = 1,			/* Line that match RE */
     42 	AT_LINE,				/* Specific line */
     43 	AT_RELLINE,				/* Relative line */
     44 	AT_LAST,				/* Last line */
     45 };
     46 
     47 /*
     48  * Format of an address
     49  */
     50 struct s_addr {
     51 	enum e_atype type;			/* Address type */
     52 	union {
     53 		u_long l;			/* Line number */
     54 		regex_t *r;			/* Regular expression */
     55 	} u;
     56 };
     57 
     58 /*
     59  * Substitution command
     60  */
     61 struct s_subst {
     62 	int n;					/* Occurrence to subst. */
     63 	int p;					/* True if p flag */
     64 	int icase;				/* True if I flag */
     65 	char *wfile;				/* NULL if no wfile */
     66 	int wfd;				/* Cached file descriptor */
     67 	regex_t *re;				/* Regular expression */
     68 	unsigned int maxbref;			/* Largest backreference. */
     69 	u_long linenum;				/* Line number. */
     70 	char *new;				/* Replacement text */
     71 };
     72 
     73 /*
     74  * Translate command.
     75  */
     76 struct s_tr {
     77 	unsigned char bytetab[256];
     78 	struct trmulti {
     79 		size_t fromlen;
     80 		char from[MB_LEN_MAX];
     81 		size_t tolen;
     82 		char to[MB_LEN_MAX];
     83 	} *multis;
     84 	int nmultis;
     85 };
     86 
     87 /*
     88  * An internally compiled command.
     89  * Initialy, label references are stored in t, on a second pass they
     90  * are updated to pointers.
     91  */
     92 struct s_command {
     93 	struct s_command *next;			/* Pointer to next command */
     94 	struct s_addr *a1, *a2;			/* Start and end address */
     95 	u_long startline;			/* Start line number or zero */
     96 	char *t;				/* Text for : a c i r w */
     97 	union {
     98 		struct s_command *c;		/* Command(s) for b t { */
     99 		struct s_subst *s;		/* Substitute command */
    100 		struct s_tr *y;			/* Replace command array */
    101 		int fd;				/* File descriptor for w */
    102 	} u;
    103 	char code;				/* Command code */
    104 	u_int nonsel:1;				/* True if ! */
    105 };
    106 
    107 /*
    108  * Types of command arguments recognised by the parser
    109  */
    110 enum e_args {
    111 	EMPTY,			/* d D g G h H l n N p P q x = \0 */
    112 	TEXT,			/* a c i */
    113 	NONSEL,			/* ! */
    114 	GROUP,			/* { */
    115 	ENDGROUP,		/* } */
    116 	COMMENT,		/* # */
    117 	BRANCH,			/* b t */
    118 	LABEL,			/* : */
    119 	RFILE,			/* r */
    120 	WFILE,			/* w */
    121 	SUBST,			/* s */
    122 	TR			/* y */
    123 };
    124 
    125 /*
    126  * Structure containing things to append before a line is read
    127  */
    128 struct s_appends {
    129 	enum {AP_STRING, AP_FILE} type;
    130 	char *s;
    131 	size_t len;
    132 };
    133 
    134 enum e_spflag {
    135 	APPEND,					/* Append to the contents. */
    136 	REPLACE,				/* Replace the contents. */
    137 };
    138 
    139 /*
    140  * Structure for a space (process, hold, otherwise).
    141  */
    142 typedef struct {
    143 	char *space;		/* Current space pointer. */
    144 	size_t len;		/* Current length. */
    145 	int deleted;		/* If deleted. */
    146 	char *back;		/* Backing memory. */
    147 	size_t blen;		/* Backing memory length. */
    148 } SPACE;
    149