Hello world curses app

This commit is contained in:
2018-01-06 18:11:44 -08:00
parent 3db304e893
commit a576e43001
8 changed files with 128 additions and 1 deletions

4
.gitignore vendored
View File

@@ -1,4 +1,6 @@
*.swp
*.swo
*.o
bazel-*
tags

11
BUILD Normal file
View File

@@ -0,0 +1,11 @@
cc_binary(
name = "ncac",
srcs = [
"ncac.c",
"ncac.h",
],
deps = [
"//ui",
"@system_include//:curses"
],
)

11
WORKSPACE Normal file
View File

@@ -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"],
)
""",
)

54
ncac.c Normal file
View File

@@ -0,0 +1,54 @@
#include "ncac.h"
#include <curses.h>
#include <stdlib.h>
#include <term.h>
#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);
}

15
ncac.h Normal file
View File

@@ -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_

7
ui/BUILD Normal file
View File

@@ -0,0 +1,7 @@
cc_library(
name="ui",
srcs = ["base.c"],
hdrs = ["base.h"],
deps = ["@system_include//:curses"],
visibility = ["//visibility:public"],
)

17
ui/base.c Normal file
View File

@@ -0,0 +1,17 @@
#include "base.h"
#include <curses.h>
#include <string.h>
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);
}

10
ui/base.h Normal file
View File

@@ -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_