From 924ca70a4006abbffc8f43f27c4f64c8fc517a08 Mon Sep 17 00:00:00 2001 From: foswret Date: Fri, 22 May 2026 11:52:34 -0500 Subject: draw_month_grid() doesn't use dimension struct anymore. create generate extents structs for month, paper, and day --- src/ezini.c | 1033 ----------------------------------------------------------- 1 file changed, 1033 deletions(-) delete mode 100644 src/ezini.c (limited to 'src/ezini.c') diff --git a/src/ezini.c b/src/ezini.c deleted file mode 100644 index ee1f79e..0000000 --- a/src/ezini.c +++ /dev/null @@ -1,1033 +0,0 @@ -/** - * \brief INI File handling library - * \file ezini.c - * \author Michael Dipperstein (mdipperstein@gmail.com) - * \date November 22, 2015 - * - * This file implements a set of library functions that maybe be used - * to create, update, and/or parse INI files. - * - * \copyright Copyright (C) 2015, 2019 by Michael Dipperstein - * (mdipperstein@gmail.com) - * - * \par - * This file is part of the ezini library. - * - * \license - * The ezini library is free software; you can redistribute it - * and/or modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either version 3 - * of the License, or (at your option) any later version. - * - * \par - * The ezini library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser - * General Public License for more details. - * - * \par - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - * - */ - -/** - * \defgroup library Library Code - * \brief This module contains the code for the ezini INI file handling - * library - * @{ - */ - -/*************************************************************************** -* INCLUDED FILES -***************************************************************************/ -#include -#include -#include -#include -#include -#include "ezini.h" - -/*************************************************************************** -* TYPE DEFINITIONS -***************************************************************************/ - -/** - * \struct ini_key_list_t - * \brief A structure used for creating linked lists of key/value pairs - * for a each section. - */ - -/** - * \typedef struct ini_key_list_t - * \brief A shortcut for struct ini_key_list_t - */ - -typedef struct ini_key_list_t -{ - char *key; /*!< pointer to a a NULL terminated string - containing key name for this entry */ - char *value; /*!< pointer to a NULL terminated string - containing key value for this entry Use - ASCII strings to represent numbers */ - struct ini_key_list_t *next;/*!< pointer to the next key/value pair in - in this section */ - -} ini_key_list_t; - - -/** - * \struct ini_section_list_t - * \brief A structure used for creating linked lists of sections, each - * maintaining its own list of key/value pairs. - */ - -/** - * \typedef struct ini_section_list_t - * \brief A shortcut for struct ini_section_list_t - */ - -typedef struct ini_section_list_t -{ - char *section; /*!< pointer to a NULL terminated string - containing the section name */ - ini_key_list_t *members; /*!< pointer to the list of all key/value - pairs in this section */ - struct ini_section_list_t *next; /*!< pointer to the next section in - the list of entries */ - -} ini_section_list_t; - - -/*************************************************************************** -* PROTOTYPES -***************************************************************************/ - -/* allocate */ -static ini_key_list_t *NewKeyList(const char *key, const char *value); -static ini_section_list_t *NewSectionList(const char *section, const char *key, - const char *value); - -/* free */ -static void FreeKeyList(ini_key_list_t *list); -static void FreeEntry(ini_entry_t *entry); - -/* utilities */ -static char *SkipWS(const char *str); -static char *DupStr(const char *src); -static char *GetLine(FILE *fp); - -/*************************************************************************** -* FUNCTIONS -***************************************************************************/ - -/** - * \fn int AddEntryToList(ini_entry_list_t *list, const char *section, - * const char *key, const char *value) - * - * \brief This function adds a (section, key, value) entry to an entry list. - * - * \param list A pointer to an ini_entry_list_t that points to the - * head of entry list being modified. Pass a pointer to an ini_entry_list_t - * pointing to NULL if the list needs to be created. - * - * \param section A NULL terminated string containing the name of the - * section for the entry being added. - * - * \param key A NULL terminated string containing the name of the key for - * the entry being added. - * - * \param value A NULL terminated string containing the value of the key for - * the entry being added. All values must be represented as strings. They may - * be converted to/from strings by the calling program. - * - * \effects - * Information used to generate an entry structure containing copies of - * the (section, key, value) entry is added to the list passed as a parameter. - * Memory will be dynamically allocated as needed. - * - * \returns 0 for success, Non-zero on error. Error type is contained in - * errno. - * - * This function adds information used to create a (section, key, value) entry - * to an entry list. - * - * If an entry containing the same section name and key already exists, - * the new value will overwrite the old value. - * - * If the entry is for an existing section, it will be added to the end of the - * list for that section. - * - * If the entry is for a new section, a new section will be added to the list of - * sections, and the key/value pair will be the first entry of the section. - */ -int AddEntryToList(ini_entry_list_t *list, const char *section, - const char *key, const char *value) -{ - ini_section_list_t *next; - int result; - - /* handle empty list */ - if (NULL == *list) - { - /* add the first entry to the list */ - *list = NewSectionList(section, key, value); - - if (NULL == *list) - { - return -1; - } - - return 0; - } - - next = *list; - result = 1; - - while (1) - { - result = strcmp(section, next->section); - - if (0 == result) - { - break; /* match, insert here */ - } - - if (NULL == next->next) - { - break; /* no match, create new section here */ - } - - next = next->next; - } - - if (0 == result) - { - ini_key_list_t *member; - - member = next->members; - - while (1) - { - result = strcmp(key, member->key); - - if (0 == result) - { - break; /* match, insert here */ - } - - if (NULL == member->next) - { - break; /* no match, create new section here */ - } - - member = member->next; - } - - if (0 == result) - { - /* key exists, change value */ - free(member->value); - member->value = DupStr(value); - - if (NULL == member->value) - { - return -1; - } - } - else - { - /* new key, add to list */ - member->next = NewKeyList(key, value); - - if (NULL == member->next) - { - return -1; - } - } - } - else - { - /* add the section to the list with this key and value */ - next->next = NewSectionList(section, key, value); - } - - return 0; -} - - -/** - * \fn void FreeList(ini_entry_list_t list) - * - * \brief This function frees all of the members of an entry list. - * - * \param list A pointer to the head of an ini_entry_list_t - * - * \effects - * All of the memory allocated for all of the entries in an entry - * list will be freed. - * - * \returns Nothing - * - * This function uses recursion to step to the tail of the list and deletes - * section entries on the way back up. - */ -void FreeList(ini_entry_list_t list) -{ - /* recurse to the end of the list and free everything on the way back */ - if (list->next != NULL) - { - FreeList(list->next); - } - - if (list->section != NULL) - { - /* free the section name */ - free(list->section); - } - - if (list->members != NULL) - { - FreeKeyList(list->members); - } - - free(list); -} - - -/** - * \fn int MakeINIFile(const char *iniFile, const ini_entry_list_t list) - * - * \brief This function creates the specified INI file from the list of - * entries passed as an argument. - * - * \param iniFile The name of the INI file to be created. stdout will be - * used if iniFile is NULL. - * - * \param list A pointer to a list of that will be used to construct - * (section, key, value) entries. - * - * \effects - * The specified file is created and the (section, key, value) - * triples generated from the entry list are written to the file. If the - * specified file already exists, it will be overwritten. - * - * \returns 0 for success, Non-zero on error. Error type is contained in - * errno. - * - * This function creates the specified INI file from the list of entries - * passed as an argument. Any existing INI file with the same name in the - * same path will be overwritten. - */ -int MakeINIFile(const char *iniFile, const ini_entry_list_t list) -{ - ini_entry_list_t section; - ini_key_list_t *members; - FILE *fp; - - if (NULL == list) - { - errno = EINVAL; - return -1; - } - - if (NULL == iniFile) - { - fp = stdout; - } - else - { - - fp = fopen(iniFile, "w"); - - if (NULL == fp) - { - return -1; - } - } - - section = list; - - while (section != NULL) - { - fprintf(fp, "[%s]\n", section->section); - - members = section->members; - - while (members != NULL) - { - fprintf(fp, "%s = %s\n", members->key, members->value); - members = members->next; - } - - fprintf(fp, "\n"); - section = section->next; - } - - if (fp != stdout) - { - fclose(fp); - } - - return 0; -} - - -/** - * \fn int AddEntryToFile(const char *iniFile, const ini_entry_list_t list) - * - * \brief This function adds (section, key, value) entries in an entry list - * to an INI file. - * - * \param iniFile The name of the INI file to be modified. - * - * \param list A pointer to a list of entries to be added to the INI file. - * - * \effects - * The INI file will be re-written containing the results of adding - * the entries in the entry list to the entries already contained in the INI - * file. - * - * \returns 0 for success, Non-zero on error. Error type is contained in - * errno. - * - * This function adds (section, key, value) entries in an entry list to an - * INI file. Section order will be maintained with new sections added to the - * end of the INI file. If an entry containing the same section name and key - * already exists, the new value will overwrite the old value. - */ -int AddEntryToFile(const char *iniFile, const ini_entry_list_t list) -{ - ini_entry_t entry; - ini_entry_list_t merged; - ini_entry_list_t here; - int result; - FILE *fp; - - if (NULL == iniFile) - { - errno = EINVAL; - return -1; - } - - if (NULL == list) - { - errno = EINVAL; - return -1; - } - - fp = fopen(iniFile, "r"); - - if (NULL == fp) - { - return -1; - } - - merged = NULL; - entry.section = NULL; - entry.key = NULL; - entry.value = NULL; - - /* read ini file back into an entry list */ - while ((result = GetEntryFromFile(fp, &entry)) > 0) - { - AddEntryToList(&merged, entry.section, entry.key, entry.value); - } - - fclose(fp); - - if (result < 0) - { - FreeList(merged); - return -1; - } - - /* add entries passed into this function to entries from INI file */ - here = list; - - while (here != NULL) - { - ini_key_list_t *members; - - members = here->members; - - while (members != NULL) - { - AddEntryToList(&merged, here->section, members->key, - members->value); - members = members->next; - } - - here = here->next; - } - - /* re-write INI file from merged entry list */ - result = MakeINIFile(iniFile, merged); - FreeList(merged); - - return result; -} - -/** - * \fn int DeleteEntryFromFile(const char *iniFile, const char *section, - * const char *key) - * - * \brief This function deletes all entries from an INI file that match the - * section and key passed as an argument. - * - * \param iniFile The name of the INI file containing the entry to be - * deleted. - * - * \param section A pointer to a NULL terminated string containing the name - * of the section of the entry to be deleted. - * - * \param key A pointer to a NULL terminated string containing the name of - * the key of the entry to be deleted. - * - * \effects - * The INI file will be re-written without any entries that match - * the section and key to be deleted. Empty sections will not be deleted. - * - * \returns 0 for success, Non-zero on error. Error type is contained in - * errno. - * - * This function deletes all entries from an INI file that match the section - * and key passed as an argument. Empty sections will not be deleted. - * - * \note There will never be more than one matching entry in INI files - * created by this library. - */ -int DeleteEntryFromFile(const char *iniFile, const char *section, - const char *key) -{ - ini_entry_t entry; - ini_entry_list_t list; - int result; - FILE *fp; - - if (NULL == iniFile) - { - errno = EINVAL; - return -1; - } - - if (NULL == section) - { - errno = EINVAL; - return -1; - } - - if (NULL == key) - { - errno = EINVAL; - return -1; - } - - fp = fopen(iniFile, "r"); - - if (NULL == fp) - { - return -1; - } - - list = NULL; - entry.section = NULL; - entry.key = NULL; - entry.value = NULL; - - /* read ini file back into a structure */ - while ((result = GetEntryFromFile(fp, &entry)) > 0) - { - if (0 != strcmp(entry.section, section)) - { - /* this isn't one we're supposed to delete */ - AddEntryToList(&list, entry.section, entry.key, entry.value); - } - else if (0 != strcmp(entry.key, key)) - { - /* this isn't one we're supposed to delete */ - AddEntryToList(&list, entry.section, entry.key, entry.value); - } - } - - fclose(fp); - - if (result < 0) - { - FreeList(list); - return -1; - } - - result = MakeINIFile(iniFile, list); - FreeList(list); - - return result; -} - -/** - * \fn int GetEntryFromFile(FILE *iniFile, ini_entry_t *entry) - * - * \brief This function parses an INI file stream passed as an input, - * searching for the next (section, key, value) triple. - * - * \param iniFile A pointer to the INI file to be parsed. It must be - * opened for reading. - * - * \param entry A pointer to the entry structure used to store the discovered - * (section, key, value) triple. - * - * \effects - * The specified file is read until it discovers an entry. - * - * \returns 1 when an entry is found\n - * 0 when no more entries can be found\n - * -1 for an error. Error type is contained in errno. - * - * This function parses an INI file stream passed as an input, searching for - * the next (section, key, value) triple. The resulting triple will be used - * to populate the entry structure passed as a parameter. - */ -int GetEntryFromFile(FILE *iniFile, ini_entry_t *entry) -{ - char *line; - char *ptr; - - if (NULL == iniFile) - { - errno = EINVAL; - return -1; - } - - if (NULL == entry) - { - errno = EINVAL; - return -1; - } - - /* handle section names, comments, and blank lines */ - while ((line = GetLine(iniFile)) != NULL) - { - /* skip leading spaces and blank lines */ - ptr = SkipWS(line); - - /* skip blank lines and lines starting with ';' or '#' */ - if (*ptr == '\0' || *ptr == ';' || *ptr == '#') - { - free(line); - continue; - } - else if (*ptr == '[') - { - /* possible new section */ - char *end; - - end = strchr(ptr, ']'); - - if (NULL == end) - { - FreeEntry(entry); - errno = EILSEQ; - return -1; - } - - /* we have the full string for a new section, trim white space */ - ptr = SkipWS(ptr + 1); - - while (isspace(*(end - 1))) - { - end--; - } - - *end = '\0'; - - free(entry->section); - entry->section = DupStr(ptr); - free(line); - } - else - { - /* this line should be key = value */ - break; - } - } - - /* we either have a non-section line or nothing left to get */ - if (NULL == line) - { - /* nothing left to get */ - FreeEntry(entry); - return 0; - } - - /* the only other allowable lines are of the form key = value */ - free(entry->key); /* free old key */ - entry->key = ptr; - ptr++; - - while (*ptr != '=') - { - if (*ptr == '\0') - { - /* didn't find '=' */ - entry->key = NULL; - FreeEntry(entry); - free(line); - errno = EILSEQ; - return -1; - } - - ptr++; - } - - /* we found the '=' separating key and value trim white space */ - free(entry->value); /* free old value */ - entry->value = ptr + 1; - ptr--; - - while (isspace(*ptr)) - { - ptr--; - } - - *(ptr + 1) = '\0'; - entry->key = DupStr(entry->key); - - ptr = entry->value; - - /* now skip white space after '=' */ - while (*ptr == ' ' || *ptr =='\t') - { - if (*ptr == '\0') - { - FreeEntry(entry); - free(line); - errno = EILSEQ; - return -1; - } - - ptr++; - } - - /* we found the start of value, trim trailing white space */ - entry->value = ptr; - ptr = entry->value + strlen(entry->value) - 1; - - while (isspace(*ptr)) - { - ptr--; - } - - *(ptr + 1) = '\0'; - entry->value = DupStr(entry->value); - - free(line); - return 1; -} - - -/** - * \fn ini_key_list_t *NewKeyList(const char *key, const char *value) - * - * \brief This function allocates memory for a new ini_key_list_t type - * variable and populates it with the data passed as parameters - * - * \param key A pointer to a NULL terminated string containing the key name - * - * \param key A pointer to a NULL terminated string containing the value of - * this key. Use ASCII strings to represent numbers. - * - * \effects - * Memory will be allocated for a new ini_key_list_t and copies - * of the key and value strings passed as a parameter. key and value are - * copied into the appropriate fields and the next pointer is set to NULL. - * - * \returns A pointer to the ini_key_list_t item that was allocated. The - * pointer will be NULL if an error occurs. - * - * This function allocates memory for a new ini_key_list_t and copies - * of the key and value strings passed as a parameter. The next pointer - * will be set to NULL. - */ -static ini_key_list_t *NewKeyList(const char *key, const char *value) -{ - ini_key_list_t *item; - - item = (ini_key_list_t *)malloc(sizeof(ini_key_list_t)); - - if (NULL == item) - { - return NULL; - } - - /* allocation succeeded copy key and value */ - item->next = NULL; - - item->key = DupStr(key); - - if (NULL == item->key) - { - free(item); - return NULL; - } - - item->value = DupStr(value); - - if (NULL == item->value) - { - free(item->key); - free(item); - return NULL; - } - - return item; -} - - -/** - * \fn ini_section_list_t *NewSectionList(const char *section, const char *key, - * const char *value) - * - * \brief This function allocates memory for a new ini_section_list_t type - * variable and populates it with the data passed as parameters - * - * \param section A pointer to a NULL terminated string containing the section - * name - - * \param key A pointer to a NULL terminated string containing the key name - * - * \param key A pointer to a NULL terminated string containing the value of - * this key. Use ASCII strings to represent numbers. - * - * \effects - * Memory will be allocated for a new ini_section_list_t and copies - * of the section, key, value strings passed as a parameter. section is - * copied to the appropriate field and a new key list items is created fo - * the key and value strings. The next pointer will be set to NULL. - * - * \returns A pointer to the ini_section_list_t item that was allocated. The - * pointer will be NULL if an error occurs. - * - * This function allocates memory for a new ini_section_list_t and copies - * of the section, key, value strings passed as a parameter. A ini_key_list_t - * is allocated for the key and value strings. The next pointer is set to NULL. - */ -static ini_section_list_t *NewSectionList(const char *section, const char *key, - const char *value) -{ - ini_section_list_t *item; - - item = (ini_section_list_t *)malloc(sizeof(ini_section_list_t)); - - if (NULL == item) - { - return NULL; - } - - /* now populate item */ - item->next = NULL; - item->section = DupStr(section); - - if (NULL == item->section) - { - free(item); - return NULL; - } - - /* start a member list with the current key and value */ - item->members = NewKeyList(key, value); - - if (NULL == item->members) - { - free(item->section); - free(item); - return NULL; - } - - return item; -} - - -/** - * \fn void FreeKeyList(ini_key_list_t *list) - * - * \brief This function frees all of the members of a key list. - * - * \param list A pointer to the head of an ini_key_list_t - * - * \effects All of the memory allocated for all of the key/value pairs in - * a key list will be freed. - * - * \returns Nothing - * - * This function uses recursion to step to the tail of the list and deletes - * key/value entries on the way back up. - */ -static void FreeKeyList(ini_key_list_t *list) -{ - /* recurse to the end of the list and free everything on the way back */ - if (list->next != NULL) - { - FreeKeyList(list->next); - } - - free(list->key); - free(list->value); - free(list); -} - - -/** - * \fn static void FreeEntry(ini_entry_t *entry) - * - * \brief This function frees the allocated memory that is pointed to by the - * members of an ini_entry_t structure. - * - * \param entry A pointer to the entry structure containing the members - * pointing to the memory to be freed. - * - * \effects Dynamically allocated memory is freed and entry data is set - * to NULL. - * - * \returns Nothing - */ -static void FreeEntry(ini_entry_t *entry) -{ - free(entry->section); - free(entry->key); - free(entry->value); - - entry->section = NULL; - entry->key = NULL; - entry->value = NULL; -} - -/** - * \fn static char *SkipWS(const char *str) - * - * \brief This function returns a pointer to the first non-space in the - * string passed as a parameter. - * - * \param str A pointer to the string being searched. - * - * \effects None - * - * \returns A pointer to the first non-space in str. - */ -static char *SkipWS(const char *str) -{ - char *c; - - c = (char *)str; - while(isspace(*c)) - { - c++; - } - - return c; -} - -/** - * \fn static char *DupStr(const char *src) - * - * \brief This function returns a copy of the string passed as a parameter. - * - * \param str A pointer to the string being being copied. - * - * \effects Memory is dynamically allocated to hold a duplicate of the - * input string. - * - * \returns A copy of str in malloced memory is returned on success. NULL - * is returned on failure. - * - * This function returns a copy of the string passed as a parameter. The - * memory for the copy is allocated by malloc() and must be freed by the caller. - */ -static char *DupStr(const char *src) -{ - char *dest; - - if (NULL == src) - { - return NULL; - } - - dest = (char *)malloc(strlen(src) + 1); - - if (NULL != dest) - { - strcpy(dest, src); - } - - return dest; -} - -/** - * \fn static char *GetLine(FILE *fp) - * - * \brief This function returns a NULL terminated array of char containing the - * next line in the file passed as an argument. - * - * \param fp A pointer to the file being read. - * - * \effects One line is read from fp and copied into a dynamically allocated - * string. - * - * \returns A NULL terminated array of char containing the next line in fp - * is retured. The array must be free by the caller. NULL is returned at end - * of file. - * - * This function returns a NULL terminated array of char containing the next - * line in the file passed as an argument. The memory for the string returned - * is allocated by malloc() and must be freed by the caller. - */ -static char *GetLine(FILE *fp) -{ - char *line; /* string to read line into */ - char *next; /* where to write the next characters into */ - const size_t chunkSize = 32; - size_t lineSize; - - if ((NULL == fp) || feof(fp)) - { - return NULL; - } - - lineSize = chunkSize; - line = (char *)malloc(lineSize * sizeof(char)); - - if (NULL == line) - { - /* allocation failed */ - return NULL; - } - - line[0] = '\0'; - next = line; - - while (NULL != fgets(next, lineSize - strlen(line), fp)) - { - if ('\n' == line[strlen(line) - 1]) - { - /* we got to the EOL strip off the trailing '\n' and exit */ - line[strlen(line) - 1] = '\0'; - break; - } - else - { - /* there's still more on this line */ - lineSize += chunkSize; - line = (char *)realloc(line, lineSize); - - if (NULL == line) - { - return NULL; - } - - next = line + strlen(line); - } - } - - return line; -} - -/**@}*/ -- cgit v1.2.3