commit da2f30b9ab22f5277a82998c1c0247d058a2fcb1
parent 8fa467e6be59b877c3d939c0fcc5892498a62970
Author: Andrew Laack <andrew@laack.co>
Date: Tue, 11 Nov 2025 06:34:59 -0600
Started working on csv reader
Diffstat:
5 files changed, 196 insertions(+), 0 deletions(-)
diff --git a/ml/count-columns.c b/ml/count-columns.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+
+int countColumns(char* filename){
+ FILE* fp = fopen(filename, "r");
+ char buffer[1024];
+ int columns = 0;
+ int done = -1;
+ int currentChars = 0;
+ while(fgets(buffer, 1024, fp) && done == -1){
+ for(int i = 0; i < 1024 ; ++i){
+ if(buffer[i] == ','){
+ columns += 1;
+ currentChars = 0;
+ }
+ else if(buffer[i] == '\n' || buffer[i] == 0 || buffer[i] == EOF){
+ done = 0;
+ break;
+ }
+ else{
+ currentChars += 1;
+ }
+ }
+ }
+ if (currentChars > 0){
+ columns += 1;
+ }
+ return columns;
+}
+
+//int main(int argc, char** argv){
+//
+// int columnCount = countColumns(argv[1]);
+// printf("%d\n\n", columnCount);
+//
+// return 0;
+//}
diff --git a/ml/count-columns.h b/ml/count-columns.h
@@ -0,0 +1,4 @@
+#ifndef COUNT_COLUMNS_H
+#define COUNT_COLUMNS_H
+int countColumns(char* filename);
+#endif
diff --git a/ml/dynamic-array.c b/ml/dynamic-array.c
@@ -0,0 +1,109 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct{
+ char* data;
+ int size;
+ int capacity;
+}DynamicArray;
+
+DynamicArray* makeArr(char* data, int size){
+ int capacity = size * 2;
+ DynamicArray* result = malloc(sizeof(DynamicArray));
+
+ char* localData = malloc(capacity * sizeof(char));
+ for(int i = 0; i < size; ++i){
+ localData[i] = data[i];
+ }
+
+ result->data = localData;
+ result->size = size;
+ result->capacity = capacity;
+ return result;
+}
+
+
+void extendArr(DynamicArray* arr){
+ int resultingCap = arr->capacity * 2;
+ if(resultingCap == 0){
+ resultingCap = 1;
+ }
+ char* newArr = malloc(resultingCap * sizeof(char));
+ for(int i = 0; i < arr->size; ++i){
+ newArr[i] = arr->data[i];
+ }
+ free(arr->data);
+ arr->data = newArr;
+ arr->capacity = resultingCap;
+}
+
+void printArr(DynamicArray* arr){
+ for(int i = 0 ; i < arr->size; ++i){
+ printf("%c", arr->data[i]);
+ }
+}
+
+void arrAppend(DynamicArray* arr, char element){
+ if(arr->capacity > arr->size){
+ arr->data[arr->size] = element;
+ arr->size += 1;
+ }
+ else{
+ extendArr(arr);
+ arrAppend(arr, element);
+ }
+}
+
+void arrCompress(DynamicArray* arr){
+ int resultingCap = arr->size;
+ char* newData = malloc(sizeof(char) * resultingCap);
+ for(int i = 0; i < arr->size; ++i){
+ newData[i] = arr->data[i];
+ }
+ free(arr->data);
+ arr->data = newData;
+ arr->capacity = resultingCap;
+}
+
+
+void arrPop(DynamicArray* arr){
+
+ if(arr->size == 0){
+ return;
+ }
+ // if it is at least half full, no need to resize
+ if(arr->size > arr->capacity/2){
+ arr->size -= 1;
+ }
+ else{
+ arrCompress(arr);
+ arrPop(arr);
+ }
+}
+
+//int main(){
+//
+// for(int i = 0; i < 10; ++i){
+//
+//
+// int size = 0;
+// int data [size];
+//
+// DynamicArray* arr = makeArr(data, size);
+//
+// for(int i = 0 ; i < 1000000; ++i){
+// arrAppend(arr,i);
+// }
+// char* before = "Size after appending:";
+// printf("%30s %10d\n", before, arr->size);
+// //printArr(arr);
+// for(int i = 0 ; i < 1000000; ++i){
+// arrPop(arr);
+// }
+// char* after = "Size after popping:";
+// printf("%30s %10d\n", after, arr->size);
+// //printArr(arr);
+// free(arr->data);
+// free(arr);
+// }
+//}
diff --git a/ml/dynamic-array.h b/ml/dynamic-array.h
@@ -0,0 +1,10 @@
+typedef struct{
+ char* data;
+ int size;
+ int capacity;
+}DynamicArray;
+DynamicArray* makeArr(char* data, int size);
+void extendArr(DynamicArray* arr);
+void printArr(DynamicArray* arr);
+void arrAppend(DynamicArray* arr, char element);
+void arrPop(DynamicArray* arr);
diff --git a/ml/read-csv.c b/ml/read-csv.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include "count-columns.h"
+#include "dynamic-array.h"
+#include <stdlib.h>
+
+int main(int argc, char ** argv){
+
+ char* filename = argv[1];
+ int columns = countColumns(filename);
+ printf("columns: %d\n", columns);
+
+ int size = 0;
+ char data [size];
+ FILE* fp = fopen(filename, "r");
+ DynamicArray* first = makeArr(data,size);
+ DynamicArray* second = makeArr(data,size);
+
+ char c;
+ while ((c = getc(fp)) != ','){
+ arrAppend(first, c);
+ }
+
+ while ((c = getc(fp)) != '\n'){
+ arrAppend(second, c);
+ }
+
+ printArr(first);
+ printf("\n");
+ printArr(second);
+ printf("\n");
+
+ // todo: cleanup allocations
+
+ fclose(fp);
+
+ return 0;
+}