dish/line.c

91 lines
2.4 KiB
C
Raw Normal View History

2022-09-18 06:46:23 +00:00
/*
* @Author: 1ridic
* @Date: 2022-09-18 14:14:05
* @Last Modified by: 1ridic
* @Last Modified time: 2022-09-18 14:14:05
2022-09-18 06:46:23 +00:00
*/
2023-03-30 10:12:29 +00:00
#include "line.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
2023-03-30 10:12:29 +00:00
#include <readline/history.h>
#include <readline/readline.h>
2023-03-30 10:12:29 +00:00
/*split one line to word, when appears "", save the content to one word*/
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) {
2023-03-30 10:12:29 +00:00
/*detect if there exists "" pair*/
if (token[0] == '"') {
char *temp = malloc(bufsize * sizeof(char *));
for (int i = 0; i < strlen(token); i++) {
/*delete the first " */
temp[i] = token[i + 1];
}
/*read next token and detect " */
int pair_flag = 0;
while (1) {
token = strtok(NULL, " \t\r\n\a");
2023-03-30 10:36:56 +00:00
if (token == NULL && pair_flag == 0) {
fprintf(stderr, "error: no pair \"\n");
return NULL;
}
/*if there exists a pair of "", break the loop*/
if ((strlen(token)>1 && token[strlen(token) - 1] == '"') || (strlen(token)==1 && token[0] == '"')) {
2023-03-30 10:12:29 +00:00
/*delete the last " */
token[strlen(token) - 1] = '\0';
strcat(temp, " ");
strcat(temp, token);
2023-03-30 10:36:56 +00:00
token = temp;
pair_flag = 1;
2023-03-30 10:12:29 +00:00
break;
} else {
strcat(temp, " ");
strcat(temp, token);
}
}
2023-03-30 10:36:56 +00:00
} else {
char *temp = malloc(bufsize * sizeof(char *));
strcpy(temp, token);
token = temp;
2023-03-30 10:12:29 +00:00
}
tokens[position] = token;
2022-09-18 05:14:30 +00:00
#ifdef DEBUG
fprintf(stdout, "debug: tokens[%d] = %s\n", position, tokens[position]);
#endif
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;
}