Strongly link tr and sed into system() and popen()

This commit is contained in:
Justine Tunney 2024-11-15 21:19:08 -08:00
parent cafdb456ed
commit 1312f60245
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
9 changed files with 51 additions and 22 deletions

View file

@ -274,6 +274,9 @@ include libc/BUILD.mk #─┘
include libc/sock/BUILD.mk #─┐ include libc/sock/BUILD.mk #─┐
include net/http/BUILD.mk # ├──ONLINE RUNTIME include net/http/BUILD.mk # ├──ONLINE RUNTIME
include third_party/musl/BUILD.mk # │ You can communicate with the network include third_party/musl/BUILD.mk # │ You can communicate with the network
include third_party/regex/BUILD.mk # │
include third_party/tr/BUILD.mk # │
include third_party/sed/BUILD.mk # │
include libc/system/BUILD.mk # │ include libc/system/BUILD.mk # │
include libc/x/BUILD.mk # │ include libc/x/BUILD.mk # │
include dsp/scale/BUILD.mk # │ include dsp/scale/BUILD.mk # │
@ -294,8 +297,7 @@ include third_party/libcxx/BUILD.mk # │
include third_party/openmp/BUILD.mk # │ include third_party/openmp/BUILD.mk # │
include third_party/pcre/BUILD.mk # │ include third_party/pcre/BUILD.mk # │
include third_party/less/BUILD.mk # │ include third_party/less/BUILD.mk # │
include net/https/BUILD.mk # │ include net/https/BUILD.mk #─┘
include third_party/regex/BUILD.mk #─┘
include third_party/tidy/BUILD.mk include third_party/tidy/BUILD.mk
include third_party/BUILD.mk include third_party/BUILD.mk
include third_party/nsync/testing/BUILD.mk include third_party/nsync/testing/BUILD.mk
@ -314,8 +316,6 @@ include third_party/double-conversion/test/BUILD.mk
include third_party/lua/BUILD.mk include third_party/lua/BUILD.mk
include third_party/tree/BUILD.mk include third_party/tree/BUILD.mk
include third_party/zstd/BUILD.mk include third_party/zstd/BUILD.mk
include third_party/tr/BUILD.mk
include third_party/sed/BUILD.mk
include third_party/awk/BUILD.mk include third_party/awk/BUILD.mk
include third_party/hiredis/BUILD.mk include third_party/hiredis/BUILD.mk
include third_party/make/BUILD.mk include third_party/make/BUILD.mk

View file

@ -35,6 +35,8 @@ LIBC_SYSTEM_A_DIRECTDEPS = \
LIBC_STR \ LIBC_STR \
LIBC_SYSV \ LIBC_SYSV \
THIRD_PARTY_MUSL \ THIRD_PARTY_MUSL \
THIRD_PARTY_SED \
THIRD_PARTY_TR \
LIBC_SYSTEM_A_DEPS := \ LIBC_SYSTEM_A_DEPS := \
$(call uniq,$(foreach x,$(LIBC_SYSTEM_A_DIRECTDEPS),$($(x)))) $(call uniq,$(foreach x,$(LIBC_SYSTEM_A_DIRECTDEPS),$($(x))))

View file

