From 14dc5a09756ed6d8b046d881ea392b2f628411da Mon Sep 17 00:00:00 2001 From: iridiumR Date: Sun, 18 Sep 2022 12:22:59 +0800 Subject: [PATCH] feat(line): add line reading and spliting --- Makefile | 6 ++-- line.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ line.h | 5 ++++ main.c | 3 +- 4 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 line.c create mode 100644 line.h diff --git a/Makefile b/Makefile index 8c6b1f6..98c32d4 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ -OBJ=main.o +OBJ=main.o line.o CC=gcc CFLAGS= -O3 -Wall -all:dish +all:debug + +release:dish dish: $(OBJ) $(CC) $(CFLAGS) -o dish $(OBJ) diff --git a/line.c b/line.c new file mode 100644 index 0000000..d318a5e --- /dev/null +++ b/line.c @@ -0,0 +1,87 @@ +#include "line.h" +#include +#include +#include + +char *readLine(void) { + int bufsize = LINE_BUF_SIZE; + int position = 0; + char *buffer = malloc(sizeof(char) * bufsize); + char c; + + if (!buffer) { + fprintf(stderr, "dish: allocation error\n"); + exit(EXIT_FAILURE); + } + + while (1) { + // read a character + c = getchar(); + printf("%s", &c); + // repleace EOF with a null character and return + if (c == EOF || c == '\n') { + buffer[position] = '\0'; + return buffer; + } else { + buffer[position] = c; + } + position++; + + /* if the buffer is full, reallocate */ + if (position >= bufsize) { + bufsize += LINE_BUF_SIZE; + buffer = realloc(buffer, bufsize); + if (!buffer) { + fprintf(stderr, "dish: allocation error\n"); + exit(EXIT_FAILURE); + } + } + } +} + +char **splitLine(char *line) { + int bufsize = LINE_BUF_SIZE, position = 0; + char **tokens = malloc(bufsize * sizeof(char *)); + char *token; + + if (!tokens) { + fprintf(stderr, "dish: allocation error"); + exit(EXIT_FAILURE); + } + + /* get sub string + *" \t\r\n\a" is a set of delimiters, + * which stands for space, tab, carriage, newline, and alert. + */ + token = strtok(line, " \t\r\n\a"); + + while (token != NULL) { + tokens[position] = token; + position++; + + /* if the buffer is full, reallocate */ + if (position >= bufsize) { + bufsize += LINE_BUF_SIZE; + tokens = realloc(tokens, bufsize); + if (!tokens) { + fprintf(stderr, "dish: allocation error\n"); + exit(EXIT_FAILURE); + } + } + + token = strtok(NULL, " \t\r\n\a"); + } + + /* set the last element to NULL */ + tokens[position] = NULL; + return tokens; +} + +void line() { + char *line; + int status = 1; + char str; + printf("> "); + line = readLine(); + free(line); +} \ No newline at end of file diff --git a/line.h b/line.h new file mode 100644 index 0000000..0bd796a --- /dev/null +++ b/line.h @@ -0,0 +1,5 @@ +#ifndef _LINE_H_ +#define _LINE_H_ +#define LINE_BUF_SIZE 1024 +void line(); +#endif \ No newline at end of file diff --git a/main.c b/main.c index 9ed8944..b4f5958 100644 --- a/main.c +++ b/main.c @@ -19,8 +19,7 @@ int main(int argc, char *argv[]) { printf("DEBUG is defined\n"); #endif while (1) { - printf("runing!\n"); - sleep(1); + line(); } return 0; } \ No newline at end of file