Simplified the get_dir function, and now we have directories and files ready :)

This commit is contained in:
synt-xerror
2026-02-14 20:49:52 -03:00
parent 7b829fde21
commit a73b97101f
3 changed files with 57 additions and 50 deletions

27
task.c
View File

@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "toybox.h"
// IDEAS
@@ -7,14 +8,30 @@
// - Sincronização via ADB
// - Organização por prioridade
// - Data limite
// --- Global values - Don't use it, them is just for easy edits ---
// directories (begin with nothing)
char* DATA_DIR = ".local/share/task-cli";
char* CONFIG_DIR = ".config/task-cli";
// files
char* TASK_FILE = "task.txt";
int main()
{
const char* TASK_DIR = get_dir(home(), ".local/share", "task");
char* DEF_DATA_DIR = get_dir(home(), DATA_DIR);
char* DEF_CONFIG_DIR = get_dir(home(), CONFIG_DIR);
printf("[DEBUG]: Tentando imprimir...\n");
printf("%s", TASK_DIR);
char* DEF_TASK_FILE = get_file(DEF_DATA_DIR, TASK_FILE);
printf("DEF_DATA_DIR: %s\n", DEF_DATA_DIR);
printf("DEF_CONFIG_DIR: %s\n", DEF_CONFIG_DIR);
printf("DEF_TASK_FILE: %s\n", DEF_TASK_FILE);
free(TASK_DIR);
free(DEF_DATA_DIR);
free(DEF_CONFIG_DIR);
free(DEF_TASK_FILE);
return 0;
}

View File

@@ -21,61 +21,50 @@ char* home()
}
// DIR_NAME deve ser o nome do diretório, não o caminho (ex: task)
// DIR_ROOT é o fallback caso a XDG_VAR não exista
// Caso o diretório não estiver na home, use NULL como primeiro argumento
// Se HOME = NULL, a função assume que a pasta que quer está fora da pasta /home/usuário
// Importante: essa função retorna um char*. Para abrir o diretório retornado, você deve usar
// a função opendir() com o valor retornado de get_dir()
char* get_dir(char* HOME, char* DIR_ROOT, char* DIR_NAME) {
char* get_dir(const char* HOME, const char* DIR_NAME) {
if (DIR_NAME[0] == '~') {
perror("get_dir function doesn't expand '~'!");
perror("get_dir doesn't expand '~'");
return NULL;
} else if (DIR_NAME[0] == '/') {
perror("get_dir DIR_NAME (3rd argumment) can't begin with '/'!");
}
if (DIR_NAME[0] == '/') {
perror("DIR_NAME can't begin with '/'");
return NULL;
}
char *DIR_FINAL;
const char *prefix = HOME ? HOME : "";
// se não tiver home, assume estar na raíz
if (HOME) {
int size = strlen(home()) + 1 + strlen(DIR_ROOT) + 1 + strlen(DIR_NAME);
DIR_FINAL = malloc(size);
DIR_FINAL[0] = '\0';
strcat(DIR_FINAL, HOME);
strcat(DIR_FINAL, "/");
strcat(DIR_FINAL, DIR_ROOT);
strcat(DIR_FINAL, "/");
strcat(DIR_FINAL, DIR_NAME);
} else {
int size = 1 + strlen(DIR_ROOT) + 1 + strlen(DIR_NAME) + 1;
DIR_FINAL = malloc(size);
DIR_FINAL[0] = '\0';
strcat(DIR_FINAL, "/");
strcat(DIR_FINAL, DIR_ROOT);
strcat(DIR_FINAL, "/");
strcat(DIR_FINAL, DIR_NAME);
int size = strlen(prefix) + 1 + strlen(DIR_NAME) + 1;
char *DIR_FINAL = malloc(size);
if (!DIR_FINAL) {
perror("malloc failed");
return NULL;
}
if (!DIR_FINAL) {
fprintf(stderr, "Return of %s in get_dir is NULL!",
DIR_FINAL);
return NULL;
} else {
const DIR *dir_exist = opendir(DIR_FINAL);
if (!dir_exist) {
const int status = mkdir(DIR_FINAL, 0755);
if (status != 0) {
fprintf(stderr, "'%s' doesn't exist and cannot be created!",
DIR_FINAL);
return NULL;
}
sprintf(DIR_FINAL, "%s/%s", prefix, DIR_NAME);
DIR *dir = opendir(DIR_FINAL);
if (!dir) {
if (mkdir(DIR_FINAL, 0755) != 0) {
fprintf(stderr, "'%s' cannot be created\n", DIR_FINAL);
free(DIR_FINAL);
return NULL;
}
return DIR_FINAL;
} else {
closedir(dir);
}
}
return DIR_FINAL;
}
char* get_file(char* ROOT, char* FILE_NAME) {
char* FINAL_FILE;
FINAL_FILE = malloc(strlen(ROOT) + strlen(FILE_NAME) + 1);
sprintf(FINAL_FILE, "%s/%s", ROOT, FILE_NAME);
return FINAL_FILE;
}

View File

@@ -2,6 +2,7 @@
#define TOYBOX_H
char* home();
char* get_dir(char* HOME, char* DIR_ROOT, char* DIR_NAME);
char* get_dir(const char* HOME, const char* DIR_NAME);
char* get_file(char* ROOT, char* FILE_NAME);
#endif