ed.h revision 1057
1139826Simp/* ed.h: type and constant definitions for the ed editor. */ 253541Sshin/* 353541Sshin * Copyright (c) 1993 Andrew Moore 453541Sshin * All rights reserved. 553541Sshin * 653541Sshin * Redistribution and use in source and binary forms, with or without 753541Sshin * modification, are permitted provided that the following conditions 853541Sshin * are met: 953541Sshin * 1. Redistributions of source code must retain the above copyright 1053541Sshin * notice, this list of conditions and the following disclaimer. 1153541Sshin * 2. Redistributions in binary form must reproduce the above copyright 1253541Sshin * notice, this list of conditions and the following disclaimer in the 1353541Sshin * documentation and/or other materials provided with the distribution. 1453541Sshin * 1553541Sshin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1653541Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1753541Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1853541Sshin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 1953541Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2053541Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2153541Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2253541Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2353541Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2453541Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2553541Sshin * SUCH DAMAGE. 2653541Sshin * 2753541Sshin * @(#)$Id: ed.h,v 1.4 1993/12/15 15:22:02 alm Exp alm $ 28174510Sobrien */ 29174510Sobrien 30174510Sobrien#if defined(BSD) && BSD >= 199103 || defined(__386BSD__) 3153541Sshin# include <sys/param.h> /* for MAXPATHLEN */ 3253541Sshin#endif 3353541Sshin#include <errno.h> 3462587Sitojun#ifdef sun 3553541Sshin# include <limits.h> 3662587Sitojun#endif 3762587Sitojun#include <regex.h> 3862587Sitojun#include <signal.h> 3962587Sitojun#include <stdio.h> 4062587Sitojun#include <stdlib.h> 4153541Sshin#include <string.h> 4278064Sume#include <unistd.h> 4353541Sshin 44186119Sqingli#define ERR (-2) 45151539Ssuz#define EMOD (-3) 4662587Sitojun#define FATAL (-4) 4778064Sume 4878064Sume#ifndef MAXPATHLEN 4978064Sume# define MAXPATHLEN 255 /* _POSIX_PATH_MAX */ 5078064Sume#endif 5178064Sume 5278064Sume#define MINBUFSZ 512 /* minimum buffer size - must be > 0 */ 5378064Sume#define SE_MAX 30 /* max subexpressions in a regular expression */ 5478064Sume#ifdef INT_MAX 5562587Sitojun# define LINECHARS INT_MAX /* max chars per line */ 5662587Sitojun#else 5762587Sitojun# define LINECHARS MAXINT /* max chars per line */ 5862587Sitojun#endif 5962587Sitojun 6053541Sshin/* gflags */ 6162587Sitojun#define GLB 001 /* global command */ 62186119Sqingli#define GPR 002 /* print after command */ 6362587Sitojun#define GLS 004 /* list after command */ 6453541Sshin#define GNP 010 /* enumerate after command */ 6562587Sitojun#define GSG 020 /* global substitute */ 6662587Sitojun 6762587Sitojuntypedef regex_t pattern_t; 6862587Sitojun 6962587Sitojun/* Line node */ 7062587Sitojuntypedef struct line { 7162587Sitojun struct line *q_forw; 7262587Sitojun struct line *q_back; 73121161Sume off_t seek; /* address of line in scratch buffer */ 7495023Ssuz int len; /* length of line */ 7578064Sume} line_t; 7678064Sume 7778064Sume 7853541Sshintypedef struct undo { 7953541Sshin 8062587Sitojun/* type of undo nodes */ 81118498Sume#define UADD 0 82238273Shrs#define UDEL 1 83151474Ssuz#define UMOV 2 84151474Ssuz#define VMOV 3 85151474Ssuz 86151539Ssuz int type; /* command type */ 87197138Shrs line_t *h; /* head of list */ 88222728Shrs line_t *t; /* tail of list */ 89245230Sume} undo_t; 90282805Shrs 9162587Sitojun#ifndef max 92121161Sume# define max(a,b) ((a) > (b) ? (a) : (b)) 93121161Sume#endif 94121161Sume#ifndef min 95121161Sume# define min(a,b) ((a) < (b) ? (a) : (b)) 96121161Sume#endif 97121161Sume 98121161Sume#define INC_MOD(l, k) ((l) + 1 > (k) ? 0 : (l) + 1) 99121161Sume#define DEC_MOD(l, k) ((l) - 1 < 0 ? (k) : (l) - 1) 100121161Sume 101121161Sume/* SPL1: disable some interrupts (requires reliable signals) */ 10253541Sshin#define SPL1() mutex++ 10362587Sitojun 10462587Sitojun/* SPL0: enable all interrupts; check sigflags (requires reliable signals) */ 10553541Sshin#define SPL0() \ 10653541Sshinif (--mutex == 0) { \ 10753541Sshin if (sigflags & (1 << (SIGHUP - 1))) handle_hup(SIGHUP); \ 10853541Sshin if (sigflags & (1 << (SIGINT - 1))) handle_int(SIGINT); \ 10953541Sshin} 11053541Sshin 11162587Sitojun/* STRTOL: convert a string to long */ 11262587Sitojun#define STRTOL(i, p) { \ 11353541Sshin if (((i = strtol(p, &p, 10)) == LONG_MIN || i == LONG_MAX) && \ 11462587Sitojun errno == ERANGE) { \ 11553541Sshin sprintf(errmsg, "number out of range"); \ 11653541Sshin i = 0; \ 11753541Sshin return ERR; \ 11853541Sshin } \ 11953541Sshin} 12062587Sitojun 12153541Sshin#if defined(sun) || defined(NO_REALLOC_NULL) 12253541Sshin/* REALLOC: assure at least a minimum size for buffer b */ 12353541Sshin#define REALLOC(b,n,i,err) \ 12478064Sumeif ((i) > (n)) { \ 12578064Sume int ti = (n); \ 12678064Sume char *ts; \ 12778064Sume SPL1(); \ 12878064Sume if ((b) != NULL) { \ 12978064Sume if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \ 13081369Ssimokawa fprintf(stderr, "%s\n", strerror(errno)); \ 13178064Sume sprintf(errmsg, "out of memory"); \ 132121472Sume SPL0(); \ 133121472Sume return err; \ 134121472Sume } \ 135121472Sume } else { \ 136121472Sume if ((ts = (char *) malloc(ti += max((i), MINBUFSZ))) == NULL) { \ 137121472Sume fprintf(stderr, "%s\n", strerror(errno)); \ 138121472Sume sprintf(errmsg, "out of memory"); \ 139121472Sume SPL0(); \ 140121472Sume return err; \ 141121472Sume } \ 142121472Sume } \ 143121472Sume (n) = ti; \ 144121472Sume (b) = ts; \ 145121472Sume SPL0(); \ 146121472Sume} 147121472Sume#else /* NO_REALLOC_NULL */ 148121472Sume/* REALLOC: assure at least a minimum size for buffer b */ 149121472Sume#define REALLOC(b,n,i,err) \ 15053541Sshinif ((i) > (n)) { \ 15162587Sitojun int ti = (n); \ 15253541Sshin char *ts; \ 15353541Sshin SPL1(); \ 15462587Sitojun if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \ 15553541Sshin fprintf(stderr, "%s\n", strerror(errno)); \ 15662587Sitojun sprintf(errmsg, "out of memory"); \ 15795023Ssuz SPL0(); \ 15895023Ssuz return err; \ 15995023Ssuz } \ 16062587Sitojun (n) = ti; \ 16162587Sitojun (b) = ts; \ 16253541Sshin SPL0(); \ 16353541Sshin} 16453541Sshin#endif /* NO_REALLOC_NULL */ 16553541Sshin 16678064Sume/* REQUE: link pred before succ */ 16778064Sume#define REQUE(pred, succ) (pred)->q_forw = (succ), (succ)->q_back = (pred) 16878064Sume 16978064Sume#ifdef NEED_INSQUE 17078064Sume/* insque: insert elem in circular queue after pred */ 171121472Sume#define insque(elem, pred) \ 172121472Sume{ \ 173121472Sume REQUE((elem), (pred)->q_forw); \ 17478064Sume REQUE((pred), elem); \ 17578064Sume} 17678064Sume 17778064Sume/* remque: remove_lines elem from circular queue */ 17878064Sume#define remque(elem) REQUE((elem)->q_back, (elem)->q_forw); 17981369Ssimokawa#endif /* NEED_INSQUE */ 18078064Sume 18178064Sume/* NUL_TO_NEWLINE: overwrite ASCII NULs with newlines */ 18278064Sume#define NUL_TO_NEWLINE(s, l) translit_text(s, l, '\0', '\n') 18378064Sume 18478064Sume/* NEWLINE_TO_NUL: overwrite newlines with ASCII NULs */ 18578064Sume#define NEWLINE_TO_NUL(s, l) translit_text(s, l, '\n', '\0') 18678064Sume 18778064Sume#ifndef strerror 18878064Sume# define strerror(n) sys_errlist[n] 18978064Sume#endif 19078064Sume 19178064Sume#ifndef __P 19278064Sume# ifndef __STDC__ 19378064Sume# define __P(proto) () 19478064Sume# else 19578064Sume# define __P(proto) proto 19678064Sume# endif 19778064Sume#endif 19853541Sshin 19962587Sitojun/* Local Function Declarations */ 20062587Sitojunvoid add_line_node __P((line_t *)); 20153541Sshinint append_lines __P((long)); 20253541Sshinint apply_subst_template __P((char *, regmatch_t *, int, int)); 20362587Sitojunint build_active_list __P((int)); 20462587Sitojunint cbc_decode __P((char *, FILE *)); 20562587Sitojunint cbc_encode __P((char *, int, FILE *)); 20662587Sitojunint check_addr_range __P((long, long)); 20762587Sitojunvoid clear_active_list __P((void)); 20878064Sumevoid clear_undo_stack __P((void)); 20978064Sumeint close_sbuf __P((void)); 21078064Sumeint copy_lines __P((long)); 21162587Sitojunint delete_lines __P((long, long)); 21253541Sshinvoid des_error __P((char *)); 21395023Ssuzint display_lines __P((long, long, int)); 21495023Ssuzline_t *dup_line_node __P((line_t *)); 21562587Sitojunint exec_command __P((void)); 21653541Sshinlong exec_global __P((int, int)); 21762587Sitojunvoid expand_des_key __P((char *, char *)); 21853541Sshinint extract_addr_range __P((void)); 21953541Sshinchar *extract_pattern __P((int)); 22053541Sshinint extract_subst_tail __P((int *, int *)); 22162587Sitojunchar *extract_subst_template __P((void)); 22262587Sitojunint filter_lines __P((long, long, char *)); 22362587Sitojunint flush_des_file __P((FILE *)); 22462587Sitojunline_t *get_addressed_line_node __P((long)); 22562587Sitojunpattern_t *get_compiled_pattern __P((void)); 22678064Sumeint get_des_char __P((FILE *)); 22778064Sumechar *get_extended_line __P((int *, int)); 22878064Sumechar *get_filename __P((void)); 22978064Sumeint get_keyword __P((void)); 23062587Sitojunlong get_line_node_addr __P((line_t *)); 231121807Sumelong get_matching_node_addr __P((pattern_t *, int)); 23253541Sshinlong get_marked_node_addr __P((int)); 23353541Sshinchar *get_sbuf_line __P((line_t *)); 23462587Sitojunint get_shell_command __P((void)); 235295583Smarkjint get_stream_line __P((FILE *)); 23662587Sitojunint get_tty_line __P((void)); 237295583Smarkjvoid handle_hup __P((int)); 238295583Smarkjvoid handle_int __P((int)); 23953541Sshinvoid handle_winch __P((int)); 24053541Sshinint has_trailing_escape __P((char *, char *)); 241295583Smarkjint hex_to_binary __P((int, int)); 242151539Ssuzvoid init_buffers __P((void)); 243296063Smarkjvoid init_des_cipher __P((void)); 24453541Sshinint is_legal_filename __P((char *)); 24553541Sshinint join_lines __P((long, long)); 246151539Ssuzint mark_line_node __P((line_t *, int)); 247151539Ssuzint move_lines __P((long)); 248151539Ssuzline_t *next_active_node __P(()); 249151539Ssuzlong next_addr __P((void)); 250151539Ssuzint open_sbuf __P((void)); 251151539Ssuzchar *parse_char_class __P((char *)); 252151539Ssuzint pop_undo_stack __P((void)); 253151539Ssuzundo_t *push_undo_stack __P((int, long, long)); 254151539Ssuzint put_des_char __P((int, FILE *)); 255151539Ssuzchar *put_sbuf_line __P((char *)); 256151539Ssuzint put_stream_line __P((FILE *, char *, int)); 257151539Ssuzint put_tty_line __P((char *, int, long, int)); 258151539Ssuzvoid quit __P((int)); 259151539Ssuzlong read_file __P((char *, long)); 26053541Sshinlong read_stream __P((FILE *, long)); 26162587Sitojunint search_and_replace __P((pattern_t *, int, int)); 26260938Sjakeint set_active_node __P((line_t *)); 26362587Sitojunvoid set_des_key __P((char *)); 26462587Sitojunvoid signal_hup __P((int)); 265151539Ssuzvoid signal_int __P((int)); 26662587Sitojunchar *strip_escapes __P((char *)); 26762587Sitojunint substitute_matching_text __P((pattern_t *, line_t *, int, int)); 268151539Ssuzchar *translit_text __P((char *, int, int, int)); 26962587Sitojunvoid unmark_line_node __P((line_t *)); 27062587Sitojunvoid unset_active_nodes __P((line_t *, line_t *)); 271151539Ssuzlong write_file __P((char *, char *, long, long)); 272151539Ssuzlong write_stream __P((FILE *, long, long)); 27362587Sitojun 27478064Sume/* global buffers */ 27553541Sshinextern char stdinbuf[]; 27660938Sjakeextern char *ibuf; 27753541Sshinextern char *ibufp; 27878064Sumeextern int ibufsz; 27953541Sshin 28053541Sshin/* global flags */ 28162587Sitojunextern int isbinary; 28262587Sitojunextern int isglobal; 28362587Sitojunextern int modified; 284151539Ssuzextern int mutex; 28553541Sshinextern int sigflags; 28653541Sshin 28753541Sshin/* global vars */ 28853541Sshinextern long addr_last; 28953541Sshinextern long current_addr; 29053541Sshinextern char errmsg[]; 29153541Sshinextern long first_addr; 29272093Sasmodaiextern int lineno; 29353541Sshinextern long second_addr; 29462587Sitojun#ifdef sun 29553541Sshinextern char *sys_errlist[]; 29653541Sshin#endif 29753541Sshin