248 lines
4.3 KiB
C
248 lines
4.3 KiB
C
#include "../include/utils.h"
|
|
|
|
/**
|
|
* @brief Appends a character to the specified position of string
|
|
*
|
|
* @param str
|
|
* @param pos
|
|
* @param ch
|
|
*/
|
|
void append_to_pos(char **str, int pos, char ch)
|
|
{
|
|
size_t len = strlen(*str);
|
|
if (pos <= len + 1)
|
|
{
|
|
*str = realloc(*str, len + 2);
|
|
|
|
for (int i = len; i >= pos; i--)
|
|
{
|
|
(*str)[i + 1] = (*str)[i];
|
|
}
|
|
(*str)[pos] = ch;
|
|
(*str)[len + 1] = '\0';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Removes a character located in the specified position
|
|
*
|
|
* @param str
|
|
* @param pos
|
|
*/
|
|
void remove_on_pos(char **str, int pos)
|
|
{
|
|
size_t len = strlen(*str);
|
|
if (pos <= len)
|
|
{
|
|
for (int i = pos - 1; i < len; i++)
|
|
(*str)[i] = (*str)[i + 1];
|
|
|
|
(*str)[len] = '\0';
|
|
*str = realloc(*str, len);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Separates string with "sep" characters
|
|
*
|
|
* @param line
|
|
* @param toks
|
|
* @param sep
|
|
* @return int
|
|
*/
|
|
int sep_string(char *line, char ***toks, char *sep)
|
|
{
|
|
free(*toks);
|
|
char *tmp_line = strdup(line);
|
|
char *free_tmp_line = tmp_line;
|
|
int n = 0;
|
|
*toks = calloc(n, sizeof(char *));
|
|
|
|
char *tmp = NULL;
|
|
while ((tmp = strsep(&tmp_line, sep)) != NULL)
|
|
{
|
|
n++;
|
|
*toks = realloc(*toks, sizeof(char *) * n);
|
|
(*toks)[n - 1] = strdup(tmp);
|
|
}
|
|
|
|
free(free_tmp_line);
|
|
|
|
return n;
|
|
}
|
|
|
|
/**
|
|
* @brief Removes extra spaces
|
|
*
|
|
* @param str
|
|
* @return char*
|
|
*/
|
|
char *trim_string(char *str, bool leave_trailing_space)
|
|
{
|
|
char *tmp = strdup(str);
|
|
while (tmp[0] == ' ')
|
|
remove_on_pos(&tmp, 1);
|
|
|
|
for (int i = 1; i < strlen(tmp); i++)
|
|
if (tmp[i] == ' ' && tmp[i - 1] == ' ')
|
|
{
|
|
remove_on_pos(&tmp, i);
|
|
i--;
|
|
}
|
|
|
|
if (!leave_trailing_space)
|
|
if (tmp[strlen(tmp) - 1] == ' ' && tmp[strlen(tmp) - 2] == ' ')
|
|
remove_on_pos(&tmp, strlen(tmp) - 1);
|
|
|
|
return tmp;
|
|
}
|
|
|
|
/**
|
|
* @brief Frees array of strings
|
|
*
|
|
* @param arr
|
|
* @param sz
|
|
*/
|
|
void free_str_arr(char **arr, int sz)
|
|
{
|
|
if (arr[0] != NULL)
|
|
for (int i = 0; i < sz; i++)
|
|
free(arr[i]);
|
|
free(arr);
|
|
}
|
|
|
|
/**
|
|
* @brief Creates a slice of array
|
|
*
|
|
* @param arr
|
|
* @param beg
|
|
* @param end
|
|
* @param asc
|
|
* @return char**
|
|
*/
|
|
char **slice_array(char **arr, int beg, int end, bool asc)
|
|
{
|
|
if (beg == -1)
|
|
beg = 0;
|
|
if (end == -1)
|
|
end = get_null_term_arr_size(arr);
|
|
|
|
char **new_arr = calloc(abs(end - beg), sizeof(char *));
|
|
|
|
if (asc)
|
|
for (int i = beg, j = 0; i < end; i++, j++)
|
|
new_arr[j] = arr[i];
|
|
else
|
|
for (int i = end, j = 0; i > beg; i--, j++)
|
|
new_arr[j] = arr[i];
|
|
|
|
return new_arr;
|
|
}
|
|
|
|
/**
|
|
* @brief Gets size of null-terminated array
|
|
*
|
|
* @param arr
|
|
* @return int
|
|
*/
|
|
int get_null_term_arr_size(char **arr)
|
|
{
|
|
int k = 0;
|
|
for (int i = 0; arr[i] != NULL; i++)
|
|
k++;
|
|
|
|
return ++k;
|
|
}
|
|
|
|
/**
|
|
* @brief Append string to the end of array
|
|
*
|
|
* @param arr
|
|
* @param sz
|
|
* @param str
|
|
* @return int
|
|
*/
|
|
int append_to_str_arr(char ***arr, ssize_t *sz, char *str)
|
|
{
|
|
(*sz)++;
|
|
|
|
char **tmp = realloc(*arr, sizeof(char *) * *sz);
|
|
if (tmp == NULL)
|
|
{
|
|
fprintf(stderr, "Couldn't reallocate memory\n");
|
|
return -1;
|
|
}
|
|
*arr = tmp;
|
|
|
|
(*arr)[*sz - 1] = strdup(str);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the current location
|
|
*
|
|
* @return char*
|
|
*/
|
|
char *get_curr_dir_name()
|
|
{
|
|
char *pwd = malloc(FILENAME_MAX);
|
|
getcwd(pwd, FILENAME_MAX);
|
|
|
|
return pwd;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the number of lines in file
|
|
*
|
|
* @param file
|
|
* @return int
|
|
*/
|
|
int get_num_of_lines(FILE *file)
|
|
{
|
|
int n = 0;
|
|
int ch, pch;
|
|
long curr_pos = ftell(file);
|
|
|
|
fseek(file, 0, SEEK_SET);
|
|
|
|
while ((ch = fgetc(file)) != EOF)
|
|
{
|
|
if (ch == '\n')
|
|
n++;
|
|
pch = ch;
|
|
}
|
|
|
|
if (pch != '\n')
|
|
n++;
|
|
|
|
fseek(file, curr_pos, SEEK_SET);
|
|
|
|
return n;
|
|
}
|
|
|
|
bool str_is_in_arr(char **arr, size_t sz, char *str)
|
|
{
|
|
int first = 0;
|
|
int last = sz - 1;
|
|
int middle;
|
|
|
|
while (first <= last)
|
|
{
|
|
middle = (first + last) / 2;
|
|
int diff = strcmp(arr[middle], str);
|
|
if (diff > 0)
|
|
{
|
|
first = middle + 1;
|
|
}
|
|
else if (diff == 0)
|
|
return true;
|
|
else
|
|
{
|
|
last = middle - 1;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|