c-programming

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Aml/count-columns.c | 36++++++++++++++++++++++++++++++++++++
Aml/count-columns.h | 4++++
Aml/dynamic-array.c | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aml/dynamic-array.h | 10++++++++++
Aml/read-csv.c | 37+++++++++++++++++++++++++++++++++++++
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; +}