/* * Copyright (C) 1999 Craig Knudsen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * Description: * Helps you keep track of time spent on different tasks. * * Author: * Craig Knudsen, cknudsen@cknudsen.com, http://www.cknudsen.com/ * * Home Page: * http://www.cknudsen.com/gtimer/ * * History: * 04-Apr-98 Created * ****************************************************************************/ #include #include #include #include #if HAVE_UNISTD_H #include #endif #include #if HAVE_STRING_H #include #endif #ifdef GTIMER_MEMDEBUG #include "memdebug/memdebug.h" #endif #define CONFIG_DEFAULTS #include "config.h" #define MAX_ATTR 256 #define MAX_LEN 1024 /* ** Local variables. */ static char *attrnames[MAX_ATTR]; /* attribute names */ static char *attrvalues[MAX_ATTR]; /* attribute values */ static int num_attr = 0; /* no. of attributes in above arrays */ static int modified = 0; /* modified since read from file */ static char *my_strtok ( #ifndef _NO_PROTO char *ptr1, char *tok #endif ); /* ** Read all the attributes in the specified file. */ int configReadAttributes ( path ) char *path; { int loop, old; char *text = NULL, *ptr; struct stat buf; int fd; modified = 0; for ( loop = 0; loop < num_attr; loop++ ) { free ( attrnames[loop] ); free ( attrvalues[loop] ); } num_attr = 0; for ( loop = 0; default_config[loop]; loop += 2 ) { attrnames[num_attr] = (char *) malloc ( strlen ( default_config[loop] ) + 1 ); strcpy ( attrnames[num_attr], default_config[loop] ); attrvalues[num_attr] = (char *) malloc ( strlen ( default_config[loop+1] ) + 1 ); strcpy ( attrvalues[num_attr], default_config[loop+1] ); num_attr++; } if ( stat ( path, &buf ) != 0 ) return ( -1 ); fd = open ( path, O_RDONLY ); if ( fd >= 0 ) { text = (char *) malloc ( buf.st_size + 1 ); read ( fd, text, buf.st_size ); text[buf.st_size] = '\0'; close ( fd ); ptr = my_strtok ( text, "\n" ); while ( ptr ) { for ( old = -1, loop = 0; loop < num_attr; loop++ ) { if ( strcmp ( attrnames[loop], ptr ) == 0 ) { old = loop; break; } } if ( old >= 0 ) { ptr = my_strtok ( NULL, "\n" ); if ( ! ptr ) break; free ( attrvalues[old] ); attrvalues[old] = (char *) malloc ( strlen ( ptr ) + 1 ); strcpy ( attrvalues[old], ptr ); } else { attrnames[num_attr] = (char *) malloc ( strlen ( ptr ) + 1 ); strcpy ( attrnames[num_attr], ptr ); ptr = my_strtok ( NULL, "\n" ); if ( ! ptr ) break; attrvalues[num_attr] = (char *) malloc ( strlen ( ptr ) + 1 ); strcpy ( attrvalues[num_attr], ptr ); num_attr++; } ptr = my_strtok ( NULL, "\n" ); } } else { return ( -1 ); } if ( text ) free ( text ); return ( 0 ); } /* ** Get the value for a specified attribute. */ int configGetAttribute ( attribute, value ) char *attribute; char **value; { int loop; for ( loop = 0; loop < num_attr; loop++ ) { if ( strcmp ( attrnames[loop], attribute ) == 0 ) { *value = attrvalues[loop]; return ( 0 ); } } return ( -1 ); } /* ** Get a value in int form. */ int configGetAttributeInt ( attribute, value ) char *attribute; int *value; { char *ptr; int ret; ret = configGetAttribute ( attribute, &ptr ); if ( ret == 0 ) { *value = atoi ( ptr ); return 0; } else return -1; } /* ** Set the value for a specified attribute. */ int configSetAttribute ( attribute, value ) char *attribute; char *value; { int loop; modified = 1; for ( loop = 0; loop < num_attr; loop++ ) { if ( strcmp ( attrnames[loop], attribute ) == 0 ) { free ( attrvalues[loop] ); attrvalues[loop] = (char *) malloc ( strlen ( value ) + 1 ); strcpy ( attrvalues[loop], value ); return ( 0 ); } } /* ** Attribute does not exits. Add it. */ attrnames[num_attr] = (char *) malloc ( strlen ( attribute ) + 1 ); strcpy ( attrnames[num_attr], attribute ); attrvalues[num_attr] = (char *) malloc ( strlen ( value ) + 1 ); strcpy ( attrvalues[num_attr], value ); num_attr++; return ( 0 ); } /* ** Set the value for a specified attribute. */ int configSetAttributeInt ( attribute, value ) char *attribute; int value; { char temp[50]; sprintf ( temp, "%d", value ); return ( configSetAttribute ( attribute, temp ) ); } /* ** Save the attributes in memory to the specified file. */ int configSaveAttributes ( attrfile ) char *attrfile; { FILE *fp; int loop; fp = fopen ( attrfile, "w" ); if ( ! fp ) { return ( -1 ); } for ( loop = 0; loop < num_attr; loop++ ) { fprintf ( fp, "%s\n%s\n", attrnames[loop], attrvalues[loop] ); } fclose ( fp ); modified = 0; return ( 0 ); } /* ** Tell the caller if changes have been made since last read/save. */ int configModified () { return ( modified ); } /* ** Clear out all values. */ void configClear () { int loop; for ( loop = 0; loop < num_attr; loop++ ) { free ( attrnames[loop] ); free ( attrvalues[loop] ); } num_attr = 0; modified = 1; } static char *my_strtok ( ptr1, tok ) char *ptr1; char *tok; { static char *last; char *p; if ( ! ptr1 ) ptr1 = last; else last = ptr1; if ( ! ptr1 ) return ( NULL ); for ( p = ptr1; *p != '\0'; p++ ) { if ( strncmp ( p, tok, strlen ( tok ) ) == 0 ) { *p = '\0'; last = p + strlen ( tok ); return ( ptr1 ); } } last = NULL; return ( ptr1 ); }