moves some functionality from main into their own functions
This commit is contained in:
parent
cc6441bc7c
commit
cb309f3826
@ -2,10 +2,14 @@ TARGET=xxd
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
|
|
||||||
OBJ = main.o hex.o file.o
|
OBJ = main.o hex.o file.o
|
||||||
|
FILES = main.c hex.c file.c
|
||||||
|
|
||||||
|
DEBUG:
|
||||||
|
gcc -g $(FILES)
|
||||||
|
|
||||||
$(TARGET): $(OBJ)
|
$(TARGET): $(OBJ)
|
||||||
mkdir -p ../build
|
mkdir -p ../build
|
||||||
$(CC) -Wall -g -o $(TARGET) $(OBJ) -g
|
$(CC) -g -o $(TARGET) $(OBJ)
|
||||||
mv $(TARGET) ../build/
|
mv $(TARGET) ../build/
|
||||||
|
|
||||||
main.o: include/hex.h include/file.h
|
main.o: include/hex.h include/file.h
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
extern struct flags flags;
|
extern struct flags flags;
|
||||||
|
|
||||||
void init_flags(struct flags* flags) {
|
void init_flags(struct flags* flags) {
|
||||||
|
flags->file_in = false;
|
||||||
flags->files[0] = NULL;
|
flags->files[0] = NULL;
|
||||||
flags->files[1] = NULL;
|
flags->files[1] = NULL;
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ typedef struct {
|
|||||||
} hex_chunk_t;
|
} hex_chunk_t;
|
||||||
|
|
||||||
struct flags {
|
struct flags {
|
||||||
|
bool file_in;
|
||||||
char* files[2];
|
char* files[2];
|
||||||
uint cols; // choose the amount of columns to display (default 16) // done
|
uint cols; // choose the amount of columns to display (default 16) // done
|
||||||
|
|
||||||
|
77
src/main.c
77
src/main.c
@ -43,10 +43,9 @@ static error_t parse_opt(int key, char* arg, struct argp_state* state)
|
|||||||
if (state->arg_num >= 2)
|
if (state->arg_num >= 2)
|
||||||
argp_usage(state);
|
argp_usage(state);
|
||||||
flags->files[state->arg_num] = arg;
|
flags->files[state->arg_num] = arg;
|
||||||
|
flags->file_in = true;
|
||||||
break;
|
break;
|
||||||
case ARGP_KEY_END:
|
case ARGP_KEY_END:
|
||||||
if (state->arg_num < 1)
|
|
||||||
argp_usage(state);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return ARGP_ERR_UNKNOWN;
|
return ARGP_ERR_UNKNOWN;
|
||||||
@ -69,48 +68,68 @@ int get_hex_lines(int len)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
void do_file_read(hex_chunk_t** lines)
|
||||||
{
|
{
|
||||||
char* file_content;
|
char* file_content;
|
||||||
FILE* stream;
|
|
||||||
bool outfile;
|
|
||||||
int hex_lines, i;
|
int hex_lines, i;
|
||||||
size_t filesize;
|
size_t filesize;
|
||||||
|
|
||||||
init_flags(&flags);
|
|
||||||
|
|
||||||
argp_parse(&argp, argc, argv, 0, 0, &flags);
|
|
||||||
|
|
||||||
read_file_to_buf(flags.files[0], &file_content);
|
read_file_to_buf(flags.files[0], &file_content);
|
||||||
filesize = (flags.len == -1) ? strlen(file_content) : flags.len;
|
filesize = (flags.len == -1) ? strlen(file_content) : flags.len;
|
||||||
hex_lines = get_hex_lines(filesize);
|
hex_lines = get_hex_lines(filesize);
|
||||||
|
|
||||||
outfile = false;
|
*lines = malloc(sizeof(hex_chunk_t) * (hex_lines + 1));
|
||||||
if (flags.files[1] != NULL) {
|
|
||||||
stream = fopen(flags.files[1], "w");
|
|
||||||
outfile = true;
|
|
||||||
} else {
|
|
||||||
stream = stdout;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
hex_chunk_t* lines = malloc(sizeof(hex_chunk_t) * hex_lines);
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < hex_lines; i++) {
|
for (i = 0; i < hex_lines; i++) {
|
||||||
lines[i].line = i;
|
(*lines)[i].line = i;
|
||||||
add_text_to_chunk(file_content + (i * (flags.cols)), &(lines[i].text));
|
add_text_to_chunk(file_content + (i * (flags.cols)), &((*lines)[i].text));
|
||||||
convert_text_to_hex(&lines[i]);
|
convert_text_to_hex(&(*lines)[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < hex_lines; i++)
|
(*lines)[hex_lines].line = -1;
|
||||||
display_hex_chunk(&(lines[i]), stream);
|
|
||||||
|
|
||||||
if (outfile)
|
|
||||||
fclose(stream);
|
|
||||||
free(file_content);
|
free(file_content);
|
||||||
for (i = 0; i < hex_lines; i++)
|
}
|
||||||
free_hex_chunk(&(lines[i]));
|
|
||||||
|
void do_display(hex_chunk_t** lines)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
bool fileout = false;
|
||||||
|
FILE* stream = stdout;
|
||||||
|
|
||||||
|
if (flags.files[1] != NULL) {
|
||||||
|
stream = fopen(flags.files[1], "w");
|
||||||
|
fileout = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while ((*lines)[i].line != -1)
|
||||||
|
display_hex_chunk(&((*lines)[i++]), stream);
|
||||||
|
|
||||||
|
if (fileout)
|
||||||
|
fclose(stream);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
hex_chunk_t* lines;
|
||||||
|
|
||||||
|
init_flags(&flags);
|
||||||
|
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, &flags);
|
||||||
|
flags.files[0] = "main.c";
|
||||||
|
|
||||||
|
do_file_read(&lines);
|
||||||
|
|
||||||
|
do_display(&lines);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (lines[i].line != -1)
|
||||||
|
free_hex_chunk(&(lines[i++]));
|
||||||
|
free_hex_chunk(&(lines[i]));
|
||||||
|
|
||||||
free(lines);
|
free(lines);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user