restructure as a proper C90 project; add makefiles

This commit is contained in:
Gregory Gauthier 2026-01-30 12:06:07 +00:00
parent 9fdd8eea06
commit 0ffe156bcd
7 changed files with 136 additions and 14 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
.claude/ .claude/
.grok/ .grok/
.idea/ .idea/
cmake-build-debug/ build/

32
BUILD.BAT Normal file
View File

@ -0,0 +1,32 @@
@ECHO OFF
REM Build script for cnotes - Turbo C++ 3.0 on DOS/Win32
REM Run this if you don't have MAKE available
REM
REM Assumes TCC.EXE is in your PATH
ECHO Building cnotes with Turbo C++ 3.0...
ECHO.
REM Create build directory if it doesn't exist
IF NOT EXIST build MKDIR build
ECHO Compiling addnote.exe...
TCC -A -w -ml -I.\include -ebuild\addnote.exe src\addnote.c
IF ERRORLEVEL 1 GOTO ERROR
ECHO Compiling dumpnotes.exe...
TCC -A -w -ml -I.\include -ebuild\dumpnotes.exe src\dumpnotes.c
IF ERRORLEVEL 1 GOTO ERROR
ECHO.
ECHO Build successful!
ECHO.
DIR build\*.EXE
GOTO END
:ERROR
ECHO.
ECHO Build failed!
GOTO END
:END

40
MAKEFILE.TC Normal file
View File

@ -0,0 +1,40 @@
# Makefile for cnotes - Turbo C++ 3.0 on DOS/Win32
# Strict C89/ANSI compliant build
#
# Usage from DOS/Windows command line:
# make -f makefile.tc
#
# Or rename to MAKEFILE and run:
# make
#
# Turbo C++ 3.0 should be in PATH, or adjust CC path below.
CC = tcc
CFLAGS = -A -w -ml -I.\include
# -A = ANSI keywords only
# -w = Enable all warnings
# -ml = Large memory model (for DOS)
# -I = Include path
SRCDIR = src
INCDIR = include
BUILDDIR = build
.c.obj:
$(CC) $(CFLAGS) -c -o$*.obj $<
all: $(BUILDDIR) $(BUILDDIR)\addnote.exe $(BUILDDIR)\dumpnotes.exe
$(BUILDDIR):
if not exist $(BUILDDIR) mkdir $(BUILDDIR)
$(BUILDDIR)\addnote.exe: $(SRCDIR)\addnote.c $(INCDIR)\platform.h
$(CC) $(CFLAGS) -e$(BUILDDIR)\addnote.exe $(SRCDIR)\addnote.c
$(BUILDDIR)\dumpnotes.exe: $(SRCDIR)\dumpnotes.c $(INCDIR)\platform.h
$(CC) $(CFLAGS) -e$(BUILDDIR)\dumpnotes.exe $(SRCDIR)\dumpnotes.c
clean:
if exist $(BUILDDIR)\*.exe del $(BUILDDIR)\*.exe
if exist $(BUILDDIR)\*.obj del $(BUILDDIR)\*.obj
if exist $(BUILDDIR) rmdir $(BUILDDIR)

39
Makefile Normal file
View File

@ -0,0 +1,39 @@
# Makefile for cnotes - GCC on Linux/Unix/macOS
# Strict C89/ANSI compliant build
CC = gcc
CFLAGS = -ansi -pedantic -Wall -Wextra -O2
INCLUDES = -I include
SRCDIR = src
INCDIR = include
BUILDDIR = build
SOURCES = $(SRCDIR)/addnote.c $(SRCDIR)/dumpnotes.c
HEADERS = $(INCDIR)/platform.h
TARGETS = $(BUILDDIR)/addnote $(BUILDDIR)/dumpnotes
.PHONY: all clean install uninstall
all: $(BUILDDIR) $(TARGETS)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
$(BUILDDIR)/addnote: $(SRCDIR)/addnote.c $(HEADERS)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $(SRCDIR)/addnote.c
$(BUILDDIR)/dumpnotes: $(SRCDIR)/dumpnotes.c $(HEADERS)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $(SRCDIR)/dumpnotes.c
clean:
rm -rf $(BUILDDIR)
# Install to /usr/local/bin (optional, run with sudo)
install: $(TARGETS)
install -m 755 $(BUILDDIR)/addnote /usr/local/bin/
install -m 755 $(BUILDDIR)/dumpnotes /usr/local/bin/
uninstall:
rm -f /usr/local/bin/addnote /usr/local/bin/dumpnotes

View File

