More cleanups.

More cleaning up construction of arrays of things.
Introduce a utility function called, `split_on_space`
that tokenizes a string on a space character; use
it in most places where `strtok()` had been called.

More use of the ptr_vector type.  Introduce a utility
function to get access to the pointers without consuming
the vector; this is used in the files code.

Signed-off-by: Dan Cross <patchdev@fat-dragon.org>
This commit is contained in:
Dan Cross 2018-10-09 15:55:16 +00:00 committed by Andrew Pamment
parent 540e359080
commit 54093060cb
8 changed files with 175 additions and 215 deletions

View File

@ -273,6 +273,7 @@ extern int ptr_vector_put(struct ptr_vector *vec, void *p, size_t i);
extern void *ptr_vector_del(struct ptr_vector *vec, size_t i); extern void *ptr_vector_del(struct ptr_vector *vec, size_t i);
extern int ptr_vector_append(struct ptr_vector *vec, void *p); extern int ptr_vector_append(struct ptr_vector *vec, void *p);
extern size_t ptr_vector_len(struct ptr_vector *vec); extern size_t ptr_vector_len(struct ptr_vector *vec);
extern void **ptr_vector_ptrs(struct ptr_vector *vec);
extern void **consume_ptr_vector(struct ptr_vector *vec); extern void **consume_ptr_vector(struct ptr_vector *vec);
extern void destroy_ptr_vector(struct ptr_vector *vec); extern void destroy_ptr_vector(struct ptr_vector *vec);
@ -388,6 +389,7 @@ extern void bwave_upload_reply();
extern void load_strings(); extern void load_strings();
extern char *get_string(int offset); extern char *get_string(int offset);
extern void chomp(char *string); extern void chomp(char *string);
extern char **split_on_space(char *str, size_t *lenp);
extern void die(const char *msg); extern void die(const char *msg);
extern void *malloz(size_t size); extern void *malloz(size_t size);

View File

@ -48,7 +48,7 @@ int blog_load(struct blog_entry_t ***entries) {
sqlite3_close(db); sqlite3_close(db);
blog_entry_count = ptr_vector_len(&blog_entries); blog_entry_count = ptr_vector_len(&blog_entries);
*entries = consume_ptr_vector(&blog_entries); *entries = (struct blog_entry_t **)consume_ptr_vector(&blog_entries);
return blog_entry_count; return blog_entry_count;
} }

View File

