rebrand to 90s

This commit is contained in:
Night Kaly 2024-07-01 17:40:47 +01:00
parent 253ec734f0
commit e4e118046c
Signed by: night0721
GPG key ID: 957D67B8DB7A119B
16 changed files with 83 additions and 80 deletions

2
.gitignore vendored
View file

@ -1,3 +1,3 @@
rush 90s
*.o *.o
*.tar.gz *.tar.gz

10
90s.1 Normal file
View file

@ -0,0 +1,10 @@
.TH 90s 1 90s\-VERSION
.SH NAME
90s \- the 90s shell
.SH SYNOPSIS
.B 90s
.SH DESCRIPTION
90s is a shell that is heavily customized, minimalistic, simple but with several features. That includes simple syntax highlighting for showing validity of commands with history search and support of environment varaibles.
.SH AUTHOR
Made by Night Kaly
.B <night@night0721.xyz>

View file

@ -1,42 +1,45 @@
CC=gcc .POSIX:
.SUFFIXES:
CC = cc
VERSION = 1.0 VERSION = 1.0
PREFIX = /usr/local TARGET = 90s
MANPREFIX = ${PREFIX}/share/man MANPAGE = $(TARGET).1
PREFIX ?= /usr/local
BINDIR = $(PREFIX)/bin
MANDIR = $(PREFIX)/share/man/man1
CFLAGS = -std=gnu11 -O0 -Wall -DVERSION=\"${VERSION}\" # Flags
CFLAGS = -O3 -march=native -mtune=native -pipe -s -flto -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DVERSION=$(VERSION)
SRC = rush.c color.c constants.h history.c commands.c job.c SRC = src/*.c
OBJ = ${SRC:.c=.o} INCLUDE = include
.c.o: $(TARGET): $(SRC)
${CC} -c ${CFLAGS} $< $(CC) $(SRC) -o $@ $(CFLAGS) -I$(INCLUDE)
rush: ${OBJ}
${CC} -o $@ ${OBJ}
strip rush
clean:
rm -rf rush
dist: dist:
mkdir -p rush-${VERSION} mkdir -p $(TARGET)-$(VERSION)
cp -R LICENSE README.md rush.1 rush rush-${VERSION} cp -R README.md $(MANPAGE) $(TARGET) $(TARGET)-$(VERSION)
tar -cf rush-${VERSION}.tar rush-${VERSION} tar -cf $(TARGET)-$(VERSION).tar $(TARGET)-$(VERSION)
gzip rush-${VERSION}.tar gzip $(TARGET)-$(VERSION).tar
rm -rf rush-${VERSION} rm -rf $(TARGET)-$(VERSION)
install: all install: $(TARGET)
mkdir -p ${DESTDIR}${PREFIX}/bin mkdir -p $(DESTDIR)$(BINDIR)
cp -f rush ${DESTDIR}${PREFIX}/bin mkdir -p $(DESTDIR)$(MANDIR)
chmod 755 ${DESTDIR}${PREFIX}/bin/rush cp -p $(TARGET) $(DESTDIR)$(BINDIR)/$(TARGET)
mkdir -p ${DESTDIR}${MANPREFIX}/man1 chmod 755 $(DESTDIR)$(BINDIR)/$(TARGET)
sed "s/VERSION/${VERSION}/g" < rush.1 > ${DESTDIR}${MANPREFIX}/man1/rush.1 cp -p $(MANPAGE) $(DESTDIR)$(MANDIR)/$(MANPAGE)
chmod 644 ${DESTDIR}${MANPREFIX}/man1/rush.1 chmod 644 $(DESTDIR)$(MANDIR)/$(MANPAGE)
uninstall: uninstall:
rm -f ${DESTDIR}${PREFIX}/bin/rush\ $(RM) $(DESTDIR)$(BINDIR)/$(TARGET)
${DESTDIR}${MANPREFIX}/man1/rush.1 $(RM) $(DESTDIR)$(MANDIR)/$(MANPAGE)
all: rush
.PHONY: all clean dist install uninstall rush clean:
$(RM) $(TARGET)
all: $(TARGET)
.PHONY: all dist install uninstall clean

View file

@ -1,4 +1,4 @@
# rush # 90s
Minimalist, customizable shell with syntax highlighting. Minimalist, customizable shell with syntax highlighting.
* Disclaimer: This project is for me to learn to write Unix syscalls, code might be inefficient, feel free to point out the mistakes and open a issue for that! * Disclaimer: This project is for me to learn to write Unix syscalls, code might be inefficient, feel free to point out the mistakes and open a issue for that!
@ -37,7 +37,7 @@ Minimalist, customizable shell with syntax highlighting.
# Usage # Usage
```sh ```sh
$ ./rush $ ./90s
# > to redirect stdout # > to redirect stdout
# < to redirect stdin # < to redirect stdin
@ -66,7 +66,7 @@ $ make
Contributions are welcomed, feel free to open a pull request. Contributions are welcomed, feel free to open a pull request.
# License # License
This project is licensed under the GNU Public License v3.0. See [LICENSE](https://github.com/night0721/rush/blob/master/LICENSE) for more information. This project is licensed under the GNU Public License v3.0. See [LICENSE](https://github.com/night0721/90s/blob/master/LICENSE) for more information.
# Credits # Credits
- [Tutorial - Write a shell in C](https://brennan.io/2015/01/16/write-a-shell-in-c/) - [Tutorial - Write a shell in C](https://brennan.io/2015/01/16/write-a-shell-in-c/)

View file

@ -1,7 +1,7 @@
#ifndef CONSTANTS_H_ #ifndef CONSTANTS_H_
#define CONSTANTS_H_ #define CONSTANTS_H_
#define HISTFILE ".rush_history" // history file name #define HISTFILE ".90s_history" // history file name
#define TOK_BUFSIZE 64 // buffer size of each token #define TOK_BUFSIZE 64 // buffer size of each token
#define RL_BUFSIZE 1024 // size of each command #define RL_BUFSIZE 1024 // size of each command
#define TOK_DELIM " \t\r\n\a" // delimiter for token #define TOK_DELIM " \t\r\n\a" // delimiter for token

10
rush.1
View file

@ -1,10 +0,0 @@
.TH rush 1 rush\-VERSION
.SH NAME
rush \- the rush shell
.SH SYNOPSIS
.B rush
.SH DESCRIPTION
rush is a shell that is heavily customized, minimalistic, simple but with several features. That includes simple syntax highlighting for showing validity of commands with history search and support of environment varaibles.
.SH AUTHOR
Made by Night Kaly
.B <night@night0721.xyz>

View file

@ -17,7 +17,7 @@
void *memalloc(size_t size) { void *memalloc(size_t size) {
void *ptr = malloc(size); void *ptr = malloc(size);
if (!ptr) { if (!ptr) {
fputs("rush: Error allocating memory\n", stderr); fputs("90s: Error allocating memory\n", stderr);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return ptr; return ptr;
@ -38,7 +38,7 @@ void change_terminal_attribute(int option) {
char **setup_path_variable() { char **setup_path_variable() {
char *envpath = getenv("PATH"); char *envpath = getenv("PATH");
if (envpath == NULL) { if (envpath == NULL) {
fprintf(stderr, "rush: PATH environment variable is missing\n"); fprintf(stderr, "90s: PATH environment variable is missing\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
char *path_cpy = memalloc(sizeof(char) * (strlen(envpath) + 1)); char *path_cpy = memalloc(sizeof(char) * (strlen(envpath) + 1));
@ -178,7 +178,7 @@ char *readline(char **paths) {
if (last_command_len > replace_len) { if (last_command_len > replace_len) {
buffer = realloc(buffer, buffer_len + last_command_len - replace_len + 1); buffer = realloc(buffer, buffer_len + last_command_len - replace_len + 1);
if (!buffer) { if (!buffer) {
fprintf(stderr, "rush: Error allocating memory\n"); fprintf(stderr, "90s: Error allocating memory\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
@ -335,7 +335,7 @@ char *readline(char **paths) {
bufsize += RL_BUFSIZE; bufsize += RL_BUFSIZE;
buffer = realloc(buffer, bufsize); buffer = realloc(buffer, bufsize);
if (!buffer) { if (!buffer) {
fprintf(stderr, "rush: Error allocating memory\n"); fprintf(stderr, "90s: Error allocating memory\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
@ -357,7 +357,7 @@ char **argsplit(char *line) {
bufsize += TOK_BUFSIZE; bufsize += TOK_BUFSIZE;
tokens = realloc(tokens, bufsize * sizeof(char*)); tokens = realloc(tokens, bufsize * sizeof(char*));
if (!tokens) { if (!tokens) {
fprintf(stderr, "rush: Error allocating memory\n"); fprintf(stderr, "90s: Error allocating memory\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }

View file

@ -2,13 +2,13 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "rush.h" #include "90s.h"
// color str in place // color str in place
char *color_text(char *str, const char *color) { char *color_text(char *str, const char *color) {
int size = snprintf(NULL, 0, "\x1b[38;2;%sm%s\x1b[0m", color, str) + 1; // calculate size that is needed for colored string int size = snprintf(NULL, 0, "\x1b[38;2;%sm%s\x1b[0m", color, str) + 1; // calculate size that is needed for colored string
if (size < 0) { if (size < 0) {
fprintf(stderr, "rush: snprintf failed\n"); fprintf(stderr, "90s: snprintf failed\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
char *buf = memalloc(size); char *buf = memalloc(size);

View file

@ -8,7 +8,7 @@
#include "constants.h" #include "constants.h"
#include "history.h" #include "history.h"
#include "rush.h" #include "90s.h"
#include "job.h" #include "job.h"
int execute(char **args); int execute(char **args);
@ -47,13 +47,13 @@ int (*builtin_func[]) (char **) = {
}; };
char *shortcut_dirs[] = { char *shortcut_dirs[] = {
"rush", "90s",
"bin", "bin",
"localbin", "localbin",
}; };
char *shortcut_expand_dirs[] = { char *shortcut_expand_dirs[] = {
"~/.nky/Coding/C/rush", "~/.nky/Coding/C/90s",
"~/.local/bin", "~/.local/bin",
"/usr/local/bin", "/usr/local/bin",
}; };
@ -125,7 +125,7 @@ int num_builtins() {
// autojump // autojump
int j(char **args) { int j(char **args) {
if (args[1] == NULL) { if (args[1] == NULL) {
fprintf(stderr, "rush: not enough arguments\n"); fprintf(stderr, "90s: not enough arguments\n");
return -1; return -1;
} }
for (int i = 0; i < sizeof(shortcut_dirs) / sizeof(char *); i++) { for (int i = 0; i < sizeof(shortcut_dirs) / sizeof(char *); i++) {
@ -149,7 +149,7 @@ int cd(char **args) {
if (args[1] == NULL) { if (args[1] == NULL) {
char *home = gethome(); char *home = gethome();
if (chdir(home) != 0) { if (chdir(home) != 0) {
perror("rush"); perror("90s");
} }
} else { } else {
while (args[1][i] != '\0') { while (args[1][i] != '\0') {
@ -160,7 +160,7 @@ int cd(char **args) {
i++; i++;
} }
if (chdir(args[1]) != 0) { if (chdir(args[1]) != 0) {
perror("rush"); perror("90s");
} }
} }
return 1; return 1;
@ -168,7 +168,7 @@ int cd(char **args) {
// show help menu // show help menu
int help(char **args) { int help(char **args) {
printf("rush %s\n", VERSION); printf("90s %s\n", VERSION);
printf("Built in commands:\n"); printf("Built in commands:\n");
for (int i = 0; i < num_builtins(); i++) { for (int i = 0; i < num_builtins(); i++) {
@ -203,11 +203,11 @@ int export(char **args) {
char *value = strtok(NULL, "=\n"); char *value = strtok(NULL, "=\n");
if (variable != NULL && value != NULL) { if (variable != NULL && value != NULL) {
if (setenv(variable, value, 1) != 0) { if (setenv(variable, value, 1) != 0) {
fprintf(stderr, "rush: Error setting environment variable\n"); fprintf(stderr, "90s: Error setting environment variable\n");
return 0; return 0;
} }
} else { } else {
fprintf(stderr, "rush: Syntax error when setting environment variable\nUse \"export VARIABLE=VALUE\"\n"); fprintf(stderr, "90s: Syntax error when setting environment variable\nUse \"export VARIABLE=VALUE\"\n");
return 0; return 0;
} }
args++; args++;
@ -217,14 +217,14 @@ int export(char **args) {
int source(char **args) { int source(char **args) {
if (args[1] == NULL) { if (args[1] == NULL) {
fprintf(stderr, "rush: not enough arguments\n"); fprintf(stderr, "90s: not enough arguments\n");
return -1; return -1;
} }
FILE *file = fopen(args[1], "r"); FILE *file = fopen(args[1], "r");
if (file == NULL) { if (file == NULL) {
fprintf(stderr, "rush: no such file or directory '%s'\n", args[1]); fprintf(stderr, "90s: no such file or directory '%s'\n", args[1]);
return -1; return -1;
} }
@ -247,17 +247,17 @@ int source(char **args) {
int bg(char **args) { int bg(char **args) {
if (args[1] == NULL) { if (args[1] == NULL) {
fprintf(stderr, "rush: not enough arguments\n"); fprintf(stderr, "90s: not enough arguments\n");
return -1; return -1;
} }
int job_index = atoi(args[1]); int job_index = atoi(args[1]);
if (job_index == 0) { if (job_index == 0) {
fprintf(stderr, "rush: invalid job index\n"); fprintf(stderr, "90s: invalid job index\n");
return -1; return -1;
} }
job *search = get_job(job_index - 1); job *search = get_job(job_index - 1);
if (search == NULL) { if (search == NULL) {
fprintf(stderr, "rush: no such job\n"); fprintf(stderr, "90s: no such job\n");
return -1; return -1;
} }
printf("Job %i: %s\n", job_index, search->command); printf("Job %i: %s\n", job_index, search->command);
@ -287,24 +287,24 @@ int launch(char **args, int fd, int options) {
// not stdin, stdout, or stderr // not stdin, stdout, or stderr
if (redirect_stdout) { if (redirect_stdout) {
if (dup2(fd, STDOUT_FILENO) == -1) { if (dup2(fd, STDOUT_FILENO) == -1) {
perror("rush"); perror("90s");
} }
} }
if (redirect_stdin) { if (redirect_stdin) {
if (dup2(fd, STDIN_FILENO) == -1) { if (dup2(fd, STDIN_FILENO) == -1) {
perror("rush"); perror("90s");
} }
} }
if (redirect_stderr) { if (redirect_stderr) {
if (dup2(fd, STDERR_FILENO) == -1) { if (dup2(fd, STDERR_FILENO) == -1) {
perror("rush"); perror("90s");
} }
} }
close(fd); // close fd as it is duplicated already close(fd); // close fd as it is duplicated already
} }
if (execvp(args[0], args) == -1) { if (execvp(args[0], args) == -1) {
if (errno == ENOENT) { if (errno == ENOENT) {
fprintf(stderr, "rush: command not found: %s\n", args[0]); fprintf(stderr, "90s: command not found: %s\n", args[0]);
} }
} }
exit(EXIT_FAILURE); // exit the child exit(EXIT_FAILURE); // exit the child
@ -351,7 +351,7 @@ int execute(char **args) {
if (strncmp(args[num_arg], ">", 1) == 0) { if (strncmp(args[num_arg], ">", 1) == 0) {
int fd = fileno(fopen(args[num_arg + 1], "w+")); int fd = fileno(fopen(args[num_arg + 1], "w+"));
if (fd == -1) { if (fd == -1) {
perror("rush"); perror("90s");
return 1; return 1;
} }
args[num_arg] = NULL; args[num_arg] = NULL;
@ -366,7 +366,7 @@ int execute(char **args) {
if (strncmp(args[num_arg], "<", 1) == 0) { if (strncmp(args[num_arg], "<", 1) == 0) {
int fd = fileno(fopen(args[num_arg + 1], "r")); int fd = fileno(fopen(args[num_arg + 1], "r"));
if (fd == -1) { if (fd == -1) {
perror("rush"); perror("90s");
return 1; return 1;
} }
args[num_arg] = NULL; args[num_arg] = NULL;
@ -375,7 +375,7 @@ int execute(char **args) {
if (strncmp(args[num_arg], "2>", 2) == 0) { if (strncmp(args[num_arg], "2>", 2) == 0) {
int fd = fileno(fopen(args[num_arg + 1], "w+")); int fd = fileno(fopen(args[num_arg + 1], "w+"));
if (fd == -1) { if (fd == -1) {
perror("rush"); perror("90s");
return 1; return 1;
} }
args[num_arg] = NULL; args[num_arg] = NULL;
@ -384,7 +384,7 @@ int execute(char **args) {
if (strncmp(args[num_arg], ">&", 2) == 0) { if (strncmp(args[num_arg], ">&", 2) == 0) {
int fd = fileno(fopen(args[num_arg + 1], "w+")); int fd = fileno(fopen(args[num_arg + 1], "w+"));
if (fd == -1) { if (fd == -1) {
perror("rush"); perror("90s");
return 1; return 1;
} }
args[num_arg] = NULL; args[num_arg] = NULL;
@ -393,7 +393,7 @@ int execute(char **args) {
if (strncmp(args[num_arg], ">>", 2) == 0) { if (strncmp(args[num_arg], ">>", 2) == 0) {
int fd = fileno(fopen(args[num_arg + 1], "a+")); int fd = fileno(fopen(args[num_arg + 1], "a+"));
if (fd == -1) { if (fd == -1) {
perror("rush"); perror("90s");
return 1; return 1;
} }
args[num_arg] = NULL; args[num_arg] = NULL;

View file

@ -6,7 +6,7 @@
#include <linux/limits.h> #include <linux/limits.h>
#include "history.h" #include "history.h"
#include "rush.h" #include "90s.h"
#include "constants.h" #include "constants.h"
FILE *history_file; FILE *history_file;
@ -16,7 +16,7 @@ int cmd_count = 0;
FILE *open_history_file(char *mode) { FILE *open_history_file(char *mode) {
history_file = fopen(histfile_path, mode); history_file = fopen(histfile_path, mode);
if (history_file == NULL) { if (history_file == NULL) {
fprintf(stderr, "rush: Error opening history file\n"); fprintf(stderr, "90s: Error opening history file\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return history_file; return history_file;
@ -29,7 +29,7 @@ void check_history_file() {
env_home = getenv("HOME"); env_home = getenv("HOME");
} }
if (env_home == NULL) { if (env_home == NULL) {
fprintf(stderr, "rush: HOME AND XDG_CONFIG_HOME environment variable is missing\n"); fprintf(stderr, "90s: HOME AND XDG_CONFIG_HOME environment variable is missing\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int env_home_len = strlen(env_home); int env_home_len = strlen(env_home);

View file

@ -2,7 +2,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include "rush.h" #include "90s.h"
typedef struct job { typedef struct job {
pid_t pid; pid_t pid;