@ -743,15 +743,12 @@ static int TryBuiltin(bool wantexec) {
return Usleep(); return Usleep();
if (!strcmp(args[0], "toupper")) if (!strcmp(args[0], "toupper"))
return Toupper(); return Toupper();
if (_weaken(_tr) && !strcmp(args[0], "tr")) { if (!strcmp(args[0], "tr"))
return Fake(_weaken(_tr), wantexec); return Fake(_tr, wantexec);
} if (!strcmp(args[0], "sed"))
if (_weaken(_sed) && !strcmp(args[0], "sed")) { return Fake(_sed, wantexec);
return Fake(_weaken(_sed), wantexec); if (_weaken(_awk) && strcmp(args[0], "awk"))
}
if (_weaken(_awk) && !strcmp(args[0], "awk")) {
return Fake(_weaken(_awk), wantexec); return Fake(_weaken(_awk), wantexec);
}
if (_weaken(_curl) && !strcmp(args[0], "curl")) { if (_weaken(_curl) && !strcmp(args[0], "curl")) {
return Fake(_weaken(_curl), wantexec); return Fake(_weaken(_curl), wantexec);
} }

View file

@ -38,9 +38,7 @@
* provides Bourne-like syntax on all platforms, including Windows. Many * provides Bourne-like syntax on all platforms, including Windows. Many
* builtin commands are included, e.g. exit, cd, rm, [, cat, wait, exec, * builtin commands are included, e.g. exit, cd, rm, [, cat, wait, exec,
* env, echo, read, true, test, kill, touch, rmdir, mkdir, false, mktemp * env, echo, read, true, test, kill, touch, rmdir, mkdir, false, mktemp
* and usleep. It's also possible to __static_yoink() the symbols `_tr`, * sed, tr, and usleep.
* `_sed`, `_awk`, and `_curl` for the tr, sed, awk and curl commands if
* you're using the Cosmopolitan mono-repo.
* *
* If you just have a program name and arguments, and you don't need the * If you just have a program name and arguments, and you don't need the
* full power of a UNIX-like shell, then consider using the Cosmopolitan * full power of a UNIX-like shell, then consider using the Cosmopolitan

View file

@ -3,6 +3,7 @@
#include "libc/calls/typedef/u.h" #include "libc/calls/typedef/u.h"
#include "libc/limits.h" #include "libc/limits.h"
#include "third_party/regex/regex.h" #include "third_party/regex/regex.h"
#include "third_party/sed/shade.h"
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_
/* /*

View file

@ -4,6 +4,7 @@
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#include "third_party/regex/regex.h" #include "third_party/regex/regex.h"
#include "third_party/sed/defs.h" #include "third_party/sed/defs.h"
#include "third_party/sed/shade.h"
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_
extern struct s_command *prog; extern struct s_command *prog;

31
third_party/sed/shade.h vendored Normal file
View file

@ -0,0 +1,31 @@
#ifndef COSMOPOLITAN_THIRD_PARTY_SED_SHADE_H_
#define COSMOPOLITAN_THIRD_PARTY_SED_SHADE_H_
#define prog _sed_prog
#define appends_ _sed_appends_
#define g_match _sed_g_match
#define maxnsub _sed_maxnsub
#define linenum _sed_linenum
#define appendnum _sed_appendnum
#define aflag _sed_aflag
#define eflag _sed_eflag
#define nflag _sed_nflag
#define fname _sed_fname
#define outfname _sed_outfname
#define infile _sed_infile
#define outfile _sed_outfile
#define rflags _sed_rflags
#define cfclose _sed_cfclose
#define compile _sed_compile
#define cspace _sed_cspace
#define cu_fgets _sed_cu_fgets
#define mf_fgets _sed_mf_fgets
#define lastline _sed_lastline
#define process _sed_process
#define resetstate _sed_resetstate
#define strregerror _sed_strregerror
#define xmalloc _sed_xmalloc
#define xrealloc _sed_xrealloc
#define xcalloc _sed_xcalloc
#endif /* COSMOPOLITAN_THIRD_PARTY_SED_SHADE_H_ */

View file

@ -3,6 +3,8 @@
#include "libc/limits.h" #include "libc/limits.h"
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_
#define next _tr_next
typedef struct { typedef struct {
enum { STRING1, STRING2 } which; enum { STRING1, STRING2 } which;
enum { EOS, INFINITE, NORMAL, RANGE, SEQUENCE, SET } state; enum { EOS, INFINITE, NORMAL, RANGE, SEQUENCE, SET } state;

11
third_party/tr/tr.c vendored
View file

@ -42,8 +42,8 @@
#include "third_party/tr/cmd.h" #include "third_party/tr/cmd.h"
#include "third_party/tr/extern.h" #include "third_party/tr/extern.h"
int delete[NCHARS], squeeze[NCHARS]; static int delete[NCHARS], squeeze[NCHARS];
int translate[NCHARS] = { static int translate[NCHARS] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* ASCII */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* ASCII */
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
@ -78,8 +78,8 @@ int translate[NCHARS] = {
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
}; };
STR s1 = { STRING1, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL }; static STR s1 = { STRING1, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL };
STR s2 = { STRING2, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL }; static STR s2 = { STRING2, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL };
static void setup(int *, char *, STR *, int); static void setup(int *, char *, STR *, int);
static void usage(void); static void usage(void);
@ -90,9 +90,6 @@ _tr(int argc, char *argv[])
int ch, cnt, lastch, *p; int ch, cnt, lastch, *p;
int cflag, dflag, sflag; int cflag, dflag, sflag;
if (pledge("stdio", NULL) == -1)
err(1, "pledge");
cflag = dflag = sflag = 0; cflag = dflag = sflag = 0;
while ((ch = getopt(argc, argv, "Ccds")) != -1) while ((ch = getopt(argc, argv, "Ccds")) != -1)
switch(ch) { switch(ch) {