From a576e43001d6cee724c5de084c7f92ef0d183182 Mon Sep 17 00:00:00 2001 From: Aaron Gutierrez Date: Sat, 6 Jan 2018 18:11:44 -0800 Subject: [PATCH] Hello world curses app --- .gitignore | 4 +++- BUILD | 11 +++++++++++ WORKSPACE | 11 +++++++++++ ncac.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ncac.h | 15 +++++++++++++++ ui/BUILD | 7 +++++++ ui/base.c | 17 +++++++++++++++++ ui/base.h | 10 ++++++++++ 8 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 BUILD create mode 100644 WORKSPACE create mode 100644 ncac.c create mode 100644 ncac.h create mode 100644 ui/BUILD create mode 100644 ui/base.c create mode 100644 ui/base.h diff --git a/.gitignore b/.gitignore index 82c16c9..60f4fe4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.swp *.swo -*.o +bazel-* + +tags diff --git a/BUILD b/BUILD new file mode 100644 index 0000000..8776965 --- /dev/null +++ b/BUILD @@ -0,0 +1,11 @@ +cc_binary( + name = "ncac", + srcs = [ + "ncac.c", + "ncac.h", + ], + deps = [ + "//ui", + "@system_include//:curses" + ], +) diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 0000000..1d75920 --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,11 @@ +new_local_repository( + name = "system_include", + path = "/usr/lib", + build_file_content = """ +cc_library( + name = "curses", + srcs = ["libcurses.dylib"], + visibility = ["//visibility:public"], +) + """, +) diff --git a/ncac.c b/ncac.c new file mode 100644 index 0000000..f26edeb --- /dev/null +++ b/ncac.c @@ -0,0 +1,54 @@ +#include "ncac.h" + +#include +#include +#include + +#include "ui/base.h" + + +int main(int argc, char **argv) { + (void)argc; + (void)argv; + setup(); + + char input; + + int curs_x = 0; + int curs_y = 0; + + while(1) { + switch (input = getch()) { + case 'a': + draw_text(&curs_x, &curs_y, "Hello, world!"); + break; + default: + finish(0); + break; + } + } + return 0; +} + +void finish(int sig) { + (void)sig; + endwin(); + exit(0); +} + +void setup() { + // initialize ncurses + initscr(); + + cbreak(); + + + + // don't echo input + noecho(); + + nonl(); + + // install handlers + signal(SIGINT, &finish); +} diff --git a/ncac.h b/ncac.h new file mode 100644 index 0000000..ca405d5 --- /dev/null +++ b/ncac.h @@ -0,0 +1,15 @@ +#ifndef _NCAC_H_ +#define _NCAC_H_ + +/** + * Cleans up before exit. Installed on SIGINT + */ +void finish(); + +/** + * Sets up ncurses and internal data structures + */ +void setup(); + + +#endif // _NCAC_H_ diff --git a/ui/BUILD b/ui/BUILD new file mode 100644 index 0000000..022bfa4 --- /dev/null +++ b/ui/BUILD @@ -0,0 +1,7 @@ +cc_library( + name="ui", + srcs = ["base.c"], + hdrs = ["base.h"], + deps = ["@system_include//:curses"], + visibility = ["//visibility:public"], +) diff --git a/ui/base.c b/ui/base.c new file mode 100644 index 0000000..cb343fa --- /dev/null +++ b/ui/base.c @@ -0,0 +1,17 @@ +#include "base.h" + +#include +#include + +void draw_text(int *x, int *y, char *text) { + size_t len = strlen(text); + if (!len) return; + + mvaddch(*x, *y, text[0]); + + for (size_t i=1; i < strlen(text); i++) { + addch(text[i]); + } + + getyx(stdscr, *y, *x); +} diff --git a/ui/base.h b/ui/base.h new file mode 100644 index 0000000..b941981 --- /dev/null +++ b/ui/base.h @@ -0,0 +1,10 @@ +#ifndef UI_BASE_H_ +#define UI_BASE_H_ + +/** + * Prints the string text starting at position *x, *y. x and y are updated to + * the position after the last character + */ +void draw_text(int *x, int *y, char *text); + +#endif // UI_BASE_H_