Compare commits
No commits in common. "e06e65e5e8b9eaae5c69fcd360ebe54727777ca1" and "69051a6c24654ef43fa2726b23cef198d8ea2e4b" have entirely different histories.
e06e65e5e8
...
69051a6c24
7 changed files with 6 additions and 175 deletions
|
@ -39,7 +39,4 @@ add_executable(test_simplearchiver
|
||||||
src/test.c
|
src/test.c
|
||||||
src/parser.c
|
src/parser.c
|
||||||
src/helpers.c
|
src/helpers.c
|
||||||
src/algorithms/linear_congruential_gen.c
|
|
||||||
src/data_structures/linked_list.c
|
|
||||||
src/data_structures/hash_map.c
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -89,11 +89,6 @@ unsigned long long simple_archiver_hash_map_internal_key_to_hash(
|
||||||
return simple_archiver_algo_lcg_defaults(seed);
|
return simple_archiver_algo_lcg_defaults(seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void simple_archiver_hash_map_internal_no_free_fn(
|
|
||||||
__attribute__((unused)) void *unused) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns 0 on success.
|
/// Returns 0 on success.
|
||||||
int simple_archiver_hash_map_internal_rehash(SDArchiverHashMap **hash_map) {
|
int simple_archiver_hash_map_internal_rehash(SDArchiverHashMap **hash_map) {
|
||||||
if (!hash_map || !*hash_map) {
|
if (!hash_map || !*hash_map) {
|
||||||
|
@ -121,8 +116,7 @@ int simple_archiver_hash_map_internal_rehash(SDArchiverHashMap **hash_map) {
|
||||||
simple_archiver_hash_map_insert(&new_hash_map, data->value, data->key,
|
simple_archiver_hash_map_insert(&new_hash_map, data->value, data->key,
|
||||||
data->key_size, data->value_cleanup_fn,
|
data->key_size, data->value_cleanup_fn,
|
||||||
data->key_cleanup_fn);
|
data->key_cleanup_fn);
|
||||||
data->key_cleanup_fn = simple_archiver_hash_map_internal_no_free_fn;
|
node->data = NULL;
|
||||||
data->value_cleanup_fn = simple_archiver_hash_map_internal_no_free_fn;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,19 +153,6 @@ int main(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
simple_archiver_hash_map_free(&hash_map);
|
simple_archiver_hash_map_free(&hash_map);
|
||||||
|
|
||||||
// Rehash test for Memcheck.
|
|
||||||
hash_map = simple_archiver_hash_map_init();
|
|
||||||
for (unsigned int idx = 0; idx < SC_SA_DS_HASH_MAP_START_BUCKET_SIZE + 1;
|
|
||||||
++idx) {
|
|
||||||
unsigned int *copy_value = malloc(sizeof(unsigned int));
|
|
||||||
*copy_value = idx;
|
|
||||||
unsigned int *copy_key = malloc(sizeof(unsigned int));
|
|
||||||
*copy_key = idx;
|
|
||||||
simple_archiver_hash_map_insert(&hash_map, copy_value, copy_key,
|
|
||||||
sizeof(unsigned int), NULL, NULL);
|
|
||||||
}
|
|
||||||
simple_archiver_hash_map_free(&hash_map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test PriorityHeap.
|
// Test PriorityHeap.
|
||||||
|
|
13
src/main.c
13
src/main.c
|
@ -20,12 +20,6 @@
|
||||||
|
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
int print_list_fn(void *data, __attribute__((unused)) void *ud) {
|
|
||||||
const char *cstr = data;
|
|
||||||
printf(" %s\n", cstr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
simple_archiver_print_usage();
|
simple_archiver_print_usage();
|
||||||
|
|
||||||
|
@ -34,12 +28,5 @@ int main(int argc, const char **argv) {
|
||||||
|
|
||||||
simple_archiver_parse_args(argc, argv, &parsed);
|
simple_archiver_parse_args(argc, argv, &parsed);
|
||||||
|
|
||||||
__attribute__((cleanup(simple_archiver_list_free)))
|
|
||||||
SDArchiverLinkedList *filenames =
|
|
||||||
simple_archiver_parsed_to_filenames(&parsed);
|
|
||||||
|
|
||||||
puts("Filenames:");
|
|
||||||
simple_archiver_list_get(filenames, print_list_fn, NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
124
src/parser.c
124
src/parser.c
|
@ -22,16 +22,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "data_structures/hash_map.h"
|
|
||||||
#include "data_structures/linked_list.h"
|
|
||||||
#include "parser_internal.h"
|
#include "parser_internal.h"
|
||||||
#include "platforms.h"
|
|
||||||
|
|
||||||
/// Gets the first non "./"-like character in the filename.
|
/// Gets the first non "./"-like character in the filename.
|
||||||
unsigned int simple_archiver_parser_internal_filename_idx(
|
unsigned int simple_archiver_parser_internal_filename_idx(
|
||||||
|
@ -84,22 +75,6 @@ unsigned int simple_archiver_parser_internal_filename_idx(
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
int list_get_last_fn(void *data, void *ud) {
|
|
||||||
char **last = ud;
|
|
||||||
*last = data;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void container_no_free_fn(__attribute__((unused)) void *data) { return; }
|
|
||||||
|
|
||||||
int list_remove_same_str_fn(void *data, void *ud) {
|
|
||||||
if (strcmp((char *)data, (char *)ud) == 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void simple_archiver_print_usage(void) {
|
void simple_archiver_print_usage(void) {
|
||||||
puts("Usage flags:");
|
puts("Usage flags:");
|
||||||
puts("-c : create archive file");
|
puts("-c : create archive file");
|
||||||
|
@ -241,102 +216,3 @@ void simple_archiver_free_parsed(SDArchiverParsed *parsed) {
|
||||||
parsed->working_files = NULL;
|
parsed->working_files = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
|
||||||
const SDArchiverParsed *parsed) {
|
|
||||||
SDArchiverLinkedList *files_list = simple_archiver_list_init();
|
|
||||||
__attribute__((cleanup(simple_archiver_hash_map_free)))
|
|
||||||
SDArchiverHashMap *hash_map = simple_archiver_hash_map_init();
|
|
||||||
int hash_map_sentinel = 1;
|
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
|
||||||
for (char **iter = parsed->working_files; iter && *iter; ++iter) {
|
|
||||||
struct stat st;
|
|
||||||
stat(*iter, &st);
|
|
||||||
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
|
||||||
// Is a regular file.
|
|
||||||
int len = strlen(*iter) + 1;
|
|
||||||
char *filename = malloc(len);
|
|
||||||
strncpy(filename, *iter, len);
|
|
||||||
if (simple_archiver_hash_map_get(hash_map, filename, len - 1) == NULL) {
|
|
||||||
simple_archiver_list_add(files_list, filename, NULL);
|
|
||||||
simple_archiver_hash_map_insert(&hash_map, &hash_map_sentinel, filename,
|
|
||||||
len - 1, container_no_free_fn,
|
|
||||||
container_no_free_fn);
|
|
||||||
} else {
|
|
||||||
free(filename);
|
|
||||||
}
|
|
||||||
} else if ((st.st_mode & S_IFMT) == S_IFDIR) {
|
|
||||||
// Is a directory. TODO handle this.
|
|
||||||
__attribute__((cleanup(simple_archiver_list_free)))
|
|
||||||
SDArchiverLinkedList *dir_list = simple_archiver_list_init();
|
|
||||||
simple_archiver_list_add(dir_list, *iter, container_no_free_fn);
|
|
||||||
char *next;
|
|
||||||
while (dir_list->count != 0) {
|
|
||||||
simple_archiver_list_get(dir_list, list_get_last_fn, &next);
|
|
||||||
if (!next) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
DIR *dir = opendir(next);
|
|
||||||
struct dirent *dir_entry;
|
|
||||||
do {
|
|
||||||
dir_entry = readdir(dir);
|
|
||||||
if (dir_entry) {
|
|
||||||
if (strcmp(dir_entry->d_name, ".") == 0 ||
|
|
||||||
strcmp(dir_entry->d_name, "..") == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
printf("dir entry in %s is %s\n", next, dir_entry->d_name);
|
|
||||||
int combined_size = strlen(next) + strlen(dir_entry->d_name) + 2;
|
|
||||||
char *combined_path = malloc(combined_size);
|
|
||||||
snprintf(combined_path, combined_size, "%s/%s", next,
|
|
||||||
dir_entry->d_name);
|
|
||||||
stat(combined_path, &st);
|
|
||||||
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
|
||||||
// Is a file.
|
|
||||||
if (simple_archiver_hash_map_get(hash_map, combined_path,
|
|
||||||
combined_size - 1) == NULL) {
|
|
||||||
simple_archiver_list_add(files_list, combined_path, NULL);
|
|
||||||
simple_archiver_hash_map_insert(
|
|
||||||
&hash_map, &hash_map_sentinel, combined_path,
|
|
||||||
combined_size - 1, container_no_free_fn,
|
|
||||||
container_no_free_fn);
|
|
||||||
} else {
|
|
||||||
free(combined_path);
|
|
||||||
}
|
|
||||||
} else if ((st.st_mode & S_IFMT) == S_IFDIR) {
|
|
||||||
// Is a directory.
|
|
||||||
simple_archiver_list_add_front(dir_list, combined_path, NULL);
|
|
||||||
} else {
|
|
||||||
// Unhandled type.
|
|
||||||
free(combined_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (dir_entry != NULL);
|
|
||||||
closedir(dir);
|
|
||||||
if (simple_archiver_list_remove(dir_list, list_remove_same_str_fn,
|
|
||||||
next) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Unhandled type.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Remove leading "./" entries from files_list.
|
|
||||||
for (SDArchiverLLNode *iter = files_list->head->next;
|
|
||||||
iter != files_list->tail; iter = iter->next) {
|
|
||||||
unsigned int idx = simple_archiver_parser_internal_filename_idx(iter->data);
|
|
||||||
if (idx > 0) {
|
|
||||||
int len = strlen((char *)iter->data) + 1 - idx;
|
|
||||||
char *substr = malloc(len);
|
|
||||||
strncpy(substr, (char *)iter->data + idx, len);
|
|
||||||
free(iter->data);
|
|
||||||
iter->data = substr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return files_list;
|
|
||||||
}
|
|
||||||
|
|
15
src/parser.h
15
src/parser.h
|
@ -19,8 +19,6 @@
|
||||||
#ifndef SEODISPARATE_COM_SIMPLE_ARCHIVER_PARSER_H_
|
#ifndef SEODISPARATE_COM_SIMPLE_ARCHIVER_PARSER_H_
|
||||||
#define SEODISPARATE_COM_SIMPLE_ARCHIVER_PARSER_H_
|
#define SEODISPARATE_COM_SIMPLE_ARCHIVER_PARSER_H_
|
||||||
|
|
||||||
#include "data_structures/linked_list.h"
|
|
||||||
|
|
||||||
typedef struct SDArchiverParsed {
|
typedef struct SDArchiverParsed {
|
||||||
/// Each bit is a flag.
|
/// Each bit is a flag.
|
||||||
/// 0b0 - is creating.
|
/// 0b0 - is creating.
|
||||||
|
@ -38,19 +36,16 @@ typedef struct SDArchiverParsed {
|
||||||
char **working_files;
|
char **working_files;
|
||||||
} SDArchiverParsed;
|
} SDArchiverParsed;
|
||||||
|
|
||||||
void simple_archiver_print_usage(void);
|
extern void simple_archiver_print_usage(void);
|
||||||
|
|
||||||
SDArchiverParsed simple_archiver_create_parsed(void);
|
extern SDArchiverParsed simple_archiver_create_parsed(void);
|
||||||
|
|
||||||
/// Expects the user to pass a pointer to an SDArchiverParsed.
|
/// Expects the user to pass a pointer to an SDArchiverParsed.
|
||||||
/// This means the user should have a SDArchiverParsed variable
|
/// This means the user should have a SDArchiverParsed variable
|
||||||
/// and it should be passed with e.g. "&var".
|
/// and it should be passed with e.g. "&var".
|
||||||
int simple_archiver_parse_args(int argc, const char **argv,
|
extern int simple_archiver_parse_args(int argc, const char **argv,
|
||||||
SDArchiverParsed *out);
|
SDArchiverParsed *out);
|
||||||
|
|
||||||
void simple_archiver_free_parsed(SDArchiverParsed *parsed);
|
extern void simple_archiver_free_parsed(SDArchiverParsed *parsed);
|
||||||
|
|
||||||
SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
|
||||||
const SDArchiverParsed *parsed);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* compiled for.
|
* compiled for.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SEODISPARATE_COM_SIMPLE_ARCHIVER_PLATFORMS_H_
|
|
||||||
#define SEODISPARATE_COM_SIMPLE_ARCHIVER_PLATFORMS_H_
|
|
||||||
|
|
||||||
// Determine platform macros
|
// Determine platform macros
|
||||||
#define SIMPLE_ARCHIVER_PLATFORM_WINDOWS 1
|
#define SIMPLE_ARCHIVER_PLATFORM_WINDOWS 1
|
||||||
#define SIMPLE_ARCHIVER_PLATFORM_MAC 2
|
#define SIMPLE_ARCHIVER_PLATFORM_MAC 2
|
||||||
|
@ -38,5 +35,3 @@
|
||||||
#else
|
#else
|
||||||
#define SIMPLE_ARCHIVER_PLATFORM SIMPLE_ARCHIVER_PLATFORM_UNKNOWN
|
#define SIMPLE_ARCHIVER_PLATFORM SIMPLE_ARCHIVER_PLATFORM_UNKNOWN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Reference in a new issue