Iteration macros now create automatic iteration pointer variable

This commit is contained in:
Mike Dvorkin
2010-08-07 19:49:18 -07:00
parent 6a653f3295
commit 21b447d4ea
4 changed files with 13 additions and 28 deletions

View File

@@ -5,7 +5,6 @@
static void action_list() static void action_list()
{ {
PAction pa;
PPager ppager; PPager ppager;
pit_db_load(); pit_db_load();

View File

@@ -30,10 +30,10 @@ typedef int bool;
#define max(a,b) ((a) > (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b))
#endif #endif
#define for_each_project(ptr) for (ptr = (PProject)projects->slots; (ptr - (PProject)projects->slots) < projects->number_of_records; ptr++) #define for_each_project(ptr) PProject ptr; for (ptr = (PProject)projects->slots; (ptr - (PProject)projects->slots) < projects->number_of_records; ptr++)
#define for_each_task(ptr) for (ptr = (PTask)tasks->slots; (ptr - (PTask)tasks->slots) < tasks->number_of_records; ptr++) #define for_each_task(ptr) PTask ptr; for (ptr = (PTask)tasks->slots; (ptr - (PTask)tasks->slots) < tasks->number_of_records; ptr++)
#define for_each_note(ptr) for (ptr = (PNote)notes->slots; (ptr - (PNote)notes->slots) < notes->number_of_records; ptr++) #define for_each_note(ptr) PNote ptr; for (ptr = (PNote)notes->slots; (ptr - (PNote)notes->slots) < notes->number_of_records; ptr++)
#define for_each_action(ptr) for (ptr = (PAction)actions->slots; (ptr - (PAction)actions->slots) < actions->number_of_records; ptr++) #define for_each_action(ptr) PAction ptr; for (ptr = (PAction)actions->slots; (ptr - (PAction)actions->slots) < actions->number_of_records; ptr++)
/* Externals. */ /* Externals. */
extern PTable actions; extern PTable actions;

View File

@@ -34,8 +34,7 @@ static void project_parse_options(char **arg, char **name, char **status);
static void project_list(char *name, char *status) static void project_list(char *name, char *status)
{ {
PProject pp; PPager ppager;
PPager ppager;
pit_db_load(); pit_db_load();
if (projects->number_of_records > 0) { if (projects->number_of_records > 0) {
@@ -81,8 +80,6 @@ static void project_show(ulong id)
printf("%lu: %s (%s, %lu task%s)\n", printf("%lu: %s (%s, %lu task%s)\n",
pp->id, pp->name, pp->status, pp->number_of_tasks, (pp->number_of_tasks != 1 ? "s" : "")); pp->id, pp->name, pp->status, pp->number_of_tasks, (pp->number_of_tasks != 1 ? "s" : ""));
if (pp->number_of_tasks > 0) { if (pp->number_of_tasks > 0) {
PTask pt = (PTask)tasks->slots;
puts("Tasks:"); puts("Tasks:");
for_each_task(pt) { for_each_task(pt) {
printf(" %c %lu: %s (%lu notes)\n", (pt->id == tasks->current ? '*' : ' '), pt->id, pt->name, pt->number_of_notes); printf(" %c %lu: %s (%lu notes)\n", (pt->id == tasks->current ? '*' : ' '), pt->id, pt->name, pt->number_of_notes);
@@ -113,13 +110,9 @@ static void project_update(ulong id, char *name, char *status)
static void project_delete(ulong id) static void project_delete(ulong id)
{ {
PProject pp; PProject pp;
PTask pt;
char *deleted_name;
ulong deleted_number_of_tasks;
pit_db_load(); pit_db_load();
project_find_current(&pp, &id); project_find_current(&pp, &id);
/* /*
** Delete project tasks. ** Delete project tasks.
*/ */
@@ -135,8 +128,9 @@ static void project_delete(ulong id)
** Ready to delete the project itself. But first preserve the ** Ready to delete the project itself. But first preserve the
** name and number of tasks since we need these bits for logging. ** name and number of tasks since we need these bits for logging.
*/ */
deleted_name = str2str(pp->name); char *deleted_name = str2str(pp->name);
deleted_number_of_tasks = pp->number_of_tasks; ulong deleted_number_of_tasks = pp->number_of_tasks;
pp = (PProject)pit_table_delete(projects, id); pp = (PProject)pit_table_delete(projects, id);
if (pp) { if (pp) {
pit_table_mark(projects, 0); /* TODO: find better current project candidate. */ pit_table_mark(projects, 0); /* TODO: find better current project candidate. */
@@ -149,8 +143,6 @@ static void project_delete(ulong id)
static bool project_already_exist(char *name) static bool project_already_exist(char *name)
{ {
PProject pp;
pit_db_load(); pit_db_load();
for_each_project(pp) { for_each_project(pp) {
if (!strcmp(pp->name, name)) { if (!strcmp(pp->name, name)) {

View File

@@ -32,14 +32,11 @@ static void task_parse_options(char **arg, char **name, char **status, char **pr
static void task_list(char *name, char *status, char *priority, time_t date, time_t time) static void task_list(char *name, char *status, char *priority, time_t date, time_t time)
{ {
PProject pp;
PTask pt;
PPager ppager;
pit_db_load(); pit_db_load();
if (tasks->number_of_records > 0) { if (tasks->number_of_records > 0) {
pp = (PProject)pit_table_current(projects); PProject pp = (PProject)pit_table_current(projects);
ppager = pit_pager_initialize(PAGER_TASK, tasks->number_of_records); PPager ppager = pit_pager_initialize(PAGER_TASK, tasks->number_of_records);
for_each_task(pt) { for_each_task(pt) {
if (pp && pt->project_id != pp->id) { if (pp && pt->project_id != pp->id) {
continue; continue;
@@ -114,18 +111,15 @@ void pit_task_delete(ulong id, PProject pp)
PTask pt; PTask pt;
bool standalone = (pp == NULL); bool standalone = (pp == NULL);
if (standalone) { if (standalone) pit_db_load();
pit_db_load();
pp = (PProject)pit_table_find(projects, pt->project_id);
}
task_find_current(&pt, &id); task_find_current(&pt, &id);
if (standalone) pp = (PProject)pit_table_find(projects, pt->project_id);
if (pp) { if (pp) {
/* /*
** First delete task notes if any. ** First delete task notes if any.
*/ */
if (pt->number_of_notes > 0) { if (pt->number_of_notes > 0) {
PNote pn;
for_each_note(pn) { for_each_note(pn) {
if (pn->task_id == id) { if (pn->task_id == id) {
pit_note_delete(pn->id, pt); pit_note_delete(pn->id, pt);