@ -318,7 +318,6 @@ void bwave_create_packet() {
int totmsgs = 0; int totmsgs = 0;
int ret; int ret;
char **args, *arg; char **args, *arg;
struct ptr_vector args_vec;
char *cmd; char *cmd;
pid_t pid; pid_t pid;
@ -530,14 +529,7 @@ void bwave_create_packet() {
dup2(bbs_stdin, STDIN_FILENO); dup2(bbs_stdin, STDIN_FILENO);
} }
init_ptr_vector(&args_vec); args = split_on_space(buffer, NULL);
arg = strtok(buffer, " ");
ptr_vector_append(&args_vec, arg);
while (arg != NULL) {
arg = strtok(NULL, " ");
ptr_vector_append(&args_vec, arg);
}
args = (char **)consume_ptr_vector(&args_vec);
cmd = args[0]; cmd = args[0];
pid = fork(); pid = fork();
if (pid == 0) { if (pid == 0) {
@ -813,7 +805,6 @@ void bwave_upload_reply() {
char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)"; char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)";
char *err_msg = 0; char *err_msg = 0;
char **args, *arg; char **args, *arg;
struct ptr_vector args_vec;
char *cmd; char *cmd;
pid_t pid; pid_t pid;
int ret; int ret;
@ -866,14 +857,7 @@ void bwave_upload_reply() {
dup2(bbs_stderr, STDERR_FILENO); dup2(bbs_stderr, STDERR_FILENO);
dup2(bbs_stdin, STDIN_FILENO); dup2(bbs_stdin, STDIN_FILENO);
} }
init_ptr_vector(&args_vec); args = split_on_space(buffer, NULL);
arg = strtok(buffer, " ");
ptr_vector_append(&args_vec, arg);
while (arg != NULL) {
arg = strtok(NULL, " ");
ptr_vector_append(&args_vec, arg);
}
args = (char **)consume_ptr_vector(&args_vec);
cmd = args[0]; cmd = args[0];
pid = fork(); pid = fork();
if (pid == 0) { if (pid == 0) {

View File

@ -523,14 +523,7 @@ void runexternal(struct user_record *user, char *cmd, int stdio, char *argv[], c
if (cwd != NULL) { if (cwd != NULL) {
chdir(cwd); chdir(cwd);
} }
init_ptr_vector(&args_vec); args = split_on_space(buffer, NULL);
arg = strtok(buffer, " ");
ptr_vector_append(&args_vec, arg);
while (arg != NULL) {
arg = strtok(NULL, " ");
ptr_vector_append(&args_vec, arg);
}
args = (char **)consume_ptr_vector(&args_vec);
cmd = args[0]; cmd = args[0];
pid = fork(); pid = fork();
if (pid == 0) { if (pid == 0) {

View File

@ -143,6 +143,8 @@ void show_email(struct user_record *user, int msgno, int email_count, struct ema
int quit = 0; int quit = 0;
while (!quit) { while (!quit) {
struct ptr_vector lines_vec;
char *line;
s_printf(get_string(57), emails[msgno]->from); s_printf(get_string(57), emails[msgno]->from);
s_printf(get_string(58), emails[msgno]->subject); s_printf(get_string(58), emails[msgno]->subject);
@ -158,24 +160,19 @@ void show_email(struct user_record *user, int msgno, int email_count, struct ema
msg_line_count = 0; msg_line_count = 0;
start_line = 0; start_line = 0;
init_ptr_vector(&lines_vec);
// count the number of lines... // count the number of lines...
for (z = 0; z < strlen(emails[msgno]->body); z++) { for (z = 0; z < strlen(emails[msgno]->body); z++) {
if (emails[msgno]->body[z] == '\r' || chars == 79) { if (emails[msgno]->body[z] == '\r' || chars == 79) {
if (msg_line_count == 0) { line = (char *)malloz(z - start_line + 1);
msg_lines = (char **)malloz(sizeof(char *)); ptr_vector_append(&lines_vec, line);
} else {
msg_lines = (char **)realloc(msg_lines, sizeof(char *) * (msg_line_count + 1));
}
msg_lines[msg_line_count] = (char *)malloz(sizeof(char) * (z - start_line + 1));
if (z == start_line) { if (z == start_line) {
msg_lines[msg_line_count][0] = '\0'; line[0] = '\0';
} else { } else {
strncpy(msg_lines[msg_line_count], &emails[msgno]->body[start_line], z - start_line); strncpy(line, &emails[msgno]->body[start_line], z - start_line);
msg_lines[msg_line_count][z - start_line] = '\0'; line[z - start_line] = '\0';
} }
msg_line_count++;
if (emails[msgno]->body[z] == '\r') { if (emails[msgno]->body[z] == '\r') {
start_line = z + 1; start_line = z + 1;
} else { } else {
@ -186,6 +183,8 @@ void show_email(struct user_record *user, int msgno, int email_count, struct ema
chars++; chars++;
} }
} }
msg_line_count = ptr_vector_len(&lines_vec);
msg_lines = (char **)consume_ptr_vector(&lines_vec);
lines = 0; lines = 0;
@ -362,6 +361,7 @@ void list_emails(struct user_record *user) {
int rc; int rc;
char *sql = "SELECT sender,subject,seen,date,body,id FROM email WHERE recipient LIKE ?"; char *sql = "SELECT sender,subject,seen,date,body,id FROM email WHERE recipient LIKE ?";
struct email_msg **emails; struct email_msg **emails;
struct ptr_vector emails_vec;
int email_count; int email_count;
int msgid; int msgid;
int msgtoread; int msgtoread;
@ -395,24 +395,19 @@ void list_emails(struct user_record *user) {
msgid = 0; msgid = 0;
s_printf(get_string(63)); s_printf(get_string(63));
email_count = 0; init_ptr_vector(&emails_vec);
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {
if (email_count == 0) { struct email_msg *email = (struct email_msg *)malloz(sizeof(struct email_msg));
emails = (struct email_msg **)malloz(sizeof(struct email_msg *)); ptr_vector_append(&emails_vec, email);
} else { email->from = strdup((char *)sqlite3_column_text(res, 0));
emails = (struct email_msg **)realloc(emails, sizeof(struct email_msg *) * (email_count + 1)); email->subject = strdup((char *)sqlite3_column_text(res, 1));
} email->seen = sqlite3_column_int(res, 2);
email->date = (time_t)sqlite3_column_int(res, 3);
emails[email_count] = (struct email_msg *)malloz(sizeof(struct email_msg)); email->body = strdup((char *)sqlite3_column_text(res, 4));
email->id = sqlite3_column_int(res, 5);
emails[email_count]->from = strdup((char *)sqlite3_column_text(res, 0));
emails[email_count]->subject = strdup((char *)sqlite3_column_text(res, 1));
emails[email_count]->seen = sqlite3_column_int(res, 2);
emails[email_count]->date = (time_t)sqlite3_column_int(res, 3);
emails[email_count]->body = strdup((char *)sqlite3_column_text(res, 4));
emails[email_count]->id = sqlite3_column_int(res, 5);
email_count++;
} }
email_count = ptr_vector_len(&emails_vec);
emails = (struct email_msg **)consume_ptr_vector(&emails_vec);
sqlite3_finalize(res); sqlite3_finalize(res);
sqlite3_close(db); sqlite3_close(db);

View File

@ -11,6 +11,7 @@
#include <dirent.h> #include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
#include <time.h> #include <time.h>
#include <sys/wait.h>
#include "Xmodem/zmodem.h" #include "Xmodem/zmodem.h"
#include "bbs.h" #include "bbs.h"
#include "lua/lua.h" #include "lua/lua.h"
@ -299,7 +300,6 @@ char *get_file_id_diz(char *filename) {
int ret; int ret;
pid_t pid; pid_t pid;
char **args; char **args;
int arg_count;
char *cmd; char *cmd;
ext = 0; ext = 0;
arch = -1; arch = -1;
@ -370,15 +370,8 @@ char *get_file_id_diz(char *filename) {
dup2(bbs_stderr, STDERR_FILENO); dup2(bbs_stderr, STDERR_FILENO);
dup2(bbs_stdin, STDIN_FILENO); dup2(bbs_stdin, STDIN_FILENO);
} }
args = (char **)malloz(sizeof(char *)); args = split_on_space(buffer, NULL);
arg_count = 0; cmd = args[0];
args[arg_count] = strtok(buffer, " ");
while (args[arg_count] != NULL) {
arg_count++;
args = (char **)realloc(args, sizeof(char *) * (arg_count + 1));
args[arg_count] = strtok(NULL, " ");
}
cmd = strdup(args[0]);
pid = fork(); pid = fork();
if (pid == 0) { if (pid == 0) {
execvp(cmd, args); execvp(cmd, args);
@ -388,7 +381,6 @@ char *get_file_id_diz(char *filename) {
} else { } else {
ret = -1; ret = -1;
} }
free(cmd);
free(args); free(args);
if (sshBBS) { if (sshBBS) {
@ -1009,10 +1001,12 @@ void do_list_files(struct file_entry **files_e, int files_c) {
int z; int z;
int k; int k;
int match; int match;
struct ptr_vector files;
char buffer[6]; char buffer[6];
s_printf("\r\n"); s_printf("\r\n");
init_ptr_vector(&files);
for (i = 0; i < files_c; i++) { for (i = 0; i < files_c; i++) {
file_size = files_e[i]->size; file_size = files_e[i]->size;
if (file_size > 1024 * 1024 * 1024) { if (file_size > 1024 * 1024 * 1024) {
@ -1066,17 +1060,14 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} }
} }
if (match == 0) { if (match == 0) {
if (tagged_count == 0) { struct tagged_file *file = (struct tagged_file *)malloz(sizeof(struct tagged_file));
tagged_files = (struct tagged_file **)malloz(sizeof(struct tagged_file *)); file->filename = strdup(files_e[z]->filename);
} else { file->dir = files_e[z]->dir;
tagged_files = (struct tagged_file **)realloc(tagged_files, sizeof(struct tagged_file *) * (tagged_count + 1)); file->sub = files_e[z]->sub;
} file->fid = files_e[z]->fid;
tagged_files[tagged_count] = (struct tagged_file *)malloz(sizeof(struct tagged_file)); ptr_vector_append(&files, file);
tagged_files[tagged_count]->filename = strdup(files_e[z]->filename);
tagged_files[tagged_count]->dir = files_e[z]->dir;
tagged_files[tagged_count]->sub = files_e[z]->sub;
tagged_files[tagged_count]->fid = files_e[z]->fid;
tagged_count++; tagged_count++;
tagged_files = (struct tagged_file **)ptr_vector_ptrs(&files);
s_printf(get_string(71), basename(files_e[z]->filename)); s_printf(get_string(71), basename(files_e[z]->filename));
} else { } else {
s_printf(get_string(72)); s_printf(get_string(72));
@ -1124,17 +1115,14 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} }
} }
if (match == 0) { if (match == 0) {
if (tagged_count == 0) { struct tagged_file *file = (struct tagged_file *)malloz(sizeof(struct tagged_file));
tagged_files = (struct tagged_file **)malloz(sizeof(struct tagged_file *)); file->filename = strdup(files_e[z]->filename);
} else { file->dir = files_e[z]->dir;
tagged_files = (struct tagged_file **)realloc(tagged_files, sizeof(struct tagged_file *) * (tagged_count + 1)); file->sub = files_e[z]->sub;
} file->fid = files_e[z]->fid;
tagged_files[tagged_count] = (struct tagged_file *)malloz(sizeof(struct tagged_file)); ptr_vector_append(&files, file);
tagged_files[tagged_count]->filename = strdup(files_e[z]->filename);
tagged_files[tagged_count]->dir = files_e[z]->dir;
tagged_files[tagged_count]->sub = files_e[z]->sub;
tagged_files[tagged_count]->fid = files_e[z]->fid;
tagged_count++; tagged_count++;
tagged_files = (struct tagged_file **)ptr_vector_ptrs(&files);
s_printf(get_string(71), basename(files_e[z]->filename)); s_printf(get_string(71), basename(files_e[z]->filename));
} else { } else {
s_printf(get_string(72)); s_printf(get_string(72));
@ -1171,17 +1159,14 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} }
} }
if (match == 0) { if (match == 0) {
if (tagged_count == 0) { struct tagged_file *file = (struct tagged_file *)malloz(sizeof(struct tagged_file));
tagged_files = (struct tagged_file **)malloz(sizeof(struct tagged_file *)); file->filename = strdup(files_e[z]->filename);
} else { file->dir = files_e[z]->dir;
tagged_files = (struct tagged_file **)realloc(tagged_files, sizeof(struct tagged_file *) * (tagged_count + 1)); file->sub = files_e[z]->sub;
} file->fid = files_e[z]->fid;
tagged_files[tagged_count] = (struct tagged_file *)malloz(sizeof(struct tagged_file)); ptr_vector_append(&files, file);
tagged_files[tagged_count]->filename = strdup(files_e[z]->filename);
tagged_files[tagged_count]->dir = files_e[z]->dir;
tagged_files[tagged_count]->sub = files_e[z]->sub;
tagged_files[tagged_count]->fid = files_e[z]->fid;
tagged_count++; tagged_count++;
tagged_files = (struct tagged_file **)ptr_vector_ptrs(&files);
s_printf(get_string(71), basename(files_e[z]->filename)); s_printf(get_string(71), basename(files_e[z]->filename));
} else { } else {
s_printf(get_string(72)); s_printf(get_string(72));
@ -1201,7 +1186,7 @@ void file_search() {
char buffer[PATH_MAX]; char buffer[PATH_MAX];
char sqlbuffer[1024]; char sqlbuffer[1024];
char **searchterms; char **searchterms;
int searchterm_count = 0; size_t searchterm_count = 0;
char *ptr; char *ptr;
int i; int i;
int j; int j;
@ -1212,6 +1197,7 @@ void file_search() {
int rc; int rc;
int files_c; int files_c;
struct file_entry **files_e; struct file_entry **files_e;
struct ptr_vector files;
s_printf(get_string(236)); s_printf(get_string(236));
ch = s_getc(); ch = s_getc();
@ -1240,18 +1226,9 @@ void file_search() {
s_printf(get_string(238)); s_printf(get_string(238));
return; return;
} }
ptr = strtok(buffer, " "); searchterms = split_on_space(buffer, &searchterm_count);
while (ptr != NULL) { for (size_t i = 0; i < searchterm_count; ++i) {
if (searchterm_count == 0) { searchterms[i] = str3dup("%%", searchterms[i], "%%");
searchterms = (char **)malloz(sizeof(char *));
} else {
searchterms = (char **)realloc(searchterms, sizeof(char *) * (searchterm_count + 1));
}
searchterms[searchterm_count] = malloz(strlen(ptr) + 3);
sprintf(searchterms[searchterm_count], "%%%s%%", ptr);
searchterm_count++;
ptr = strtok(NULL, " ");
} }
if (stype == 0) { if (stype == 0) {
snprintf(sqlbuffer, 1024, "select id, filename, description, size, dlcount, uploaddate from files where approved=1 AND (filename LIKE ?"); snprintf(sqlbuffer, 1024, "select id, filename, description, size, dlcount, uploaddate from files where approved=1 AND (filename LIKE ?");
@ -1314,23 +1291,21 @@ void file_search() {
} }
} }
init_ptr_vector(&files);
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {
if (files_c == 0) { struct file_entry *file = (struct file_entry *)malloz(sizeof(struct file_entry));
files_e = (struct file_entry **)malloz(sizeof(struct file_entry *)); file->fid = sqlite3_column_int(res, 0);
} else { file->filename = strdup((char *)sqlite3_column_text(res, 1));
files_e = (struct file_entry **)realloc(files_e, sizeof(struct file_entry *) * (files_c + 1)); file->description = strdup((char *)sqlite3_column_text(res, 2));
} file->size = sqlite3_column_int(res, 3);
files_e[files_c] = (struct file_entry *)malloz(sizeof(struct file_entry)); file->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->fid = sqlite3_column_int(res, 0); file->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->filename = strdup((char *)sqlite3_column_text(res, 1)); file->dir = gUser->cur_file_dir;
files_e[files_c]->description = strdup((char *)sqlite3_column_text(res, 2)); file->sub = gUser->cur_file_sub;
files_e[files_c]->size = sqlite3_column_int(res, 3); ptr_vector_append(&files, file);
files_e[files_c]->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->dir = gUser->cur_file_dir;
files_e[files_c]->sub = gUser->cur_file_sub;
files_c++;
} }
files_c = ptr_vector_len(&files);
files_e = (struct file_entry **)consume_ptr_vector(&files);
sqlite3_finalize(res); sqlite3_finalize(res);
sqlite3_close(db); sqlite3_close(db);
@ -1376,23 +1351,22 @@ void file_search() {
} }
} }
init_ptr_vector(&files);
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {
if (files_c == 0) { struct file_entry *file = (struct file_entry *)malloz(sizeof(struct file_entry));
files_e = (struct file_entry **)malloz(sizeof(struct file_entry *)); file->fid = sqlite3_column_int(res, 0);
} else { file->filename = strdup((char *)sqlite3_column_text(res, 1));
files_e = (struct file_entry **)realloc(files_e, sizeof(struct file_entry *) * (files_c + 1)); file->description = strdup((char *)sqlite3_column_text(res, 2));
} file->size = sqlite3_column_int(res, 3);
files_e[files_c] = (struct file_entry *)malloz(sizeof(struct file_entry)); file->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->fid = sqlite3_column_int(res, 0); file->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->filename = strdup((char *)sqlite3_column_text(res, 1)); file->dir = gUser->cur_file_dir;
files_e[files_c]->description = strdup((char *)sqlite3_column_text(res, 2)); file->sub = gUser->cur_file_sub;
files_e[files_c]->size = sqlite3_column_int(res, 3); ptr_vector_append(&files, file);
files_e[files_c]->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->dir = gUser->cur_file_dir;
files_e[files_c]->sub = gUser->cur_file_sub;
files_c++;
} }
files_c = ptr_vector_len(&files);
files_e = (struct file_entry **)consume_ptr_vector(&files);
sqlite3_finalize(res); sqlite3_finalize(res);
sqlite3_close(db); sqlite3_close(db);
} }
@ -1422,6 +1396,7 @@ void list_files(struct user_record *user) {
char ch; char ch;
struct file_entry **files_e; struct file_entry **files_e;
struct ptr_vector files;
s_printf(get_string(233)); s_printf(get_string(233));
ch = s_getc(); ch = s_getc();
@ -1461,25 +1436,22 @@ void list_files(struct user_record *user) {
sqlite3_bind_int(res, 1, userlaston); sqlite3_bind_int(res, 1, userlaston);
} }
files_c = 0; init_ptr_vector(&files);
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {
if (files_c == 0) { struct file_entry *file = (struct file_entry *)malloz(sizeof(struct file_entry));
files_e = (struct file_entry **)malloz(sizeof(struct file_entry *)); file->fid = sqlite3_column_int(res, 0);
} else { file->filename = strdup((char *)sqlite3_column_text(res, 1));
files_e = (struct file_entry **)realloc(files_e, sizeof(struct file_entry *) * (files_c + 1)); file->description = strdup((char *)sqlite3_column_text(res, 2));
} file->size = sqlite3_column_int(res, 3);
files_e[files_c] = (struct file_entry *)malloz(sizeof(struct file_entry)); file->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->fid = sqlite3_column_int(res, 0); file->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->filename = strdup((char *)sqlite3_column_text(res, 1)); file->dir = user->cur_file_dir;
files_e[files_c]->description = strdup((char *)sqlite3_column_text(res, 2)); file->sub = user->cur_file_sub;
files_e[files_c]->size = sqlite3_column_int(res, 3); ptr_vector_append(&files, file);
files_e[files_c]->dlcount = sqlite3_column_int(res, 4);
files_e[files_c]->uploaddate = sqlite3_column_int(res, 5);
files_e[files_c]->dir = user->cur_file_dir;
files_e[files_c]->sub = user->cur_file_sub;
files_c++;
} }
files_c = ptr_vector_len(&files);
files_e = (struct file_entry **)consume_ptr_vector(&files);
sqlite3_finalize(res); sqlite3_finalize(res);
sqlite3_close(db); sqlite3_close(db);
@ -1504,21 +1476,19 @@ void choose_subdir() {
int start = 0; int start = 0;
int selected = 0; int selected = 0;
char c; char c;
struct ptr_vector subs;
init_ptr_vector(&subs);
for (i = 0; i < conf.file_directories[gUser->cur_file_dir]->file_sub_count; i++) { for (i = 0; i < conf.file_directories[gUser->cur_file_dir]->file_sub_count; i++) {
if (conf.file_directories[gUser->cur_file_dir]->file_subs[i]->download_sec_level <= gUser->sec_level) { if (conf.file_directories[gUser->cur_file_dir]->file_subs[i]->download_sec_level <= gUser->sec_level) {
if (list_tmp == 0) { struct subdir_tmp_t *sub = (struct subdir_tmp_t *)malloz(sizeof(struct subdir_tmp_t));
sub_tmp = (struct subdir_tmp_t **)malloz(sizeof(struct subdir_tmp_t *)); sub->sub = conf.file_directories[gUser->cur_file_dir]->file_subs[i];
} else { sub->index = i;
sub_tmp = (struct subdir_tmp_t **)realloc(sub_tmp, sizeof(struct subdir_tmp_t *) * (list_tmp + 1)); ptr_vector_append(&subs, sub);
}
sub_tmp[list_tmp] = (struct subdir_tmp_t *)malloz(sizeof(struct subdir_tmp_t));
sub_tmp[list_tmp]->sub = conf.file_directories[gUser->cur_file_dir]->file_subs[i];
sub_tmp[list_tmp]->index = i;
list_tmp++;
} }
} }
list_tmp = ptr_vector_len(&subs);
sub_tmp = (struct subdir_tmp_t **)consume_ptr_vector(&subs);
while (1) { while (1) {
if (redraw) { if (redraw) {
@ -1642,21 +1612,19 @@ void choose_directory() {
int start = 0; int start = 0;
int selected = 0; int selected = 0;
char c; char c;
struct ptr_vector dirs;
init_ptr_vector(&dirs);
for (i = 0; i < conf.file_directory_count; i++) { for (i = 0; i < conf.file_directory_count; i++) {
if (conf.file_directories[i]->sec_level <= gUser->sec_level) { if (conf.file_directories[i]->sec_level <= gUser->sec_level) {
if (list_tmp == 0) { struct dir_tmp_t *dir = (struct dir_tmp_t *)malloz(sizeof(struct dir_tmp_t));
dir_tmp = (struct dir_tmp_t **)malloz(sizeof(struct dir_tmp_t *)); dir->dir = conf.file_directories[i];
} else { dir->index = i;
dir_tmp = (struct dir_tmp_t **)realloc(dir_tmp, sizeof(struct dir_tmp_t *) * (list_tmp + 1)); ptr_vector_append(&dirs, dir);
}
dir_tmp[list_tmp] = (struct dir_tmp_t *)malloz(sizeof(struct dir_tmp_t));
dir_tmp[list_tmp]->dir = conf.file_directories[i];
dir_tmp[list_tmp]->index = i;
list_tmp++;
} }
} }
list_tmp = ptr_vector_len(&dirs);
dir_tmp = (struct dir_tmp_t **)consume_ptr_vector(&dirs);
while (1) { while (1) {
if (redraw) { if (redraw) {

View File

@ -1,53 +1,55 @@
#include "bbs.h" #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "bbs.h"
extern struct bbs_config conf; extern struct bbs_config conf;
char *undefined = "Undefined String"; char *undefined = "Undefined String";
char **strings; static struct ptr_vector strings;
int string_count; int string_count;
void chomp(char *string) { void chomp(char *str) {
while (strlen(string) && (string[strlen(string) - 1] == '\r' || string[strlen(string) - 1] == '\n')) { char *end;
string[strlen(string) - 1] = '\0'; assert(str != NULL);
size_t len = strlen(str);
if (len == 0) {
return;
}
end = str + len - 1;
while (end != str && (*end == '\r' || *end == '\n')) {
*end-- = '\0';
} }
} }
char *parse_newlines(char *string) { char *parse_newlines(char *str) {
char *newstring = (char *)malloz(strlen(string) + 1); char *nstring = strdup(str);
int pos = 0; char *s, *p;
int i; for (s = p = nstring; *s != '\0'; ++s) {
for (i = 0; i < strlen(string); i++) { if (*s != '\\') {
if (string[i] == '\\') { *p++ = *s;
if (i < strlen(string) - 1) { continue;
i++; }
if (string[i] == 'n') { switch (*++s) {
newstring[pos++] = '\n'; case '\0': continue;
} else if (string[i] == 'r') { case 'n': *p++ = '\n'; break;
newstring[pos++] = '\r'; case 'r': *p++ = '\r'; break;
} else if (string[i] == '\\') { case 'e': *p++ = '\e'; break;
newstring[pos++] = '\\'; case '\\': *p++ = '\\'; break;
} else if (string[i] == 'e') {
newstring[pos++] = '\e';
}
newstring[pos] = '\0';
}
} else {
newstring[pos++] = string[i];
newstring[pos] = '\0';
} }
} }
return newstring; *p = '\0';
return nstring;
} }
char *get_string(int offset) { char *get_string(int offset) {
if (offset >= string_count) { char *str = ptr_vector_get(&strings, offset);
if (str == NULL) {
return undefined; return undefined;
} }
return str;
return strings[offset];
} }
void load_strings() { void load_strings() {
@ -65,19 +67,30 @@ void load_strings() {
exit(-1); exit(-1);
} }
string_count = 0; init_ptr_vector(&strings);
fgets(buffer, 1024, fptr); fgets(buffer, 1024, fptr);
while (!feof(fptr)) { while (!feof(fptr)) {
chomp(buffer); chomp(buffer);
if (string_count == 0) { ptr_vector_append(&strings, parse_newlines(buffer));
strings = (char **)malloz(sizeof(char *));
} else {
strings = (char **)realloc(strings, sizeof(char *) * (string_count + 1));
}
strings[string_count] = parse_newlines(buffer);
string_count++;
fgets(buffer, 1024, fptr); fgets(buffer, 1024, fptr);
} }
fclose(fptr); fclose(fptr);
} }
char **split_on_space(char *str, size_t *lenp) {
struct ptr_vector tokens;
char *token;
init_ptr_vector(&tokens);
token = strtok(str, " ");
ptr_vector_append(&tokens, token);
while (token != NULL) {
token = strtok(NULL, " ");
ptr_vector_append(&tokens, token);
}
if (lenp != NULL) {
*lenp = ptr_vector_len(&tokens);
}
return (char **)consume_ptr_vector(&tokens);
}

View File

@ -153,6 +153,11 @@ size_t ptr_vector_len(struct ptr_vector *vec) {
return vec->len; return vec->len;
} }
void **ptr_vector_ptrs(struct ptr_vector *vec) {
assert(vec != NULL);
return vec->ptrs;
}
void **consume_ptr_vector(struct ptr_vector *vec) { void **consume_ptr_vector(struct ptr_vector *vec) {
assert(vec != NULL); assert(vec != NULL);
void **ps = realloc(vec->ptrs, vec->len * sizeof(void *)); void **ps = realloc(vec->ptrs, vec->len * sizeof(void *));