Compare commits

...

6 Commits

Author SHA1 Message Date
e97e106001 add csv export 2025-12-22 04:03:26 +01:00
6862af407e add uninstall task 2025-09-18 01:59:12 +02:00
6a8bb3f5d4 use stdbool for true/false 2025-09-18 01:59:04 +02:00
557a4affa6 add -O3 to cflags 2025-09-18 01:55:12 +02:00
3b99b87c22 fix index oob segfaults 2025-04-28 02:36:14 +02:00
f40b4001c7 remove github workflows 2024-11-10 01:22:58 +01:00
5 changed files with 54 additions and 79 deletions

View File

@@ -1,74 +0,0 @@
name: Build Todd
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libncurses5-dev
version: "1.0"
- name: make
run: make
- name: copy to build folder
run: |
mkdir -p build
cp ./todd build/
- uses: actions/upload-artifact@v4
with:
name: todd-linux
path: build
build-mac:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: make
run: make
- name: copy to build folder
run: |
mkdir -p build
cp ./todd build/
- uses: actions/upload-artifact@v4
with:
name: todd-mac
path: build
build-windows:
defaults:
run:
shell: msys2 {0}
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: msys2/setup-msys2@v2
with:
msystem: mingw64
update: true
install: >-
gcc
make
ncurses-devel
- name: make
run: make
- name: copy to build folder
run: |
mkdir -p build
cp ./todd.exe build/
- uses: actions/upload-artifact@v4
with:
name: todd-windows
path: build

View File

@@ -1,7 +1,7 @@
.DEFAULT_GOAL := all .DEFAULT_GOAL := all
CC=gcc CC=gcc
CFLAGS=-Wall -Wextra -Werror -pedantic -std=c99 -g CFLAGS=-Wall -Wextra -Werror -pedantic -std=c99 -O3
todo.o: todo.o:
$(CC) $(CFLAGS) -c engine/todo.c -o todo.o $(CC) $(CFLAGS) -c engine/todo.c -o todo.o
@@ -12,7 +12,6 @@ main.o:
clean: clean:
rm -f *.o rm -f *.o
rm -f todd rm -f todd
rm /usr/local/bin/todd || true
todd: todo.o main.o todd: todo.o main.o
$(CC) $(CFLAGS) todo.o main.o -lncurses -o todd $(CC) $(CFLAGS) todo.o main.o -lncurses -o todd
@@ -21,3 +20,6 @@ all: todd
install: todd install: todd
cp todd /usr/local/bin/todd cp todd /usr/local/bin/todd
uninstall:
rm /usr/local/bin/todd || true

View File

@@ -1,6 +1,7 @@
#include "todo.h" #include "todo.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
// Memory management // Memory management
@@ -54,3 +55,20 @@ char *todo_item_serialize(TodoItem *item, int *buffer_size_out) {
return buffer; return buffer;
} }
// Exports
void todo_export_as_csv(TodoItem *items, int item_count, const char *filename) {
FILE *file = fopen(filename, "w");
if (file == NULL) {
perror("Failed to open file for writing");
return;
}
// Write CSV header
fprintf(file, "Title,Completed\n");
for (int i = 0; i < item_count; i++) {
fprintf(file, "\"%s\",%s\n", items[i].title,
items[i].completed ? "Yes" : "No");
}
fclose(file);
}

View File

@@ -2,8 +2,6 @@
#define TODO_H #define TODO_H
#define TODO_MAX_TITLE_LENGTH 255 #define TODO_MAX_TITLE_LENGTH 255
#define true 1
#define false 0
typedef unsigned char bool_t; typedef unsigned char bool_t;
typedef struct { typedef struct {
@@ -22,4 +20,7 @@ void todo_print_item(TodoItem *item);
// Serialization // Serialization
char *todo_item_serialize(TodoItem *item, int *buffer_size_out); char *todo_item_serialize(TodoItem *item, int *buffer_size_out);
// Exports
void todo_export_as_csv(TodoItem *items, int item_count, const char *filename);
#endif #endif

30
main.c
View File

@@ -17,7 +17,7 @@
#define COMPLETED_PAIR 3 #define COMPLETED_PAIR 3
#include "3rd-party/stb-ds.h" #include "3rd-party/stb-ds.h"
#define KEY_BINDINGS " [a]dd [v]view [m]ark [d]elete [w]rite [l]oad [q]uit" #define KEY_BINDINGS " [a]dd [v]view [m]ark [d]elete [e]xport csv [w]rite [l]oad [q]uit"
bool dirty = false; bool dirty = false;
char SAVE_FILE[MAX_PATH_LENGTH] = ""; char SAVE_FILE[MAX_PATH_LENGTH] = "";
@@ -32,6 +32,7 @@ enum Command {
WRITE_TO_FILE = 'w', WRITE_TO_FILE = 'w',
LOAD_FROM_FILE = 'l', LOAD_FROM_FILE = 'l',
EXPORT_AS_CSV = 'e',
UP = 'k', UP = 'k',
DOWN = 'j', DOWN = 'j',
@@ -235,12 +236,22 @@ void add_command_handler(int width, int height) {
} }
void view_command_handler(int width, int height, int index) { void view_command_handler(int width, int height, int index) {
// check if the index is out of bounds
if (index < 0 || index >= arrlen(todos)) {
return;
}
TodoItem item = todos[index]; TodoItem item = todos[index];
// create an alert in the middle of the screen // create an alert in the middle of the screen
alert(item.title, width, height); alert(item.title, width, height);
} }
void mark_command_handler(int index) { void mark_command_handler(int index) {
// check if the index is out of bounds
if (index < 0 || index >= arrlen(todos)) {
return;
}
TodoItem item = todos[index]; TodoItem item = todos[index];
todo_mark_item(&item, !item.completed); todo_mark_item(&item, !item.completed);
@@ -252,6 +263,11 @@ void mark_command_handler(int index) {
} }
void remove_command_handler(int index) { void remove_command_handler(int index) {
// check if the index is out of bounds
if (index < 0 || index >= arrlen(todos)) {
return;
}
arrdel(todos, index); arrdel(todos, index);
// set the dirty flag // set the dirty flag
@@ -331,6 +347,14 @@ void load_from_file_handler(void) {
dirty = false; dirty = false;
} }
void export_as_csv_handler(void) {
// create the csv file path
char csv_file_path[MAX_PATH_LENGTH + 5]; // +5 for .csv extension
snprintf(csv_file_path, sizeof(csv_file_path), "%s.csv", SAVE_FILE);
todo_export_as_csv(todos, arrlen(todos), csv_file_path);
}
int main(int argc, char **argv) { int main(int argc, char **argv) {
int terminal_width = 0; int terminal_width = 0;
int terminal_height = 0; int terminal_height = 0;
@@ -375,6 +399,10 @@ int main(int argc, char **argv) {
write_to_file_handler(); write_to_file_handler();
alert("Saved!", terminal_width, terminal_height); alert("Saved!", terminal_width, terminal_height);
break; break;
case EXPORT_AS_CSV:
export_as_csv_handler();
alert("Exported as CSV!", terminal_width, terminal_height);
break;
case ADD: case ADD:
add_command_handler(terminal_width, terminal_height); add_command_handler(terminal_width, terminal_height);
break; break;