@ -3,7 +3,6 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h>
#include "platform.h" #include "platform.h"
@ -38,9 +37,9 @@ int get_cnotes_path(char *buffer, size_t bufsize) {
const char *home; const char *home;
size_t len; size_t len;
home = getenv("HOME"); home = getenv(HOME_ENV);
if (home == NULL) { if (home == NULL) {
fprintf(stderr, "Error: HOME environment variable not set\n"); fprintf(stderr, "Error: %s environment variable not set\n", HOME_ENV);
return 0; return 0;
} }
@ -51,7 +50,7 @@ int get_cnotes_path(char *buffer, size_t bufsize) {
return 0; return 0;
} }
sprintf(buffer, "%s/%s", home, CNOTES_DIR); sprintf(buffer, "%s" PATH_SEP_STR "%s", home, CNOTES_DIR);
return 1; return 1;
} }
@ -109,7 +108,7 @@ int write_entry(const char *category, const char *message) {
} }
/* Build full file path */ /* Build full file path */
sprintf(file_path, "%s/%s", dir_path, CNOTES_FILE); sprintf(file_path, "%s" PATH_SEP_STR "%s", dir_path, CNOTES_FILE);
/* Open file in append mode */ /* Open file in append mode */
file = fopen(file_path, "a"); file = fopen(file_path, "a");

View File

@ -5,6 +5,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "platform.h"
#define MAX_LENGTH 500 /* Allow fgets to read up to this many characters */ #define MAX_LENGTH 500 /* Allow fgets to read up to this many characters */
#define DATE_LENGTH 10 /* YYYY-MM-DD */ #define DATE_LENGTH 10 /* YYYY-MM-DD */
@ -101,7 +102,7 @@ void print_entry(const Entry *entry) {
/* Parse a fixed-length field followed by a delimiter */ /* Parse a fixed-length field followed by a delimiter */
static const char *parse_fixed_field(const char *ptr, char *dest, int length, char delimiter) { static const char *parse_fixed_field(const char *ptr, char *dest, int length, char delimiter) {
if (strlen(ptr) < length) return NULL; if ((int)strlen(ptr) < length) return NULL;
strncpy(dest, ptr, length); strncpy(dest, ptr, length);
dest[length] = '\0'; dest[length] = '\0';
ptr += length; ptr += length;
@ -152,9 +153,9 @@ int get_cnotes_path(char *buffer, size_t bufsize) {
const char *home; const char *home;
size_t len; size_t len;
home = getenv("HOME"); home = getenv(HOME_ENV);
if (home == NULL) { if (home == NULL) {
fprintf(stderr, "Error: HOME environment variable not set\n"); fprintf(stderr, "Error: %s environment variable not set\n", HOME_ENV);
return 0; return 0;
} }
@ -165,20 +166,27 @@ int get_cnotes_path(char *buffer, size_t bufsize) {
return 0; return 0;
} }
sprintf(buffer, "%s/%s/%s", home, CNOTES_DIR, CNOTES_FILE); sprintf(buffer, "%s" PATH_SEP_STR "%s" PATH_SEP_STR "%s", home, CNOTES_DIR, CNOTES_FILE);
return 1; return 1;
} }
/* start with a simple cat of the file */ /* start with a simple cat of the file */
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int i;
FILE *notesfile; FILE *notesfile;
char file_path[600]; char file_path[600];
Entry entries[MAX_ENTRIES]; Entry *entries;
int entry_count = 0; int entry_count = 0;
char line[MAX_LENGTH +1]; char line[MAX_LENGTH +1];
char *filename = CNOTES_FILE; char *filename = NULL;
SortMode sort_mode = SORT_NONE; SortMode sort_mode = SORT_NONE;
int i;
/* Insures that we won't run out of memory in DOS */
entries = (Entry *)malloc(MAX_ENTRIES * sizeof(Entry));
if (entries == NULL) {
fprintf(stderr, "Error: Cannot allocate memory\n");
return 1;
}
/* Parse command line arguments */ /* Parse command line arguments */
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
@ -209,6 +217,9 @@ int main(int argc, char *argv[]) {
} }
} }
/* TODO: filename argument is parsed but not yet used */
(void)filename;
/* Get cnotes file path */ /* Get cnotes file path */
if (!get_cnotes_path(file_path, sizeof(file_path))) { if (!get_cnotes_path(file_path, sizeof(file_path))) {
return 1; return 1;
@ -247,5 +258,6 @@ int main(int argc, char *argv[]) {
} }
print_footer(); print_footer();
free(entries);
return 0; return 0;
} }