-
Notifications
You must be signed in to change notification settings - Fork 0
/
worker.c
64 lines (62 loc) · 2.1 KB
/
worker.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <readline/readline.h>
#include <readline/history.h>
/* нужно для сравнения строк */
#include <string.h>
void worker(char *input)
{
/* буфер для хранения ответа пользователя */
char *answer;
/* сравнение строк по очереди для поиска известной команды */
if(strncasecmp(input, "strlen", 6) == 0)
{
answer = readline("Введите любую строку: ");
if(NULL == answer)
exit(0);
/* strlen возвращает size_t, поэтому %zd, а не просто %d */
printf("Число символов в строке: %zd\n", strlen(answer));
free(answer);
}
else if(strncasecmp(input, "cat", 3) == 0)
{
answer = readline("Введите имя файла (используйте TAB): ");
if(NULL == answer)
exit(0);
/* открываем файл на чтение в текстовом режиме */
FILE *f = fopen(answer, "rt");
if(f)
{
char *line = NULL;
size_t len = 0;
/* getline крайне рекомендуется для чтения текстового файла построчно */
/* она работает с динамической памятью, что безопаснее, чем fgets/gets */
/* это гарантирует чтение любого файла с произвольной длиной строки */
while(getline(&line, &len, f) != -1)
/* ещё один способ вывода строки в терминал */
fputs(line, stdout);
/* после getline также надо чистить память! */
if(line)
free(line);
/* не забываем "закрыть" файл */
fclose(f);
}
else
{
puts("Файл не найден!");
}
free(answer);
}
else if(strncasecmp(input, "quit", 4) == 0 || strncasecmp(input, "exit", 4) == 0)
{
puts("До встречи!");
exit(0);
}
else
{
if(strncasecmp(input, "help", 4) != 0)
printf("Неизвестная команда: %s\n", input);
help();
}
}