104 lines
2.6 KiB
C

#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);
}