mirror of
https://github.com/michaeldv/pit.git
synced 2025-12-10 08:25:34 +00:00
Streamlined .h files, added command line parsing routines
This commit is contained in:
19
Makefile
19
Makefile
@@ -15,6 +15,7 @@ CC = gcc -g -Os -Wall
|
|||||||
|
|
||||||
SRC = \
|
SRC = \
|
||||||
$(SRCDIR)/activity.c \
|
$(SRCDIR)/activity.c \
|
||||||
|
$(SRCDIR)/args.c \
|
||||||
$(SRCDIR)/db.c \
|
$(SRCDIR)/db.c \
|
||||||
$(SRCDIR)/pit.c \
|
$(SRCDIR)/pit.c \
|
||||||
$(SRCDIR)/project.c \
|
$(SRCDIR)/project.c \
|
||||||
@@ -24,6 +25,7 @@ SRC = \
|
|||||||
|
|
||||||
OBJ = \
|
OBJ = \
|
||||||
$(OBJDIR)/activity.o \
|
$(OBJDIR)/activity.o \
|
||||||
|
$(OBJDIR)/args.o \
|
||||||
$(OBJDIR)/db.o \
|
$(OBJDIR)/db.o \
|
||||||
$(OBJDIR)/pit.o \
|
$(OBJDIR)/pit.o \
|
||||||
$(OBJDIR)/project.o \
|
$(OBJDIR)/project.o \
|
||||||
@@ -42,25 +44,28 @@ $(OBJDIR):
|
|||||||
$(APP): $(OBJ)
|
$(APP): $(OBJ)
|
||||||
$(CC) -o $(BINDIR)/$(APP) $(OBJ)
|
$(CC) -o $(BINDIR)/$(APP) $(OBJ)
|
||||||
|
|
||||||
$(OBJDIR)/activity.o: $(SRCDIR)/activity.c $(SRCDIR)/activity.h
|
$(OBJDIR)/activity.o: $(SRCDIR)/activity.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/activity.o -c $(SRCDIR)/activity.c
|
$(CC) -o $(OBJDIR)/activity.o -c $(SRCDIR)/activity.c
|
||||||
|
|
||||||
$(OBJDIR)/db.o: $(SRCDIR)/db.c $(SRCDIR)/db.h
|
$(OBJDIR)/args.o: $(SRCDIR)/args.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
|
$(CC) -o $(OBJDIR)/args.o -c $(SRCDIR)/args.c
|
||||||
|
|
||||||
|
$(OBJDIR)/db.o: $(SRCDIR)/db.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/db.o -c $(SRCDIR)/db.c
|
$(CC) -o $(OBJDIR)/db.o -c $(SRCDIR)/db.c
|
||||||
|
|
||||||
$(OBJDIR)/pit.o: $(SRCDIR)/pit.c $(SRCDIR)/pit.h
|
$(OBJDIR)/pit.o: $(SRCDIR)/pit.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/pit.o -c $(SRCDIR)/pit.c
|
$(CC) -o $(OBJDIR)/pit.o -c $(SRCDIR)/pit.c
|
||||||
|
|
||||||
$(OBJDIR)/project.o: $(SRCDIR)/project.c $(SRCDIR)/project.h
|
$(OBJDIR)/project.o: $(SRCDIR)/project.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/project.o -c $(SRCDIR)/project.c
|
$(CC) -o $(OBJDIR)/project.o -c $(SRCDIR)/project.c
|
||||||
|
|
||||||
$(OBJDIR)/table.o: $(SRCDIR)/table.c $(SRCDIR)/table.h
|
$(OBJDIR)/table.o: $(SRCDIR)/table.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/table.o -c $(SRCDIR)/table.c
|
$(CC) -o $(OBJDIR)/table.o -c $(SRCDIR)/table.c
|
||||||
|
|
||||||
$(OBJDIR)/task.o: $(SRCDIR)/task.c $(SRCDIR)/task.h
|
$(OBJDIR)/task.o: $(SRCDIR)/task.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/task.o -c $(SRCDIR)/task.c
|
$(CC) -o $(OBJDIR)/task.o -c $(SRCDIR)/task.c
|
||||||
|
|
||||||
$(OBJDIR)/user.o: $(SRCDIR)/user.c $(SRCDIR)/user.h
|
$(OBJDIR)/user.o: $(SRCDIR)/user.c $(SRCDIR)/pit.h $(SRCDIR)/models.h $(SRCDIR)/table.h
|
||||||
$(CC) -o $(OBJDIR)/user.o -c $(SRCDIR)/user.c
|
$(CC) -o $(OBJDIR)/user.o -c $(SRCDIR)/user.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "activity.h"
|
|
||||||
|
|
||||||
ulong subject_id; /* Reference to the specific Project, Task, or Note. */
|
ulong subject_id; /* Reference to the specific Project, Task, or Note. */
|
||||||
char subject[16]; /* Project, Task, or Note. */
|
char subject[16]; /* Project, Task, or Note. */
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
PActivity pit_add_activity(ulong id, char *subject, char *message, ulong user_id);
|
|
||||||
102
src/args.c
Normal file
102
src/args.c
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "pit.h"
|
||||||
|
|
||||||
|
int pit_arg_is_option(char **arg)
|
||||||
|
{
|
||||||
|
return *arg && (**arg == '-' || **arg == '/') && strlen(*arg) == 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pit_arg_option(char **arg)
|
||||||
|
{
|
||||||
|
if (pit_arg_is_option(arg)) {
|
||||||
|
return *(*arg + 1);
|
||||||
|
} else {
|
||||||
|
die("invalid option");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pit_arg_string(char **arg, char *required)
|
||||||
|
{
|
||||||
|
if (required && (!*arg || pit_arg_is_option(arg))) {
|
||||||
|
die("missing %s", required);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong pit_arg_number(char **arg, char *required)
|
||||||
|
{
|
||||||
|
ulong number = 0L;
|
||||||
|
|
||||||
|
if (required && (!*arg || pit_arg_is_option(arg))) {
|
||||||
|
die("missing %s", required);
|
||||||
|
} else if (*arg) {
|
||||||
|
number = atol(*arg);
|
||||||
|
if (number == 0 && **arg != '0' && required) {
|
||||||
|
die("invalid %s value: %s", required, *arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm);
|
||||||
|
// time_t mktime ( struct tm * timeptr );
|
||||||
|
time_t pit_arg_time(char **arg, char *required)
|
||||||
|
{
|
||||||
|
time_t seconds = (time_t)-1;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
|
||||||
|
if (required && (!*arg || pit_arg_is_option(arg))) {
|
||||||
|
die("missing %s", required);
|
||||||
|
} else {
|
||||||
|
memset(&tm, 0, sizeof(tm));
|
||||||
|
if (strptime(*arg, "%m/%d/%Y", &tm)) {
|
||||||
|
seconds = mktime(&tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strchr(*arg, ',')) { /* Date present. */
|
||||||
|
if (strchr(*arg, ':')) { /* Date and HH:MM. */
|
||||||
|
if (!strstr(*arg, "am") || !strstr(*arg, "pm")) { /* Date and HH:MM am/pm. */
|
||||||
|
/* Oct 10, 1992 7:30pm */
|
||||||
|
} else {
|
||||||
|
/* Oct 10, 1992 19:30 */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strlen(*arg) > 12) { /* Date and HH. */
|
||||||
|
if (!strstr(*arg, "am") || !strstr(*arg, "pm")) { /* Date and HH am/pm. */
|
||||||
|
/* Oct 10, 1992 7pm */
|
||||||
|
} else {
|
||||||
|
/* Oct 10, 1992 19 */ /* HH */
|
||||||
|
}
|
||||||
|
} else { /* Date with no time. */
|
||||||
|
/* Oct 10, 1992 19 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* No date, time only. */
|
||||||
|
if (strchr(*arg, ':')) { /* HH:MM. */
|
||||||
|
if (!strstr(*arg, "am") || !strstr(*arg, "pm")) { /* HH:MM am/pm. */
|
||||||
|
/* 7:30pm */
|
||||||
|
} else {
|
||||||
|
/* 19:30 */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!strstr(*arg, "am") || !strstr(*arg, "pm")) { /* HH am/pm. */
|
||||||
|
/* 7pm */
|
||||||
|
} else {
|
||||||
|
/* 19 */ /* HH */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (seconds == (time_t)-1) {
|
||||||
|
die("invalid %s: %s", required, *arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return seconds;
|
||||||
|
}
|
||||||
3
src/db.c
3
src/db.c
@@ -5,9 +5,6 @@
|
|||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "db.h"
|
|
||||||
#include "activity.h"
|
|
||||||
#include "user.h"
|
|
||||||
|
|
||||||
#define PITFILE "~/.pit"
|
#define PITFILE "~/.pit"
|
||||||
|
|
||||||
|
|||||||
8
src/db.h
8
src/db.h
@@ -1,8 +0,0 @@
|
|||||||
#if !defined(__DB_H__)
|
|
||||||
#define __DB_H__
|
|
||||||
|
|
||||||
int pit_init(char *argv[]);
|
|
||||||
void pit_db_load();
|
|
||||||
void pit_db_save();
|
|
||||||
void pit_db_initialize();
|
|
||||||
#endif
|
|
||||||
58
src/models.h
Normal file
58
src/models.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#if !defined(__MODELS_H__)
|
||||||
|
#define __MODELS_H__
|
||||||
|
|
||||||
|
typedef struct _Project {
|
||||||
|
ulong id;
|
||||||
|
char name[128]; /* Project name. */
|
||||||
|
char status[16]; /* Project status. */
|
||||||
|
ulong number_of_open_tasks; /* Number of open tasks. */
|
||||||
|
ulong number_of_closed_tasks; /* Number of closed tasks. */
|
||||||
|
ulong closed_by; /* Who closed the project? */
|
||||||
|
ulong created_by; /* Who created the project? */
|
||||||
|
ulong updated_by; /* Who last updated the project? */
|
||||||
|
time_t closed_at; /* When the project was closed? */
|
||||||
|
time_t created_at; /* When the project was created? */
|
||||||
|
time_t updated_at; /* When the project was last updated? */
|
||||||
|
} Project, *PProject;
|
||||||
|
|
||||||
|
typedef struct _Task {
|
||||||
|
ulong id;
|
||||||
|
ulong project_id; /* Which project the task belongs to? */
|
||||||
|
char name[128]; /* Task name. */
|
||||||
|
char status[16]; /* Task status. */
|
||||||
|
char priority[16]; /* Task priority. */
|
||||||
|
time_t deadline; /* Task deadline. */
|
||||||
|
ulong number_of_notes; /* Number of notes. */
|
||||||
|
ulong closed_by; /* Who closed the task? */
|
||||||
|
ulong created_by; /* Who created the task? */
|
||||||
|
ulong updated_by; /* Who last updated the task? */
|
||||||
|
time_t closed_at; /* When the task was closed? */
|
||||||
|
time_t created_at; /* When the task was created? */
|
||||||
|
time_t updated_at; /* When the task was last updated? */
|
||||||
|
} Task, *PTask;
|
||||||
|
|
||||||
|
typedef struct _Note {
|
||||||
|
ulong id;
|
||||||
|
ulong task_id; /* Task the note belongs to. */
|
||||||
|
char message[255]; /* The body of the note. */
|
||||||
|
ulong created_by; /* Who created the note? */
|
||||||
|
ulong updated_by; /* Who last updated the note? */
|
||||||
|
time_t created_at; /* When the note was created? */
|
||||||
|
time_t updated_at; /* When the note was last updated? */
|
||||||
|
} Note, *PNote;
|
||||||
|
|
||||||
|
typedef struct _Activity {
|
||||||
|
ulong subject_id; /* Reference to the specific Project, Task, or Note. */
|
||||||
|
char subject[16]; /* Project, Task, or Note. */
|
||||||
|
char message[255]; /* Log message. */
|
||||||
|
ulong created_by; /* Who added log message? */
|
||||||
|
time_t created_at; /* When log message was added? */
|
||||||
|
} Activity, *PActivity;
|
||||||
|
|
||||||
|
typedef struct _User {
|
||||||
|
ulong id;
|
||||||
|
char username[32]; /* Username. */
|
||||||
|
char email[32]; /* User's email. */
|
||||||
|
} User, *PUser;
|
||||||
|
|
||||||
|
#endif
|
||||||
17
src/pit.c
17
src/pit.c
@@ -1,11 +1,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "db.h"
|
|
||||||
#include "project.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
PTable projects;
|
PTable projects;
|
||||||
PTable tasks;
|
PTable tasks;
|
||||||
@@ -21,12 +18,18 @@ static int usage() {
|
|||||||
/*
|
/*
|
||||||
** Suicide.
|
** Suicide.
|
||||||
*/
|
*/
|
||||||
void die(char *msg)
|
void die(char *message, ...)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "pit: %s\n", msg);
|
char str[4096];
|
||||||
|
va_list params;
|
||||||
|
|
||||||
|
va_start(params, message);
|
||||||
|
vsnprintf(str, sizeof(str), message, params);
|
||||||
|
fprintf(stderr, "pit: %s\n", str);
|
||||||
|
va_end(params);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Forceful death.
|
** Forceful death.
|
||||||
*/
|
*/
|
||||||
|
|||||||
79
src/pit.h
79
src/pit.h
@@ -5,69 +5,38 @@ typedef unsigned int uint;
|
|||||||
typedef unsigned long ulong;
|
typedef unsigned long ulong;
|
||||||
typedef unsigned char uchar;
|
typedef unsigned char uchar;
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include "models.h"
|
||||||
#include "table.h"
|
#include "table.h"
|
||||||
|
|
||||||
typedef struct _Project {
|
/* Externals. */
|
||||||
ulong id;
|
|
||||||
char name[128]; /* Project name. */
|
|
||||||
char status[16]; /* Project status. */
|
|
||||||
ulong number_of_open_tasks; /* Number of open tasks. */
|
|
||||||
ulong number_of_closed_tasks; /* Number of closed tasks. */
|
|
||||||
ulong closed_by; /* Who closed the project? */
|
|
||||||
ulong created_by; /* Who created the project? */
|
|
||||||
ulong updated_by; /* Who last updated the project? */
|
|
||||||
time_t closed_at; /* When the project was closed? */
|
|
||||||
time_t created_at; /* When the project was created? */
|
|
||||||
time_t updated_at; /* When the project was last updated? */
|
|
||||||
} Project, *PProject;
|
|
||||||
|
|
||||||
typedef struct _Task {
|
|
||||||
ulong id;
|
|
||||||
ulong project_id; /* Which project the task belongs to? */
|
|
||||||
int priority; /* Task priority. */
|
|
||||||
char name[128]; /* Task name. */
|
|
||||||
char status[16]; /* Task status. */
|
|
||||||
time_t deadline; /* Task deadline. */
|
|
||||||
ulong number_of_notes; /* Number of notes. */
|
|
||||||
ulong closed_by; /* Who closed the task? */
|
|
||||||
ulong created_by; /* Who created the task? */
|
|
||||||
ulong updated_by; /* Who last updated the task? */
|
|
||||||
time_t closed_at; /* When the task was closed? */
|
|
||||||
time_t created_at; /* When the task was created? */
|
|
||||||
time_t updated_at; /* When the task was last updated? */
|
|
||||||
} Task, *PTask;
|
|
||||||
|
|
||||||
typedef struct _Note {
|
|
||||||
ulong id;
|
|
||||||
ulong task_id; /* Task the note belongs to. */
|
|
||||||
char message[255]; /* The body of the note. */
|
|
||||||
ulong created_by; /* Who created the note? */
|
|
||||||
ulong updated_by; /* Who last updated the note? */
|
|
||||||
time_t created_at; /* When the note was created? */
|
|
||||||
time_t updated_at; /* When the note was last updated? */
|
|
||||||
} Note, *PNote;
|
|
||||||
|
|
||||||
typedef struct _Activity {
|
|
||||||
ulong subject_id; /* Reference to the specific Project, Task, or Note. */
|
|
||||||
char subject[16]; /* Project, Task, or Note. */
|
|
||||||
char message[255]; /* Log message. */
|
|
||||||
ulong created_by; /* Who added log message? */
|
|
||||||
time_t created_at; /* When log message was added? */
|
|
||||||
} Activity, *PActivity;
|
|
||||||
|
|
||||||
typedef struct _User {
|
|
||||||
ulong id;
|
|
||||||
char username[32]; /* Username. */
|
|
||||||
char email[32]; /* User's email. */
|
|
||||||
} User, *PUser;
|
|
||||||
|
|
||||||
extern PTable projects;
|
extern PTable projects;
|
||||||
extern PTable tasks;
|
extern PTable tasks;
|
||||||
extern PTable notes;
|
extern PTable notes;
|
||||||
extern PTable activities;
|
extern PTable activities;
|
||||||
extern PTable users;
|
extern PTable users;
|
||||||
|
|
||||||
void die(char *msg);
|
/* Command line parsing. */
|
||||||
|
int pit_arg_is_option(char **arg);
|
||||||
|
int pit_arg_option(char **arg);
|
||||||
|
char *pit_arg_string(char **arg, char *required);
|
||||||
|
ulong pit_arg_number(char **arg, char *required);
|
||||||
|
time_t pit_arg_time(char **arg, char *required);
|
||||||
|
|
||||||
|
/* Database. */
|
||||||
|
int pit_init(char *argv[]);
|
||||||
|
void pit_db_load();
|
||||||
|
void pit_db_save();
|
||||||
|
void pit_db_initialize();
|
||||||
|
|
||||||
|
/* Models. */
|
||||||
|
int pit_project(char *argv[]);
|
||||||
|
int pit_task(char *argv[]);
|
||||||
|
char *pit_current_user();
|
||||||
|
PActivity pit_add_activity(ulong id, char *subject, char *message, ulong user_id);
|
||||||
|
|
||||||
|
/* Utilities. */
|
||||||
|
void die(char *msg, ...);
|
||||||
void perish(char *prefix);
|
void perish(char *prefix);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "db.h"
|
|
||||||
#include "project.h"
|
|
||||||
|
|
||||||
static int already_exist(char *name)
|
static int already_exist(char *name)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#if !defined(__PROJECT_H__)
|
|
||||||
#define __PROJECT_H__
|
|
||||||
|
|
||||||
int pit_project(char *argv[]);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
|
|
||||||
#define TABLE_INCREMENT 10
|
#define TABLE_INCREMENT 10
|
||||||
|
|||||||
BIN
src/table.c.out
BIN
src/table.c.out
Binary file not shown.
130
src/task.c
130
src/task.c
@@ -1,12 +1,25 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "db.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
static void list_tasks()
|
/*
|
||||||
|
** CREATING TASKS:
|
||||||
|
** pit task -c name [-s status] [-d deadline] [-p priority]
|
||||||
|
**
|
||||||
|
** UPDATING TASKS:
|
||||||
|
** pit task -u [number] [-n name] [-s status] [-d deadline] [-p priority]
|
||||||
|
**
|
||||||
|
** DELETING TASKS:
|
||||||
|
** pit task -d [number]
|
||||||
|
**
|
||||||
|
** SHOWING TASK:
|
||||||
|
** pit task [-s number]
|
||||||
|
**
|
||||||
|
** LISTING TASKS:
|
||||||
|
** pit task -s [all|open|closed] [-s status] [-d deadline] [-p priority]
|
||||||
|
*/
|
||||||
|
static void list_tasks(char *mode, char *status, char *deadline, ulong priority)
|
||||||
{
|
{
|
||||||
pit_db_load();
|
pit_db_load();
|
||||||
|
|
||||||
@@ -22,7 +35,7 @@ static void list_tasks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_task(char *name, char *status)
|
static void create_task(char *name, char *status, char *priority, time_t deadline)
|
||||||
{
|
{
|
||||||
pit_db_load();
|
pit_db_load();
|
||||||
|
|
||||||
@@ -38,13 +51,17 @@ static void create_task(char *name, char *status)
|
|||||||
if (!status) {
|
if (!status) {
|
||||||
status = "open";
|
status = "open";
|
||||||
}
|
}
|
||||||
printf("creating task [%s], status [%s]\n", name, status);
|
if (!priority) {
|
||||||
|
priority = "normal";
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("creating task: %s, status: %s, priority: %s, deadline: %s", name, status, priority, ctime(&deadline));
|
||||||
|
|
||||||
strncpy(t.name, name, sizeof(t.name) - 1);
|
strncpy(t.name, name, sizeof(t.name) - 1);
|
||||||
strncpy(t.status, status, sizeof(t.status) - 1);
|
strncpy(t.status, status, sizeof(t.status) - 1);
|
||||||
|
strncpy(t.priority, priority, sizeof(t.priority) - 1);
|
||||||
t.project_id = pp->id;
|
t.project_id = pp->id;
|
||||||
t.priority = 1;
|
t.deadline = deadline;
|
||||||
t.deadline = time(NULL);
|
|
||||||
t.number_of_notes = 0;
|
t.number_of_notes = 0;
|
||||||
t.closed_by = 0;
|
t.closed_by = 0;
|
||||||
t.created_by = t.updated_by = 1; // TODO
|
t.created_by = t.updated_by = 1; // TODO
|
||||||
@@ -58,49 +75,88 @@ static void create_task(char *name, char *status)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int show_task(ulong number)
|
static void show_task(ulong number)
|
||||||
{
|
{
|
||||||
return 1;
|
printf("show_task(%lu)\n", number);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int delete_task(ulong number)
|
static void delete_task(ulong number)
|
||||||
{
|
{
|
||||||
return 1;
|
printf("delete_task(%lu)\n", number);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_task(ulong number, char *name, char *status, char *priority, time_t deadline)
|
||||||
|
{
|
||||||
|
printf("update task: #%lu, name: %s, status: %s, priority: %s, deadline: %s", number, name, status, priority, ctime(&deadline));
|
||||||
}
|
}
|
||||||
|
|
||||||
int pit_task(char *argv[])
|
int pit_task(char *argv[])
|
||||||
{
|
{
|
||||||
char **arg = &argv[1];
|
char **arg = &argv[1];
|
||||||
unsigned long number;
|
char *name = NULL, *status = NULL, *priority = NULL;
|
||||||
|
time_t deadline = (time_t)0;
|
||||||
|
ulong number = 0;
|
||||||
|
|
||||||
if (!*arg) {
|
if (!*arg) {
|
||||||
list_tasks();
|
list_tasks(NULL, NULL, NULL, 0); /* ...with default paramaters. */
|
||||||
} else if (!strcmp(*arg, "-c")) {
|
|
||||||
if (!*++arg) {
|
|
||||||
die("missing task name");
|
|
||||||
} else {
|
|
||||||
create_task(*arg, *(arg + 1));
|
|
||||||
}
|
|
||||||
} else if (!strcmp(*arg, "-d")) {
|
|
||||||
if (!*++arg) {
|
|
||||||
die("missing task number");
|
|
||||||
} else {
|
|
||||||
number = atoi(*arg);
|
|
||||||
if (!number) {
|
|
||||||
die("invalid task number");
|
|
||||||
} else {
|
|
||||||
delete_task(number);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* } else if (!strcmp(*arg, "-e")) { TODO: Edit */
|
|
||||||
} else {
|
} else {
|
||||||
number = atoi(*arg);
|
switch(pit_arg_option(arg)) {
|
||||||
if (!number) {
|
case 'c': /* pit task -c name [-s status] [-p priority] [-d deadline] */
|
||||||
die("invalid task parameters");
|
name = pit_arg_string(++arg, "task name");
|
||||||
} else {
|
while(*++arg) {
|
||||||
|
switch(pit_arg_option(arg)) {
|
||||||
|
case 's':
|
||||||
|
status = pit_arg_string(++arg, "task status");
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
priority = pit_arg_string(++arg, "task priority");
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
deadline = pit_arg_time(++arg, "task deadline");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
die("invalid task option: %s", *arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
create_task(name, status, priority, deadline);
|
||||||
|
break;
|
||||||
|
case 'u': /* pit task -u [number] [-n name] [-s status] [-d deadline] [-p priority] */
|
||||||
|
number = pit_arg_number(++arg, NULL);
|
||||||
|
if (!number) --arg;
|
||||||
|
while(*++arg) {
|
||||||
|
switch(pit_arg_option(arg)) {
|
||||||
|
case 'n':
|
||||||
|
name = pit_arg_string(++arg, "task name");
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
status = pit_arg_string(++arg, "task status");
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
priority = pit_arg_string(++arg, "task priority");
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
deadline = pit_arg_time(++arg, "task deadline");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
die("invalid task option: %s", *arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!name && !status && !priority && !deadline) {
|
||||||
|
die("nothing to update");
|
||||||
|
} else {
|
||||||
|
update_task(number, name, status, priority, deadline);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'd': /* pit task -d [number] */
|
||||||
|
number = pit_arg_number(++arg, NULL);
|
||||||
|
delete_task(number);
|
||||||
|
break;
|
||||||
|
case 's': /* pit task -s [all|open|closed] [-s status] [-d deadline] [-p priority] */
|
||||||
|
break;
|
||||||
|
default: /* pit task [number] */
|
||||||
|
number = pit_arg_number(++arg, NULL);
|
||||||
show_task(number);
|
show_task(number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#if !defined(__TASK_H__)
|
|
||||||
#define __TASK_H__
|
|
||||||
|
|
||||||
int pit_task(char *argv[]);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "pit.h"
|
#include "pit.h"
|
||||||
#include "user.h"
|
|
||||||
|
|
||||||
char *pit_current_user() {
|
char *pit_current_user() {
|
||||||
return getlogin();
|
return getlogin();
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
char *pit_current_user();
|
|
||||||
Reference in New Issue
Block a user