1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* GNU SED, a batch stream editor. 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Copyright (C) 1989,90,91,92,93,94,95,98,99,2002,2003,2006,2008,2009 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Free Software Foundation, Inc. 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 5a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This program is free software; you can redistribute it and/or modify 6a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner it under the terms of the GNU General Public License as published by 7a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the Free Software Foundation; either version 3, or (at your option) 8a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner any later version. 9a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 10a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This program is distributed in the hope that it will be useful, 11a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 12a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner GNU General Public License for more details. 14a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 15a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner You should have received a copy of the GNU General Public License 16a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner along with this program; if not, write to the Free Software 17a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 18a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 19a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 20a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "sed.h" 21a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 22a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 23a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 24a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_STRINGS_H 25a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <strings.h> 26a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <string.h> 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /*HAVE_STRINGS_H*/ 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_MEMORY_H 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <memory.h> 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef HAVE_STRCHR 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define strchr index 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define strrchr rindex 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_STDLIB_H 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <stdlib.h> 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_SYS_TYPES_H 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <sys/types.h> 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "getopt.h" 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef BOOTSTRAP 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef HAVE_STDLIB_H 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner extern char *getenv P_((const char *)); 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 52a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 53a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef HAVE_STRTOUL 54a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define ATOI(x) atoi(x) 55a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 56a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define ATOI(x) strtoul(x, NULL, 0) 57a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 58a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 59a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerchar *program_name; 60a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 61a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint extended_regexp_flags = 0; 62a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 63a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* If set, fflush(stdout) on every line output. */ 64a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbool unbuffered_output = false; 65a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 66a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* If set, don't write out the line unless explicitly told to */ 67a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbool no_default_output = false; 68a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 69a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* If set, reset line counts on every new file. */ 70a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbool separate_files = false; 71a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 72a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* If set, follow symlinks when processing in place */ 73a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbool follow_symlinks = false; 74a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 75a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* How do we edit files in-place? (we don't if NULL) */ 76a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerchar *in_place_extension = NULL; 77a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 78a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* The mode to use to read files, either "rt" or "rb". */ 79a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerchar *read_mode = "rt"; 80a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 81a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Do we need to be pedantically POSIX compliant? */ 82a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerenum posixicity_types posixicity; 83a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 84a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* How long should the `l' command's output line be? */ 85a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnercountT lcmd_out_line_len = 70; 86a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 87a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* The complete compiled SED program that we are going to run: */ 88a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic struct vector *the_program = NULL; 89a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 90a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void usage P_((int)); 91a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void 92a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnercontact(errmsg) 93a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int errmsg; 94a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 95a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner FILE *out = errmsg ? stderr : stdout; 96a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef REG_PERL 97a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _("GNU sed home page: <http://www.gnu.org/software/sed/>.\n\ 98a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnerGeneral help using GNU software: <http://www.gnu.org/gethelp/>.\n")); 99a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 100a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 101a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Only print the bug report address for `sed --help', otherwise we'll 102a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner get reports for other people's bugs. */ 103a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (!errmsg) 104a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _("E-mail bug reports to: <%s>.\n\ 105a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnerBe sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n"), 106a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner PACKAGE_BUGREPORT, PACKAGE); 107a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 108a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 109a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void usage P_((int)); 110a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void 111a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerusage(status) 112a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int status; 113a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 114a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner FILE *out = status ? stderr : stdout; 115a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 116a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 117a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PERL_HELP _(" -R, --regexp-perl\n use Perl 5's regular expressions syntax in the script.\n") 118a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 119a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PERL_HELP "" 120a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 121a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 122a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _("\ 123a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnerUsage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n\ 124a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner\n"), myname); 125a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 126a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -n, --quiet, --silent\n\ 127a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner suppress automatic printing of pattern space\n")); 128a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -e script, --expression=script\n\ 129a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner add the script to the commands to be executed\n")); 130a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -f script-file, --file=script-file\n\ 131a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner add the contents of script-file to the commands to be executed\n")); 132a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef ENABLE_FOLLOW_SYMLINKS 133a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" --follow-symlinks\n\ 134a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner follow symlinks when processing in place\n")); 135a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 136a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -i[SUFFIX], --in-place[=SUFFIX]\n\ 137a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner edit files in place (makes backup if extension supplied)\n")); 138a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(MSDOS) || defined(__EMX__) 139a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -b, --binary\n\ 140a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner open files in binary mode (CR+LFs are not processed specially)\n")); 141a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 142a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -l N, --line-length=N\n\ 143a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner specify the desired line-wrap length for the `l' command\n")); 144a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" --posix\n\ 145a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner disable all GNU extensions.\n")); 146a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -r, --regexp-extended\n\ 147a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner use extended regular expressions in the script.\n")); 148a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 149a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, PERL_HELP); 150a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 151a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -s, --separate\n\ 152a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner consider files as separate rather than as a single continuous\n\ 153a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner long stream.\n")); 154a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" -u, --unbuffered\n\ 155a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner load minimal amounts of data from the input files and flush\n\ 156a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the output buffers more often\n")); 157a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" --help display this help and exit\n")); 158a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _(" --version output version information and exit\n")); 159a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(out, _("\n\ 160a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnerIf no -e, --expression, -f, or --file option is given, then the first\n\ 161a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnernon-option argument is taken as the sed script to interpret. All\n\ 162a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerremaining arguments are names of input files; if no input files are\n\ 163a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerspecified, then the standard input is read.\n\ 164a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner\n")); 165a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner contact (status); 166a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 167a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ck_fclose (NULL); 168a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner exit (status); 169a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 170a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 171a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint 172a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnermain(argc, argv) 173a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int argc; 174a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char **argv; 175a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 176a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 177a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define SHORTOPTS "bsnrRuEe:f:l:i::V:" 178a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 179a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define SHORTOPTS "bsnruEe:f:l:i::V:" 180a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 181a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 182a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner static struct option longopts[] = { 183a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"binary", 0, NULL, 'b'}, 184a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"regexp-extended", 0, NULL, 'r'}, 185a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 186a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"regexp-perl", 0, NULL, 'R'}, 187a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 188a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"expression", 1, NULL, 'e'}, 189a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"file", 1, NULL, 'f'}, 190a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"in-place", 2, NULL, 'i'}, 191a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"line-length", 1, NULL, 'l'}, 192a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"quiet", 0, NULL, 'n'}, 193a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"posix", 0, NULL, 'p'}, 194a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"silent", 0, NULL, 'n'}, 195a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"separate", 0, NULL, 's'}, 196a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"unbuffered", 0, NULL, 'u'}, 197a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"version", 0, NULL, 'v'}, 198a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"help", 0, NULL, 'h'}, 199a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef ENABLE_FOLLOW_SYMLINKS 200a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {"follow-symlinks", 0, NULL, 'F'}, 201a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 202a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner {NULL, 0, NULL, 0} 203a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner }; 204a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 205a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int opt; 206a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int return_code; 207a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const char *cols = getenv("COLS"); 208a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 209a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner program_name = argv[0]; 210a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner initialize_main (&argc, &argv); 211a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if HAVE_SETLOCALE 212a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Set locale according to user's wishes. */ 213a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner setlocale (LC_ALL, ""); 214a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 215a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner initialize_mbcs (); 216a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 217a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if ENABLE_NLS 218a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 219a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Tell program which translations to use and where to find. */ 220a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bindtextdomain (PACKAGE, LOCALEDIR); 221a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner textdomain (PACKAGE); 222a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 223a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 224a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (getenv("POSIXLY_CORRECT") != NULL) 225a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner posixicity = POSIXLY_CORRECT; 226a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 227a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner posixicity = POSIXLY_EXTENDED; 228a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 229a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* If environment variable `COLS' is set, use its value for 230a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the baseline setting of `lcmd_out_line_len'. The "-1" 231a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner is to avoid gratuitous auto-line-wrap on ttys. 232a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner */ 233a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (cols) 234a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 235a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner countT t = ATOI(cols); 236a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (t > 1) 237a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner lcmd_out_line_len = t-1; 238a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 239a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 240a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner myname = *argv; 241a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner while ((opt = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != EOF) 242a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 243a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner switch (opt) 244a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 245a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'n': 246a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner no_default_output = true; 247a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 248a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'e': 249a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the_program = compile_string(the_program, optarg, strlen(optarg)); 250a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 251a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'f': 252a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the_program = compile_file(the_program, optarg); 253a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 254a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 255a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'F': 256a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner follow_symlinks = true; 257a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 258a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 259a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'i': 260a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner separate_files = true; 261a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (optarg == NULL) 262a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* use no backups */ 263a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner in_place_extension = ck_strdup ("*"); 264a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 265a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (strchr(optarg, '*') != NULL) 266a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner in_place_extension = ck_strdup(optarg); 267a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 268a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 269a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 270a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner in_place_extension = MALLOC (strlen(optarg) + 2, char); 271a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner in_place_extension[0] = '*'; 272a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner strcpy (in_place_extension + 1, optarg); 273a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 274a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 275a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 276a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 277a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'l': 278a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner lcmd_out_line_len = ATOI(optarg); 279a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 280a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 281a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'p': 282a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner posixicity = POSIXLY_BASIC; 283a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 284a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 285a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'b': 286a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner read_mode = "rb"; 287a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 288a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 289a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Undocumented, for compatibility with BSD sed. */ 290a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'E': 291a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'r': 292a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (extended_regexp_flags) 293a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner usage(4); 294a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner extended_regexp_flags = REG_EXTENDED; 295a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 296a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 297a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 298a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'R': 299a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (extended_regexp_flags) 300a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner usage(4); 301a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner extended_regexp_flags = REG_PERL; 302a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 303a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 304a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 305a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 's': 306a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner separate_files = true; 307a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 308a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 309a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'u': 310a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unbuffered_output = true; 311a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 312a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 313a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'v': 314a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef REG_PERL 315a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(stdout, _("super-sed version %s\n"), VERSION); 316a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(stdout, _("based on GNU sed version %s\n\n"), SED_FEATURE_VERSION); 317a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 318a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(stdout, _("GNU sed version %s\n"), VERSION); 319a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 320a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf(stdout, _("Copyright (C) %d Free Software Foundation, Inc.\n\ 321a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' TurnerThis is free software; see the source for copying conditions. There is NO\n\ 322a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\ 323a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerto the extent permitted by law.\n\ 324a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner"), COPYRIGHT_YEAR); 325a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fputc('\n', stdout); 326a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner contact(false); 327a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 328a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ck_fclose (NULL); 329a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner exit (0); 330a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'h': 331a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner usage(0); 332a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner default: 333a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner usage(4); 334a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 335a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 336a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 337a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (!the_program) 338a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 339a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (optind < argc) 340a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 341a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char *arg = argv[optind++]; 342a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the_program = compile_string(the_program, arg, strlen(arg)); 343a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 344a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 345a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner usage(4); 346a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 347a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner check_final_program(the_program); 348a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 349a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return_code = process_files(the_program, argv+optind); 350a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 351a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner finish_program(the_program); 352a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ck_fclose(NULL); 353a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 354a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return return_code; 355a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 356