Remove fmemopen altogether since it just doesn't work.

Closes #9.
This commit is contained in:
jaseg 2018-07-22 18:38:00 +02:00
parent e298c102bd
commit 32c34ab174
7 changed files with 50 additions and 102 deletions

6
.gitmodules vendored
View file

@ -1,6 +0,0 @@
[submodule "musl"]
path = musl
url = git://git.musl-libc.org/musl
[submodule "memorymapping"]
path = memorymapping
url = https://github.com/NimbusKit/memorymapping

View file

@ -1,43 +1,25 @@
CC ?= gcc
LOLCAT_SRC ?= lolcat.c
CENSOR_SRC ?= censor.c
CFLAGS ?= -std=c11 -Wall -g
CFLAGS ?= -std=c11 -Wall -Wextra -g
DESTDIR ?= /usr/local/bin
all: lolcat-static censor-static
all: lolcat censor
include Makefile.musl
ifeq ($(shell uname -s),Darwin)
LOLCAT_SRC += memorymapping/src/fmemopen.c
CENSOR_SRC += memorymapping/src/fmemopen.c
CFLAGS += -Imemorymapping/src
endif
.PHONY: install clean static
static: lolcat-static censor-static
lolcat-static: lolcat.c
gcc -c $(CFLAGS) -I$(MUSLDIR)/include -o lolcat.o $<
gcc -s -nostartfiles -nodefaultlibs -nostdinc -static -ffunction-sections -fdata-sections -Wl,--gc-sections -o $@ lolcat.o $(MUSLDIR)/lib/crt1.o $(MUSLDIR)/lib/libc.a
censor-static: censor.c
gcc -c $(CFLAGS) -I$(MUSLDIR)/include -o censor.o $<
gcc -s -nostartfiles -nodefaultlibs -nostdinc -static -ffunction-sections -fdata-sections -Wl,--gc-sections -o $@ censor.o $(MUSLDIR)/lib/crt1.o $(MUSLDIR)/lib/libc.a
.PHONY: install clean
lolcat: $(LOLCAT_SRC)
gcc $(CFLAGS) -o $@ $^
$(CC) $(CFLAGS) -o $@ $^
censor: $(CENSOR_SRC)
gcc $(CFLAGS) -o $@ $^
$(CC) $(CFLAGS) -o $@ $^
install: lolcat-static censor-static
install lolcat-static $(DESTDIR)/lolcat
install censor-static $(DESTDIR)/censor
install: lolcat censor
install lolcat $(DESTDIR)/lolcat
install censor $(DESTDIR)/censor
clean:
rm -f lolcat lolcat-static.o lolcat-static censor censor-static.o censor-static
# make -C musl clean
rm -f lolcat censor

View file

@ -1,28 +0,0 @@
ifneq (,$(wildcard /usr/local/musl))
MUSLDIR ?= /usr/local/musl
else ifneq (,$(wildcard /usr/lib/musl))
MUSLDIR ?= /usr/lib/musl
else ifneq (,$(wildcard musl/Makefile))
MUSLDIR ?= musl
lolcat-static: musl
censor-static: musl
else
$(info "musl not found. If the build does not go through, consider either installing")
$(info "musl system-wide using your favorite package manager or fetching and building a")
$(info "local copy using:")
$(info "$ git submodule init")
$(info "$ git submodule update")
$(info "$ make musl")
endif
$(info "Using musl at $(MUSLDIR)")
musl/lib/libc.a musl/lib/crt1.o: musl/config.mak
make -C musl
musl/config.mak:
cd musl; ./configure
.PHONY: musl
musl: musl/lib/libc.a musl/lib/crt1.o

View file

@ -28,7 +28,7 @@ $ snap install lolcat-c
### Mac
Build the system-libc version (instead of the statically linked version) with:
Build loclcat with:
```
$ make lolcat
```
@ -40,20 +40,6 @@ $ make lolcat
$ make && sudo make install
```
If this can't find musl and you have it installed somewhere, run
```bash
$ make MUSLDIR=/path/to/musl
```
If you don't have a musl around yet, the easiest way to build is to run
```bash
$ git submodule init
$ git submodule update
$ make
```
This will checkout and build musl in this repository's ```musl``` dir.
## Why?
This `lolcat` clone is an attempt to reduce the world's carbon dioxide emissions by optimizing inefficient code. It's >10x as fast and <0.1% as large as the original one.

View file

@ -13,6 +13,8 @@
* 0. You just DO WHAT THE FUCK YOU WANT TO.
*/
#define _XOPEN_SOURCE
#include <stdint.h>
#include <stdio.h>
#include <wchar.h>
@ -25,13 +27,6 @@
#include <unistd.h>
#include <sys/time.h>
#ifdef __APPLE__
#include "fmemopen.h"
#else // __APPLE__
#define _GNU_SOURCE //for fmemopen
#endif // __APPLE__
static char helpstr[] = "\n"
"Usage: lolcat [-h horizontal_speed] [-v vertical_speed] [--] [FILES...]\n"
"\n"
@ -79,7 +74,8 @@ void version(){
}
int main(int argc, char **argv){
int c, cc=-1, i, l=0;
int cc=-1, i, l=0;
wint_t c;
int colors=1;
double freq_h = 0.23, freq_v = 0.1;
@ -128,20 +124,38 @@ int main(int argc, char **argv){
i=0;
for(char **filename=inputs; filename<inputs_end; filename++){
FILE *f = stdin;
wint_t (*this_file_read_wchar)(FILE *); /* Used for --help because fmemopen is universally broken when used with fgetwc */
FILE *f;
int escape_state = 0;
if(!strcmp(*filename, "--help"))
f = fmemopen(helpstr, strlen(helpstr), "r");
else if(strcmp(*filename, "-"))
f = fopen(*filename, "r");
if(!f){
fprintf(stderr, "Cannot open input file \"%s\": %s\n", *filename, strerror(errno));
return 2;
}
wint_t helpstr_hack(FILE * _ignored) {
(void) _ignored;
static size_t idx = 0;
char c = helpstr[idx++];
if (c)
return c;
idx = 0;
return WEOF;
}
while((c = fgetwc(f)) > 0){
if(!strcmp(*filename, "--help")) {
this_file_read_wchar = &helpstr_hack;
f = 0;
} else if(!strcmp(*filename, "-")) {
this_file_read_wchar = &fgetwc;
f = stdin;
} else {
this_file_read_wchar = &fgetwc;
f = fopen(*filename, "r");
if(!f){
fprintf(stderr, "Cannot open input file \"%s\": %s\n", *filename, strerror(errno));
return 2;
}
}
while((c = this_file_read_wchar(f)) != WEOF) {
if(colors){
find_escape_sequences(c, &escape_state);
@ -165,11 +179,13 @@ int main(int argc, char **argv){
printf("\n\033[0m");
cc = -1;
fclose(f);
if (f) {
fclose(f);
if(c != WEOF && c != 0){
fprintf(stderr, "Error reading input file \"%s\": %s\n", *filename, strerror(errno));
return 2;
if(ferror(f)){
fprintf(stderr, "Error reading input file \"%s\": %s\n", *filename, strerror(errno));
return 2;
}
}
}
}

@ -1 +0,0 @@
Subproject commit 79ce0ddd0de4b11e4944625eb866290368f867c0

1
musl

@ -1 +0,0 @@
Subproject commit fb58545f8d1c5fa32122244caeaf3625c12ddc01