diff --git a/yandere/c/.gitignore b/yandere/c/.gitignore index 5b52572..9197451 100644 --- a/yandere/c/.gitignore +++ b/yandere/c/.gitignore @@ -1,3 +1,3 @@ yandere yandere.exe -yandere.o \ No newline at end of file +*.o \ No newline at end of file diff --git a/yandere/c/Makefile b/yandere/c/Makefile index c7d303b..9ec1e92 100644 --- a/yandere/c/Makefile +++ b/yandere/c/Makefile @@ -1,5 +1,5 @@ CC = gcc -CCFLAGS = -O -Wall -W -pedantic +CCFLAGS = -O -Wall -W -pedantic -g TARGET = yandere diff --git a/yandere/c/colorcodes.h b/yandere/c/colorcodes.h new file mode 100644 index 0000000..4d00b71 --- /dev/null +++ b/yandere/c/colorcodes.h @@ -0,0 +1,7 @@ +#ifndef COLORCODES_H +#define COLORCODES_H + +#define Creset "\033[0m" // color reset +#define Cemerald "\033[38;5;49;1m" // emerald + +#endif diff --git a/yandere/c/evthandlers.c b/yandere/c/evthandlers.c new file mode 100644 index 0000000..c932fc6 --- /dev/null +++ b/yandere/c/evthandlers.c @@ -0,0 +1,21 @@ +#include "evthandlers.h" + +extern void evthandle_default(void) { + noise(msgs[Event_default]); + printf("%s ", buf); +} + +extern void evthandle_sigint(void) { + printf("\n\n%s\n\n", msgs[Event_sigint]); + exit(EXIT_FAILURE); /* intended */ +} + +extern void evthandle_sigquit(void) { + noise(msgs[Event_sigquit]); + printf("%s ", buf); +} + +extern void evthandle_sigterm(void) { + noise(msgs[Event_sigterm]); + printf("%s ", buf); +} diff --git a/yandere/c/evthandlers.h b/yandere/c/evthandlers.h new file mode 100644 index 0000000..e93dbe4 --- /dev/null +++ b/yandere/c/evthandlers.h @@ -0,0 +1,21 @@ +#ifndef EVTHANDLERS_H +#define EVTHANDLERS_H + +/************ + * INCLUDES * + ************/ +#include +#include +# +#include "noise.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void evthandle_default(void); +void evthandle_sigint(void); +void evthandle_sigquit(void); +void evthandle_sigterm(void); + +#endif diff --git a/yandere/c/fatal.c b/yandere/c/fatal.c new file mode 100644 index 0000000..9230e10 --- /dev/null +++ b/yandere/c/fatal.c @@ -0,0 +1,28 @@ +#include "fatal.h" + +extern void fatal(const char *errmsg, const char *funcname) { + safe_fprintf( + stderr, + PROGNAME ": fatal: %s in " Cemerald "%s" Creset "\n", + errmsg, funcname + ); + exit(EXIT_FAILURE); +} + +extern void vfatal(const char *errmsg, const char *funcname, ...) { + va_list ap; + + safe_fputs(stderr, PROGNAME ": fatal: "); + + va_start(ap, funcname); + safe_vfprintf(stderr, errmsg, &ap); + va_end(ap); + + safe_fprintf( + stderr, + " in " Cemerald "%s" Creset "\n", + funcname + ); + + exit(EXIT_FAILURE); +} diff --git a/yandere/c/fatal.h b/yandere/c/fatal.h new file mode 100644 index 0000000..857f393 --- /dev/null +++ b/yandere/c/fatal.h @@ -0,0 +1,27 @@ +#ifndef FATAL_H +#define FATAL_H + +/************ + * INCLUDES * + ************/ +#include +#include +#include +# +#include "global.h" +#include "wrappers.h" +#include "colorcodes.h" + +/********** + * MACROS * + **********/ +#define ERR(errmsg) fatal(errmsg, __func__) +#define VERR(errmsg, ...) vfatal(errmsg, __func__, __VA_ARGS__) + +/************** + * PROTOTYPES * + **************/ +void fatal(const char *errmsg, const char *funcname); +void vfatal(const char *errmsg, const char *funcname, ...); + +#endif diff --git a/yandere/c/global.c b/yandere/c/global.c new file mode 100644 index 0000000..bd988ec --- /dev/null +++ b/yandere/c/global.c @@ -0,0 +1,12 @@ +#include "global.h" + +const char *msgs[] = { + [Event_default] = "이제 내가 싫어진 것이다?", + [Event_sigint ] = "도망갈 수 있을 거라 생각하지 마는 것이다", + [Event_sigquit] = "발버둥치지 않는 것이다", + [Event_sigterm] = "설마 도망가려는 것이다?" +}; + +volatile sig_atomic_t event; + +char buf[BUFMAX]; diff --git a/yandere/c/global.h b/yandere/c/global.h new file mode 100644 index 0000000..780a64b --- /dev/null +++ b/yandere/c/global.h @@ -0,0 +1,34 @@ +#ifndef GLOBAL_H +#define GLOBAL_H + +/************ + * INCLUDES * + ************/ +#include + +/********** + * MACROS * + **********/ +#define PROGNAME "yandere" +#define BUFMAX 128 + +/************ + * TYPEDEFS * + ************/ +typedef void sighandler_t(int sig); + +typedef enum { + Event_default, + Event_sigint, + Event_sigquit, + Event_sigterm +} event_t; + +/******************** + * EXTERN VARIABLES * + ********************/ +extern const char *msgs[]; +extern volatile sig_atomic_t event; +extern char buf[]; + +#endif diff --git a/yandere/c/noise.c b/yandere/c/noise.c new file mode 100644 index 0000000..d0e332b --- /dev/null +++ b/yandere/c/noise.c @@ -0,0 +1,22 @@ +#include "noise.h" + +extern void noise(const char *msg) { + int i, k; + int rv, chlen; + bool overflow; + + for (i = k = 0; msg[i] != '\0'; /* empty */) { + rv = rand_range(0, 6); + chlen = mblen_(msg[i]); + overflow = (k + chlen) >= (BUFMAX - 1); + + if (overflow) break; + if (rv == 0) { /* 1/6 chance */ + buf[k++] = *("#?@" + rand_range(0, 3)); + i += chlen; + } + else for (int m = 0; m < chlen; m++) + buf[k++] = msg[i++]; + } + buf[k] = '\0'; +} diff --git a/yandere/c/noise.h b/yandere/c/noise.h new file mode 100644 index 0000000..ca478e1 --- /dev/null +++ b/yandere/c/noise.h @@ -0,0 +1,17 @@ +#ifndef NOISE_H +#define NOISE_H + +/************ + * INCLUDES * + ************/ +#include +# +#include "utils.h" +#include "wrappers.h" + +/************** + * PROTOTYPES * + **************/ +void noise(const char *msg); + +#endif diff --git a/yandere/c/sighandlers.c b/yandere/c/sighandlers.c new file mode 100644 index 0000000..e0c7311 --- /dev/null +++ b/yandere/c/sighandlers.c @@ -0,0 +1,16 @@ +#include "sighandlers.h" + +extern void sighandle_sigint(int sig) { + (void) sig; + event = Event_sigint; +} + +extern void sighandle_sigquit(int sig) { + (void) sig; + event = Event_sigquit; +} + +extern void sighandle_sigterm(int sig) { + (void) sig; + event = Event_sigterm; +} diff --git a/yandere/c/sighandlers.h b/yandere/c/sighandlers.h new file mode 100644 index 0000000..92722cd --- /dev/null +++ b/yandere/c/sighandlers.h @@ -0,0 +1,17 @@ +#ifndef SIGHANDLERS_H +#define SIGHANDLERS_H + +/************ + * INCLUDES * + ************/ +#include "global.h" +#include "wrappers.h" + +/************** + * PROTOTYPES * + **************/ +sighandler_t sighandle_sigint; +sighandler_t sighandle_sigquit; +sighandler_t sighandle_sigterm; + +#endif diff --git a/yandere/c/utils.c b/yandere/c/utils.c new file mode 100644 index 0000000..bb67446 --- /dev/null +++ b/yandere/c/utils.c @@ -0,0 +1,24 @@ +#include "utils.h" + +extern void seed(void) { + srand(time(NULL)); +} + +extern int rand_range(int min, int max) { + if (max <= 0) + VERR("max must be greater than 0, but given %d", max); + return min + rand() / (RAND_MAX / max + 1); +} + +extern int mblen_(char ch) { + unsigned char c; + + c = (unsigned char) ch; + + if (c < 0x80) return 1; /* 0xxxxxxx */ + if ((c & 0xE0) == 0xC0) return 2; /* 110xxxxx */ + if ((c & 0xF0) == 0xE0) return 3; /* 1110xxxx */ + if ((c & 0xF8) == 0xF0) return 4; /* 11110xxx */ + + return 0; +} diff --git a/yandere/c/utils.h b/yandere/c/utils.h new file mode 100644 index 0000000..6c2850a --- /dev/null +++ b/yandere/c/utils.h @@ -0,0 +1,20 @@ +#ifndef UTILS_H +#define UTILS_H + +/************ + * INCLUDES * + ************/ +#include +#include +# +#include "fatal.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void seed(void); +int rand_range(int min, int max); +int mblen_(char ch); + +#endif diff --git a/yandere/c/wrappers.c b/yandere/c/wrappers.c new file mode 100644 index 0000000..0b6f36f --- /dev/null +++ b/yandere/c/wrappers.c @@ -0,0 +1,39 @@ +#include "wrappers.h" + +/*********** + * stdio.h * + ***********/ +extern void safe_fputs(FILE *stream, const char *line) { + if (fputs(line, stream) == EOF) + ERR("fputs error"); +} + +/************ + * stdarg.h * + ************/ +static const char *vfprintf_errmsg = "vfprintf error"; + +extern void safe_fprintf(FILE *stream, const char *format, ...) { + va_list ap; + int ret; + + va_start(ap, format); + ret = vfprintf(stream, format, ap); + if (ret < 0) ERR(vfprintf_errmsg); + va_end(ap); +} + +extern void safe_vfprintf(FILE *stream, const char *format, va_list *ap) { + int ret; + + ret = vfprintf(stream, format, *ap); + if (ret < 0) ERR(vfprintf_errmsg); +} + +/************ + * signal.h * + ************/ +extern void safe_signal(int sig, sighandler_t handler) { + if (signal(sig, handler) == SIG_ERR) + ERR("signal error"); +} diff --git a/yandere/c/wrappers.h b/yandere/c/wrappers.h new file mode 100644 index 0000000..4b7aece --- /dev/null +++ b/yandere/c/wrappers.h @@ -0,0 +1,22 @@ +#ifndef WRAPPERS_H +#define WRAPPERS_H + +/************ + * INCLUDES * + ************/ +#include +#include +#include +# +#include "fatal.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void safe_fputs(FILE *stream, const char *line); +void safe_fprintf(FILE *stream, const char *format, ...); +void safe_vfprintf(FILE *stream, const char *format, va_list *ap); +void safe_signal(int sig, sighandler_t handler); + +#endif diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index fffe3b4..435d338 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -1,8 +1,25 @@ -#include +#include "yandere.types.h" int main(void) { - for (;;) - printf("이제 내가 싫어진거야? "); - + seed(); + event = Event_default; + install_sighandlers(); + for (;;) dispatch(); return 0; -} \ No newline at end of file +} + +static void install_sighandlers(void) { + safe_signal(SIGINT , sighandle_sigint); + safe_signal(SIGQUIT, sighandle_sigquit); + safe_signal(SIGTERM, sighandle_sigterm); +} + +static void dispatch(void) { + switch (event) { + case Event_default: evthandle_default(); break; + case Event_sigint : evthandle_sigint (); break; + case Event_sigquit: evthandle_sigquit(); break; + case Event_sigterm: evthandle_sigterm(); break; + default: ERR("control reaches default"); + } +} diff --git a/yandere/c/yandere.types.h b/yandere/c/yandere.types.h new file mode 100644 index 0000000..6a6a9e0 --- /dev/null +++ b/yandere/c/yandere.types.h @@ -0,0 +1,19 @@ +#ifndef YANDERE_TYPES_H +#define YANDERE_TYPES_H + +/************ + * INCLUDES * + ************/ +#include "utils.h" +#include "global.h" +#include "wrappers.h" +#include "sighandlers.h" +#include "evthandlers.h" + +/************** + * PROTOTYPES * + **************/ +static void install_sighandlers(void); +static void dispatch(void); + +#endif