Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion yandere/c/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
yandere
yandere.exe
yandere.o
*.o
2 changes: 1 addition & 1 deletion yandere/c/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CC = gcc
CCFLAGS = -O -Wall -W -pedantic
CCFLAGS = -O -Wall -W -pedantic -g

TARGET = yandere

Expand Down
7 changes: 7 additions & 0 deletions yandere/c/colorcodes.h
Original file line number Diff line number Diff line change
@@ -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
21 changes: 21 additions & 0 deletions yandere/c/evthandlers.c
Original file line number Diff line number Diff line change
@@ -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);
}
21 changes: 21 additions & 0 deletions yandere/c/evthandlers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef EVTHANDLERS_H
#define EVTHANDLERS_H

/************
* INCLUDES *
************/
#include <stdio.h>
#include <stdlib.h>
#
#include "noise.h"
#include "global.h"
Comment thread
logic-finder marked this conversation as resolved.

/**************
* PROTOTYPES *
**************/
void evthandle_default(void);
void evthandle_sigint(void);
void evthandle_sigquit(void);
void evthandle_sigterm(void);

#endif
23 changes: 23 additions & 0 deletions yandere/c/fatal.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "fatal.h"

extern void fatal(const char *errmsg, const char *funcname) {
safe_vfprintf(
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;
int ret;

va_start(ap, funcname);
safe_fputs(stderr, PROGNAME ": fatal: ");
safe_vfprintf(stderr, errmsg, ap);
va_end(ap);
ret = fprintf(stderr, " in " Cemerald "%s" Creset "\n", funcname);
Comment thread
logic-finder marked this conversation as resolved.
Outdated
if (ret < 0) ERR("fprintf error");
exit(EXIT_FAILURE);
}
27 changes: 27 additions & 0 deletions yandere/c/fatal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef FATAL_H
#define FATAL_H

/************
* INCLUDES *
************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#
#include "global.h"
#include "wrappers.h"
#include "colorcodes.h"
Comment thread
logic-finder marked this conversation as resolved.

/**********
* 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
12 changes: 12 additions & 0 deletions yandere/c/global.c
Original file line number Diff line number Diff line change
@@ -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];
34 changes: 34 additions & 0 deletions yandere/c/global.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#ifndef GLOBAL_H
#define GLOBAL_H

/************
* INCLUDES *
************/
#include <signal.h>

/**********
* 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
22 changes: 22 additions & 0 deletions yandere/c/noise.c
Original file line number Diff line number Diff line change
@@ -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';
}
17 changes: 17 additions & 0 deletions yandere/c/noise.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef NOISE_H
#define NOISE_H

/************
* INCLUDES *
************/
#include <stdbool.h>
#
#include "utils.h"
#include "wrappers.h"
Comment thread
logic-finder marked this conversation as resolved.

/**************
* PROTOTYPES *
**************/
void noise(const char *msg);

#endif
19 changes: 19 additions & 0 deletions yandere/c/sighandlers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include "sighandlers.h"

extern void sighandle_sigint(int sig) {
(void) sig;
event = Event_sigint;
safe_signal(sig, sighandle_sigint);
}
Comment thread
logic-finder marked this conversation as resolved.

extern void sighandle_sigquit(int sig) {
(void) sig;
event = Event_sigquit;
safe_signal(sig, sighandle_sigquit);
}
Comment thread
logic-finder marked this conversation as resolved.

extern void sighandle_sigterm(int sig) {
(void) sig;
event = Event_sigterm;
safe_signal(sig, sighandle_sigterm);
}
Comment thread
logic-finder marked this conversation as resolved.
17 changes: 17 additions & 0 deletions yandere/c/sighandlers.h
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions yandere/c/utils.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#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 %n", max);
return min + rand() / (RAND_MAX / max + 1);
Comment thread
logic-finder marked this conversation as resolved.
}

extern int mblen_(char ch) {
int len, push, temp;

/* check if 0xxxxxxx */
if (0 <= ch)
return 1;

/*
* handle 3 cases:
* 110xxxxx => return 2
* 1110xxxx => return 3
* 11110xxx => return 4
*/
len = 0;
push = 7;
do {
temp = ch >> push;
temp &= 0x1;
if (temp == 0x1)
len++;
else break;
} while (--push);

return len;
}
Comment thread
logic-finder marked this conversation as resolved.
20 changes: 20 additions & 0 deletions yandere/c/utils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef UTILS_H
#define UTILS_H

/************
* INCLUDES *
************/
#include <time.h>
#include <stdlib.h>
#
#include "fatal.h"
#include "global.h"
Comment thread
logic-finder marked this conversation as resolved.

/**************
* PROTOTYPES *
**************/
void seed(void);
int rand_range(int min, int max);
int mblen_(char ch);

#endif
35 changes: 35 additions & 0 deletions yandere/c/wrappers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "wrappers.h"

/***********
* stdio.h *
***********/
extern void safe_putchar(char ch) {
if (putchar(ch) == EOF)
ERR("putchar error");
}

extern void safe_fputs(FILE *stream, const char *line) {
if (fputs(line, stream) == EOF)
ERR("fputs error");
}

/************
* stdarg.h *
************/
extern void safe_vfprintf(FILE *stream, const char *format, ...) {
va_list ap;
int ret;

va_start(ap, format);
ret = vfprintf(stream, format, ap);
if (ret < 0) ERR("vfprintf error");
va_end(ap);
}

/************
* signal.h *
************/
extern void safe_signal(int sig, sighandler_t handler) {
/* intentionally ignore SIG_ERR */
(void) signal(sig, handler);
}
Comment thread
logic-finder marked this conversation as resolved.
22 changes: 22 additions & 0 deletions yandere/c/wrappers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#ifndef WRAPPERS_H
#define WRAPPERS_H

/************
* INCLUDES *
************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#
#include "fatal.h"
#include "global.h"
Comment thread
logic-finder marked this conversation as resolved.

/**************
* PROTOTYPES *
**************/
void safe_putchar(char ch);
void safe_fputs(FILE *stream, const char *line);
void safe_vfprintf(FILE *stream, const char *format, ...);
void safe_signal(int sig, sighandler_t handler);

#endif
27 changes: 22 additions & 5 deletions yandere/c/yandere.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
#include <stdio.h>
#include "yandere.types.h"

int main(void) {
for (;;)
printf("이제 내가 싫어진거야? ");

seed();
install_sighandlers();
event = Event_default;
for (;;) dispatch();
Comment thread
logic-finder marked this conversation as resolved.
return 0;
}
}

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");
}
}
Loading
Loading