1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <dirent.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "cms_build.h"
- #include "cms_err.h"
- #include "cms_files.h"
- #include "cms_util.h"
- #include "cms_page.h"
- #include "cms_post.h"
-
- cms_err* cms_build_make_tree(cms_page* root, char* path, char* dirname)
- {
- struct dirent** namelist;
- int n = scandir(path, &namelist, 0, alphasort);
- if (n == -1)
- return cms_err_from_std_err(errno);
-
- struct dirent* ep;
-
- struct stat* st = malloc(sizeof(struct stat));
- if (st == NULL)
- return cms_err_create(CMS_ERR_ALLOC, NULL);
-
- for (int i = 0; i < n; ++i)
- {
- ep = namelist[i];
- if (ep->d_name[0] == '.')
- continue;
-
- char* entpath = cms_util_path_join(path, ep->d_name);
- stat(entpath, st);
-
- //Entry is directory, recurse
- if (S_ISDIR(st->st_mode))
- {
- cms_page* sub = cms_page_create();
- if (sub == NULL)
- return cms_err_create(CMS_ERR_ALLOC, NULL);
-
- cms_err* err;
- err = cms_build_make_tree(sub, entpath, ep->d_name);
- if (err)
- return err;
-
- err = cms_page_add_sub(root, sub);
- if (err)
- return err;
- }
-
- //Entry is the file which contains metadata
- //about a page, parse
- else if (strcmp(ep->d_name, CMS_FILE_PAGE) == 0)
- {
- char* content = cms_util_file_read(entpath);
- if (content == NULL)
- return cms_err_create(CMS_ERR_FILEREAD, entpath);
-
- cms_err* err = cms_page_parse(root, content, dirname);
- free(content);
- if (err)
- return err;
- }
-
- //Entry is a post, read it and add to page
- else
- {
- cms_post* post = cms_post_create();
-
- char* content = cms_util_file_read(entpath);
- if (content == NULL)
- return cms_err_create(CMS_ERR_FILEREAD, entpath);
-
- cms_err* err;
- err = cms_post_parse(post, content, ep->d_name);
- free(content);
- if (err)
- return err;
-
- err = cms_page_add_post(root, post);
- if (err)
- return err;
- }
-
- free(entpath);
- }
-
- free(st);
- free(namelist);
-
- return cms_err_create(CMS_ERR_NONE, NULL);
- }
|