diff --git a/include/util.h b/include/util.h index 4384d4e..ce550ed 100644 --- a/include/util.h +++ b/include/util.h @@ -4,6 +4,7 @@ #include "libds.h" #include "liblex.h" #include "result.h" +#include /** * Converts a result code from liblex to libabacus. @@ -17,5 +18,31 @@ libab_result libab_convert_lex_result(liblex_result to_convert); * @return the libabacus equivalent of the error code. */ libab_result libab_convert_ds_result(libds_result to_convert); +/** + * Copies a range of the given string into a new, null-terminated string allocated + * on the heap. + * @param destination the pointer to populate with the newly created string. + * @param source the source from which to pull character information from. + * @param from the index (inclusive) at which to begin copying. + * @param to the index (exclusive) at which to end copying. + * @return the result of the operation. + */ +libab_result libab_copy_string_range(char** destination, const char* source, size_t from, size_t to); +/** + * Copies the given string, starting at 0 and copying length bytes. + * @param destination the pointer to populate with the newly created string. + * @param source to source string to copy. + * @param length the number of bytes to copy. + * @return the result of the operation. + */ +libab_result libab_copy_string_size(char** destination, const char* source, size_t length); +/** + * Copies the entire string into a null-terminated string allocated + * on the heap. + * @param destination the pointer to populate with the newly allocated string. + * @param source the source string to copy. + * @return the result of the operation. + */ +libab_result libab_copy_string(char** destination, const char* source); #endif diff --git a/src/util.c b/src/util.c index a155aa8..c050272 100644 --- a/src/util.c +++ b/src/util.c @@ -1,4 +1,5 @@ #include "util.h" +#include libab_result libab_convert_lex_result(liblex_result to_convert) { libab_result result = LIBAB_SUCCESS; @@ -18,3 +19,20 @@ libab_result libab_convert_ds_result(libds_result to_convert) { } return result; } +libab_result libab_copy_string_range(char** destination, const char* source, size_t from, size_t to) { + libab_result result = LIBAB_SUCCESS; + size_t string_length = to - from; + if((*destination = malloc(string_length + 1)) == NULL) { + result = LIBAB_MALLOC; + } else { + strncpy(*destination, source + from, string_length); + (*destination)[string_length] = '\0'; + } + return result; +} +libab_result libab_copy_string_size(char** destination, const char* source, size_t length) { + return libab_copy_string_range(destination, source, 0, length); +} +libab_result libab_copy_string(char** destination, const char* source) { + return libab_copy_string_range(destination, source, 0, strlen(source)); +}