moves some functionality from main into their own functions

This commit is contained in:
SuperNovaa41 2025-02-07 22:11:17 -05:00
parent cc6441bc7c
commit cb309f3826
5 changed files with 54 additions and 29 deletions

View File

@ -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

BIN
src/a.out Executable file

Binary file not shown.

View File

@ -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;

View File

@ -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

View File

@ -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]);
}
(*lines)[hex_lines].line = -1;
free(file_content);
}
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;
} }
for (i = 0; i < hex_lines; i++) i = 0;
display_hex_chunk(&(lines[i]), stream); while ((*lines)[i].line != -1)
display_hex_chunk(&((*lines)[i++]), stream);
if (outfile) if (fileout)
fclose(stream); fclose(stream);
free(file_content);
for (i = 0; i < hex_lines; i++) }
free_hex_chunk(&(lines[i]));
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);