]> git.huck.website - odot.git/commitdiff
Sat Dec 31 12:00:17 AM CST 2022 automatic backup
authorHuck Boles <huck@huck.website>
Sat, 31 Dec 2022 06:00:17 +0000 (00:00 -0600)
committerHuck Boles <huck@huck.website>
Sat, 31 Dec 2022 06:00:17 +0000 (00:00 -0600)
actions.c [new file with mode: 0644]
database.c
function.c [new file with mode: 0644]
odot.c
odot.h

diff --git a/actions.c b/actions.c
new file mode 100644 (file)
index 0000000..8fab80d
--- /dev/null
+++ b/actions.c
@@ -0,0 +1,85 @@
+#include "odot.h"
+
+extern char *task,
+            *group,
+            *newgroup;
+
+extern u_long hash;
+
+extern int exists,showall,showdone;
+
+void newtask(sqlite3 *db){
+    char *cmd = malloc(MAXLINE*sizeof(char));
+
+    sprintf(cmd,"%s '%s';",GETTASK,task);
+    sqlcmd(db,cmd,'c');
+
+    if (exists == 0){
+        sprintf(cmd,"%s (%lu, '%s', '%s', 0);",INSERT,hash,task,group);
+        sqlcmd(db,cmd,'q');
+    }
+    return;
+}
+
+void done(sqlite3 *db){
+    char *cmd = malloc(MAXLINE*sizeof(char));
+
+    sprintf(cmd,"%s '%s';",GETTASK,task);
+    sqlcmd(db,cmd,'c');
+
+
+    if (exists == 1) {
+        sprintf(cmd,"%s %lu;",DONE,hash);
+        sqlcmd(db,cmd,'q');
+
+        sprintf(cmd,"%s %lu;", GETTASK,hash);
+        sqlcmd(db,cmd,'t');
+
+        sprintf(cmd,"SELECT Done, Task FROM Tasks WHERE Hash = %lu",hash);
+        printf("\n");
+        sqlcmd(db,cmd,'p');
+    }
+    return;
+}
+
+void update(sqlite3 *db){
+
+}
+
+void removetask(sqlite3 *db){
+    char *cmd = malloc(MAXLINE*sizeof(char));
+
+    sprintf(cmd,"%s '%s';",GETTASK,task);
+    sqlcmd(db,cmd,'c');
+
+    if (exists == 1){
+        sprintf(cmd,"%s %lu;",DELETE,hash);
+        sqlcmd(db,cmd,'c');
+    }
+    return;
+}
+
+void show(sqlite3 *db){
+    char *cmd = malloc(MAXLINE*sizeof(char));
+    int mask = showall + (showdone << 1);
+
+    printf("\n\t\033[35;1mTODO\033[0m: \033[36m%s\033[0m\n\n",group);
+
+    switch (mask) {
+        case 0:
+            sprintf(cmd,"%s '%s';",PRINTGROUP,group);
+            sqlcmd(db,cmd,'p');
+            break;
+        case 1:
+            sqlcmd(db,PRINT,'p');
+            break;
+        case 2:
+            sprintf(cmd,"%s '%s' ORDER BY Done;",PRINTGROUPALL,group);
+            sqlcmd(db,cmd,'p');
+            break;
+        case 3:
+            sqlcmd(db,PRINTALL,'p');
+            break;
+    }
+    return;
+}
index 76ba218427a77ed2719a018b0b871af862fe04f4..3490f1384b780adc759100a30a7e15bbdbfe896d 100644 (file)
@@ -1,8 +1,11 @@
 #include "odot.h"
 
 extern char *group,
+            *newgroup,
             *task;
 
