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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include "fuzzer.h"
#include "buffer.h"
#include "util.h"
#ifndef BUFSIZ
#define BUFSIZ 1024
#endif
typedef enum CmdStatus (*Cmd)(Buffer *buf, const char *cmd);
static enum CmdStatus cmd_insert(Buffer *buf, const char *cmd) {
char data[BUFSIZ];
size_t pos;
if (sscanf(cmd, "%zu %s\n", &pos, data) != 2)
return CMD_ERR;
return buffer_insert0(buf, pos, data);
}
static enum CmdStatus cmd_set(Buffer *buf, const char *cmd) {
char data[BUFSIZ];
if (sscanf(cmd, "%s\n", data) != 1)
return CMD_ERR;
return buffer_put0(buf, data);
}
static enum CmdStatus cmd_delete(Buffer *buf, const char *cmd) {
size_t pos, len;
if (sscanf(cmd, "%zu %zu", &pos, &len) != 2)
return CMD_ERR;
return buffer_remove(buf, pos, len);
}
static enum CmdStatus cmd_clear(Buffer *buf, const char *cmd) {
buffer_clear(buf);
return CMD_OK;
}
static enum CmdStatus cmd_size(Buffer *buf, const char *cmd) {
printf("%zu bytes\n", buffer_length(buf));
return CMD_OK;
}
static enum CmdStatus cmd_capacity(Buffer *buf, const char *cmd) {
printf("%zu bytes\n", buffer_capacity(buf));
return CMD_OK;
}
static enum CmdStatus cmd_print(Buffer *buf, const char *cmd) {
size_t len = buffer_length(buf);
const char *data = buffer_content(buf);
if (data && fwrite(data, len, 1, stdout) != 1)
return CMD_ERR;
if (data)
puts("");
return CMD_OK;
}
static enum CmdStatus cmd_quit(Buffer *buf, const char *cmd) {
return CMD_QUIT;
}
static Cmd commands[] = {
['?'] = cmd_capacity,
['='] = cmd_set,
['#'] = cmd_size,
['c'] = cmd_clear,
['d'] = cmd_delete,
['i'] = cmd_insert,
['p'] = cmd_print,
['q'] = cmd_quit,
};
int main(int argc, char *argv[]) {
char line[BUFSIZ];
Buffer buf;
buffer_init(&buf);
for (;;) {
printf("> ");
if (!fgets(line, sizeof(line), stdin))
break;
if (!isatty(0))
printf("%s", line);
if (line[0] == '\n')
continue;
size_t idx = line[0];
if (idx < LENGTH(commands) && commands[idx]) {
enum CmdStatus ret = commands[idx](&buf, line+1);
printf("%s", cmd_status_msg[ret]);
if (ret == CMD_QUIT)
break;
} else {
puts("Invalid command");
}
}
buffer_release(&buf);
return 0;
}
|