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