#if defined(macintosh) #include <types.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <assert.h> #include <unistd.h> #include <stdarg.h> #include <limits.h> #include "merc.h" #define MAX_PROJECT 20 PROJECT_DATA *project_list = NULL; PROJECT_DATA *project_last = NULL; PROJECT_DATA *project_free = NULL; bool remove_project args((int i)); void load_project() { PROJECT_DATA *project; FILE *fp; char *name; if ((fp = fopen("../txt/project.txt", "r")) == NULL) { log_string("Non-fatal error: project.txt not found!"); return; } name = fread_word(fp); while (str_cmp(name, END_MARKER)) { project = alloc_perm(sizeof(PROJECT_DATA)); project->imm = str_dup(name); project->date = fread_string(fp); project->text = fread_string(fp); if (project_list) project_list->prev = project; project->next = project_list; project_list = project; if (!project_last) project_last = project; name = fread_word(fp); } fclose(fp); } void do_addproject( CHAR_DATA *ch, char *argument ) { PROJECT_DATA *project; PROJECT_DATA *cproject; char *strtime; char buf[50]; int i; if (IS_NPC(ch)) return; /* we need something to add to the list */ if (argument[0] == '\0' || strlen(argument) < 5) { send_to_char("What is your project?\n\r", ch); return; } /* Mainly to avoid that the list looks ugly */ if (strlen(argument) > 60) { send_to_char("Keep it under 60 chars please.\n\r", ch); return; } /* Set the current time */ strtime = ctime(¤t_time); for (i = 0; i < 6; i++) { buf[i] = strtime[i + 4]; } buf[6] = '\0'; /* If we have a free project, we reuse it */ if (project_free) { project = project_free; project_free = project_free->next; project->next = NULL; if (project_free) project_free->prev = NULL; } else project = alloc_perm(sizeof(*project)); /* set the strings for the project */ project->imm = str_dup(ch->name); project->text = str_dup(argument); project->date = str_dup(buf); /* If theres already a project, just add to the list */ if (project_last) { project_last->next = project; project->prev = project_last; project->next = NULL; project_last = project; } else // there are no project. { project->next = project_list; project_list = project; project_last = project; } /* Removing the oldest project if the list has gone beyond the max */ cproject = project_list; i = 0; while ((cproject = cproject->next) != NULL) i++; if (i >= MAX_PROJECT) remove_project(1); send_to_char("Project added.\n\r", ch ); save_project(); return; } /* * The player function. * simply lists the last MAX_PROJECT projects */ void do_project(CHAR_DATA *ch, char *argument) { PROJECT_DATA *project; char buf[MAX_STRING_LENGTH]; char tempbuf[MAX_STRING_LENGTH]; bool found = FALSE; int i = 0; if (IS_NPC(ch)) return; sprintf(buf, " #R[#0*******#R] #yNeeded projects to be done #R[#0*******#R]#n\n\r\n\r"); for (project = project_list; project; project = project->next) { found = TRUE; ++i; sprintf(tempbuf, " #R[#0%3d#R] #G%-6s #L%-9s #C%s#n\n\r", i, project->date, project->imm, project->text); strcat(buf, tempbuf); } if (found) send_to_char(buf, ch); else send_to_char("No projects.\n\r", ch); return; } void do_delproject(CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; bool found = FALSE; int i; if (IS_NPC(ch)) return; one_argument(argument, arg); if ((i = atoi(arg)) < 1) { send_to_char("Which project did you want to remove ?\n\r", ch); return; } found = remove_project(i); if (!found) send_to_char("No such project.\n\r", ch); else send_to_char("Project removed.\n\r", ch); save_project(); return; } bool remove_project(int i) { PROJECT_DATA *project; bool found = FALSE; for (project = project_list; project; project = project->next) { if (--i > 0) continue; found = TRUE; /* clearing out the strings */ free_string(project->imm); free_string(project->text); free_string(project->date); /* update the pointer to the last project if needed */ if (project == project_last) project_last = project->prev; /* handle the special case of the first project */ if (project == project_list) { project_list = project->next; if (project->next) project->next->prev = NULL; } else { project->prev->next = project->next; if (project->next) project->next->prev = project->prev; } /* Handle the free list */ project->next = project_free; project->prev = NULL; if (project_free) project_free->prev = project; project_free = project; /* terminate the loop */ break; } /* did we remove anything ? */ return found; } void save_project() { FILE *fp; PROJECT_DATA *project; int i = 0; if ((fp = fopen("../txt/project.txt","w")) == NULL) { log_string("Error writing to project.txt"); return; } for (project = project_last; project; project = project->prev) { if (++i > MAX_PROJECT) break; fprintf(fp, "%s\n", project->imm); fprintf(fp, "%s~\n", project->date); fprintf(fp, "%s~\n", project->text); } fprintf(fp, "%s\n", END_MARKER); fclose(fp); }