+extern u_long hash;
+extern int exists;
 
 sqlite3 *accessdb(char *file){
     sqlite3 *db;
@@ -13,28 +16,26 @@ sqlite3 *accessdb(char *file){
     return db;
 }
 
-void sqlcmd(sqlite3 *db, char *cmd){
-    int err = sqlite3_exec(db,cmd,NULL,NULL,NULL);
-    if (err) sqlerror(db); 
-    return;
-
-}
-
-void sqlprint(sqlite3 *db, char *cmd){
-    int err = sqlite3_exec(db,cmd,printcallback,0,NULL);
-    if (err) sqlerror(db); 
-    return;
-
-}
-
-void sqlgroup(sqlite3 *db, char *cmd){
-    int err = sqlite3_exec(db,cmd,groupcallback,0,NULL);
+void sqlcmd(sqlite3 *db, char *cmd, char action){
+    int err;
+    switch (action) {
+        case 'q':
+            err = sqlite3_exec(db,cmd,NULL,NULL,NULL);
+            break;
+        case 'p':
+            err = sqlite3_exec(db,cmd,printcallback,0,NULL);
+            break;
+        case 't':
+            err = sqlite3_exec(db,cmd,taskcallback,0,NULL);
+            break;
+        case 'c':
+            err = sqlite3_exec(db,cmd,taskcallback,0,NULL);
+            break;
+    }
     if (err) sqlerror(db); 
     return;
-
 }
 
-
 void sqlerror(sqlite3 *db) {
     fprintf(stderr, "%s\n", sqlite3_errmsg(db));
     sqlite3_close(db);
@@ -43,7 +44,8 @@ void sqlerror(sqlite3 *db) {
 
 int printcallback(void *unused,int argc, char **argv, char **name){
     int i = 1;
-
+        
+        /* print group if it changes */
     if (argv[2]){
         char *g = malloc(strlen(argv[1])*sizeof(char));
         sprintf(g,"%s",argv[1]);
@@ -59,7 +61,19 @@ int printcallback(void *unused,int argc, char **argv, char **name){
     return 0;
 }
 
-int groupcallback(void *unused,int argc, char **argv, char **name){
-    strcpy(group,argv[0]);
+int taskcallback(void *unused,int argc, char **argv, char **name){
+    sprintf(task,"%s",argv[0]);
+    sprintf(group,"%s",argv[1]);
+    hash = strtoul(argv[2],NULL,10);
+    return 0;
+}
+
+int checkcallback(void *unused,int argc, char **argv, char **name){
+    if (exists == 1) return 0;
+    if (hash == strtoul(argv[2],NULL,10)) {
+        exists = 1;
+    } else if (strcmp(task,argv[0]) == 0) {
+        checksame(task,argv[1]);
+    }
     return 0;
 }
diff --git a/function.c b/function.c
new file mode 100644 (file)
index 0000000..ebdaf69
--- /dev/null
@@ -0,0 +1,59 @@
+#include "odot.h"
+
+extern char *group,
+            *newgroup,
+            *task,
+            *action;
+
+extern u_long hash;
+
+extern int exists;
+
+u_long genhash(void){
+    char *tmp = malloc((strlen(task)+strlen(group)+1) * sizeof(char));
+    strcat(tmp,task);
+    strcat(tmp,group);
+    int h = 11235813;
+
+    while (*tmp++) h = (~(h << 5) ^ *tmp);
+    return h;
+}
+
+char *filepath(void){
+    char *dir = getenv("XDG_DATA_HOME");
+    char *db = malloc(MAXLINE * sizeof(char));
+
+    /* set dir to $HOME/.local/share if XDG isn't set */
+    if (!dir) {
+        dir = getenv("HOME");    
+        if (!dir) error(3);
+        strcat(dir,"/.local/share");
+    }
+    strcat(dir,"/odot");
+
+    DIR *test = opendir(dir);
+
+    /* test if dir exists and create if it doesn't */
+    if (test) {
+        closedir(test);
+    } else {
+        int err = mkdir(dir, 0777);
+        if (err) error(2);
+    }
+
+    strcat(db,dir);
+
+    return db;
+}
+
+void checksame(char *task,char *oldgroup){
+    printf("\033[32m%s\033[0m already exists, but in \033[34m%s\033[0m\nIs this the same task? [y/\033[1mn\033[0m] ",task,oldgroup);
+
+    if (getchar() == 'y'){
+        exists = 1; 
+        strcpy(group,oldgroup); 
+        hash = genhash();
+    } 
+
+    return;
+}
diff --git a/odot.c b/odot.c
index 3b81899636dc40e9db2bdbd1bc39f3e9278c003d..149bb1f73ec2993593bad58cae14cfd425a50398 100644 (file)
--- a/odot.c
+++ b/odot.c
@@ -2,9 +2,10 @@
 
 /* global variables */ 
 int showdone = 0,
-    showall  = 0;
+    showall  = 0,
+    exists   = 0;
 
-u_int hash;
+u_long hash;
 
 char    *group,
         *newgroup,
@@ -12,16 +13,25 @@ char    *group,
         *action;
 
 int main(int argc, char *argv[]){
-    if (argc == 1) help();
+    /* show help if no arguments unless its just showing tasks */
+    if (argc == 2 && strcmp(argv[1],"show") != 0) help();
 
     sqlite3 *db;
-    db = accessdb(filepath());
-    sqlcmd(db,BUILDTABLE);
-
+    int err = sqlite3_open(filepath(),&db);
+    sqlcmd(db,BUILDTABLE,'c');
+
+    /* show all tasks if called alone */
+    if (argc == 1) {
+        showall = 1;
+        show(db);
+        sqlite3_close(db);
+        exit(0);
+    }
 
     group = calloc(MAXLINE,sizeof(char));
     task = calloc(MAXLINE,sizeof(char));
     action = calloc(MAXLINE,sizeof(char));
+    newgroup = calloc(MAXLINE,sizeof(char));
     
     parseopt(argc,argv);
     hash = genhash();
@@ -34,7 +44,7 @@ int main(int argc, char *argv[]){
 
 void parseopt(int n, char **args){
     char c;
-    while ((c = getopt(n,args,"g:adh")) != -1){
+    while ((c = getopt(n,args,"g:G:adh")) != -1){
         switch (c) {
             case 'h':
                 help();
@@ -46,108 +56,27 @@ void parseopt(int n, char **args){
                 showdone = 1;
                 break;
             case 'g':
-                sprintf(group,"%s",optarg);
+                strcpy(group,optarg);
                 break;
             case 'G':
-                sprintf(newgroup,"%s",optarg);
+                strcpy(newgroup,optarg);
                 break;
             case '?':
-                printf("Unknown Option: %c\n", optopt);
+                error(4);
+                break;
         }
     }
 
-    sprintf(action,"%s",args[optind]);
+    /* get subcommand */
+    strcpy(action,args[optind]);
 
+    /* rest of arguments become task */
     for (int j = optind + 1; j < n; j++){
             strcat(task,args[j]);
             strcat(task,(j != n-1) ? " " : "");
     }
 }
 
-void operate(sqlite3 *db){
-    char *cmd = malloc(MAXLINE*sizeof(char));
-
-    if (strcmp(action,"new") == 0){
-        sprintf(cmd,"%s (%ui, '%s', '%s', 0);",INSERT,hash,task,group);
-        sqlcmd(db,cmd);
-    } else if (strcmp(action,"done") == 0){
-        sprintf(cmd,"%s %ui;",DONE,hash);
-        sqlcmd(db,cmd);
-
-        sprintf(cmd,"%s %ui;", GETGROUP,hash);
-        sqlgroup(db,cmd);
-
-        sprintf(cmd,"SELECT Done, Task FROM Tasks WHERE Hash = %ui",hash);
-        printf("\n");
-        sqlprint(db,cmd);
-    } else if (strcmp(action,"remove") == 0){
-        sprintf(cmd,"%s %ui;",DELETE,hash);
-        sqlcmd(db,cmd);
-    } else if (strcmp(action,"update") == 0){
-        sprintf(cmd,"%s '%s' WHERE Hash = %ui;",CHANGEGROUP,newgroup,hash);          
-        sqlcmd(db,cmd);
-    } else if (strcmp(action,"show") != 0) {
-        fprintf(stderr,"\033[33;1mUnknown subcommand\033[0m: %s\n",action);
-    }
-
-    printf("\n\t\033[35;1mTODO\033[0m: \033[36m%s\033[0m\n\n",group);
-    if (showdone < 1) {
-        sqlprint(db,PRINT);
-    }
-
-    if (showall == 1) {
-        if (showdone == 1) {
-            sqlprint(db,PRINTALL);
-        } else {
-            sqlprint(db,PRINT);
-        }
-    } else {
-        if (showdone == 1) {
-            sprintf(cmd,"%s '%s' ORDER BY Done;",PRINTGROUPALL,group);
-            sqlprint(db,cmd);
-        } else if (strcmp(group,"") != 0) {
-            sprintf(cmd,"%s '%s';",PRINTGROUP,group);
-            sqlprint(db,cmd);
-        } else {
-            sqlprint(db,PRINT);
-        }
-    }
-}
-
-u_int genhash(void){
-    char *tmp = malloc((strlen(task)+strlen(group)) * sizeof(char));
-    sprintf(tmp,"%s%s",task,group);
-    int h = 11235813;
-
-    while (*tmp++) h = (~(h << 5) ^ *tmp);
-    return h;
-}
-
-char *filepath(void){
-    char *dir = getenv("XDG_DATA_HOME");
-    char *db = malloc(MAXLINE * sizeof(char));
-
-    if (!dir) {
-        dir = getenv("HOME");    
-        if (!dir) error(3);
-        strcat(dir,"/.local/share");
-    }
-    strcat(dir,"/odot");
-
-    DIR *test = opendir(dir);
-
-    if (test) {
-        closedir(test);
-    } else {
-        int err = mkdir(dir, 0777);
-        if (err) error(2);
-    }
-
-    sprintf(db,"%s/odot.db",dir);
-
-    return db;
-}
-
 void error(int err){
     switch (err) {
         case 1:
@@ -159,6 +88,9 @@ void error(int err){
         case 3:
             fprintf(stderr,"Could not determine $HOME\n");
             break;
+        case 4:
+            fprintf(stderr,"Unknown Command\n");
+            help();
     }
     exit(err);
 }
diff --git a/odot.h b/odot.h
index 44761dd176709ac29e752233ee691d17099f73c7..3b4a6105609eb9c07974f1e73fc0218f72bb84d2 100644 (file)
--- a/odot.h
+++ b/odot.h
 #define INSERT "INSERT INTO Tasks VALUES"
 #define DELETE "DELETE FROM Tasks WHERE Hash ="
 #define DONE "UPDATE Tasks SET Done = 1 WHERE Hash ="
-#define GETGROUP "SELECT Type FROM Tasks WHERE Hash ="
+#define GETTASK "SELECT Task, Type, Hash FROM Tasks WHERE Task ="
 #define CHANGEGROUP "UPDATE Tasks SET Group ="
 #define PRINT "SELECT Done, Type, Task FROM Tasks WHERE Done = 0 ORDER BY Type;"
 #define PRINTALL "SELECT Done, Type, Task FROM Tasks ORDER BY Type;"
 #define PRINTGROUP "SELECT Done, Task FROM Tasks WHERE Done = 0 AND Type ="
 #define PRINTGROUPALL "SELECT Done, Task FROM Tasks WHERE Type ="
 
-char *filepath(void);
 void error(int);
 void help(void);
 void parseopt(int, char**);
 void operate(sqlite3 *);
-u_int genhash(void);
+
+/* action.c */
+void newtask(sqlite3 *);
+void done(sqlite3 *);
+void update(sqlite3 *);
+void removetask(sqlite3 *);
+void show(sqlite3 *);
+
+/* function.c */
+char *filepath(void);
+u_long genhash(void);
+void checksame(char *,char *);
 
 /* functions for interfacing with database: database.c */
 sqlite3 *accessdb(char *);
-void sqlcmd(sqlite3 *,char *);
-void sqlprint(sqlite3 *,char *);
-void sqlgroup(sqlite3 *,char *);
+void sqlcmd(sqlite3 *,char *,char);
 void sqlerror(sqlite3 *);
 int printcallback(void *,int,char **,char **);
 int groupcallback(void *,int,char **,char **);
+int taskcallback(void *,int,char **,char **);