Added projects tab and local projects list processing. Fxed some memory errors
This commit is contained in:
104
src/projects_p/projects.c
Normal file
104
src/projects_p/projects.c
Normal file
@ -0,0 +1,104 @@
|
||||
#include "../../include/projects_p/projects.h"
|
||||
#include "../../include/utils_op/arr.h"
|
||||
#include "../../include/file_op/file.h"
|
||||
|
||||
ssize_t read_list(project_t **list)
|
||||
{
|
||||
FILE *fp = fopen("static/projects/list.db", "r");
|
||||
if (fp == NULL)
|
||||
{
|
||||
perror("couldn't open projectDB file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *buff = NULL;
|
||||
size_t length = LINE_LENGTH;
|
||||
size_t projects_amount = 0;
|
||||
|
||||
while (getline(&buff, &length, fp) > 0)
|
||||
{
|
||||
if (buff[strlen(buff) - 1] == '\n')
|
||||
buff[strlen(buff) - 1] = '\0';
|
||||
|
||||
if (strlen(buff) == 0)
|
||||
continue;
|
||||
|
||||
projects_amount++;
|
||||
|
||||
*list = realloc(*list, sizeof(project_t) * projects_amount);
|
||||
|
||||
char *tmp = strdup(buff), *rest = tmp;
|
||||
|
||||
(*list)[projects_amount - 1].title = strdup(strtok_r(tmp, ";", &rest));
|
||||
|
||||
(*list)[projects_amount - 1].description = strdup(strtok_r(rest, ";", &rest));
|
||||
|
||||
(*list)[projects_amount - 1].lang = strdup(strtok_r(rest, ";", &rest));
|
||||
|
||||
(*list)[projects_amount - 1].license = strdup(strtok_r(rest, ";", &rest));
|
||||
|
||||
(*list)[projects_amount - 1].url = strdup(strtok_r(rest, ";", &rest));
|
||||
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
free(buff);
|
||||
|
||||
return projects_amount;
|
||||
}
|
||||
|
||||
char *gen_project_html()
|
||||
{
|
||||
FILE *template_fp = fopen("static/projects/item.html", "r");
|
||||
if (template_fp == NULL)
|
||||
{
|
||||
perror("couldn't open project tesplate");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t template_file_size = get_file_size(template_fp) + 1;
|
||||
char *template = calloc(1, template_file_size);
|
||||
|
||||
fread(template, template_file_size, 1, template_fp);
|
||||
fclose(template_fp);
|
||||
|
||||
project_t *list = malloc(0);
|
||||
size_t length = read_list(&list);
|
||||
|
||||
char *content = strdup("");
|
||||
|
||||
for (size_t i = 0; i < length; i++)
|
||||
{
|
||||
int line_length = snprintf(NULL, 0, template, list[i].url, list[i].title, list[i].description, list[i].lang, list[i].license) + 1;
|
||||
char *project_content = calloc(1, line_length);
|
||||
|
||||
sprintf(project_content, template, list[i].url, list[i].title, list[i].description, list[i].lang, list[i].license);
|
||||
|
||||
content = realloc(content, strlen(content) + line_length);
|
||||
|
||||
content = strcat(content, project_content);
|
||||
|
||||
free(project_content);
|
||||
}
|
||||
|
||||
free_proj_list(&list, length);
|
||||
free(template);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
void free_proj_list(project_t **list, int len)
|
||||
{
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
free((*list)[i].description);
|
||||
free((*list)[i].lang);
|
||||
free((*list)[i].license);
|
||||
free((*list)[i].title);
|
||||
free((*list)[i].url);
|
||||
}
|
||||
|
||||
free(*list);
|
||||
}
|
Reference in New Issue
Block a user