110 lines
2.8 KiB
C
110 lines
2.8 KiB
C
/* themerc.c - functions that deals with theme rc file
|
|
*
|
|
* 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.
|
|
*/
|
|
/* please do NOT translate error messages... =/ */
|
|
#include <glib.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
/* read contents of fname into gchar * */
|
|
gchar **trc_open(gchar *fname)
|
|
{
|
|
gint fd;
|
|
struct stat fds;
|
|
ssize_t rb;
|
|
gchar *rc, **rcs;
|
|
|
|
if ((fd=open(fname, O_RDONLY)) == -1) {
|
|
fprintf(stderr, "%s: open() %s failed: %s\n", __FUNCTION__, fname, strerror(errno));
|
|
return NULL;
|
|
}
|
|
if ((fstat(fd, &fds)) == -1) {
|
|
close(fd);
|
|
fprintf(stderr, "%s: fstat() failed: %s\n", __FUNCTION__, strerror(errno));
|
|
return NULL;
|
|
}
|
|
if (!(fds.st_size)) {
|
|
close(fd);
|
|
fprintf(stderr, "%s: zero length file.\n", __FUNCTION__);
|
|
return NULL;
|
|
}
|
|
if (!(rc=malloc(fds.st_size+1))) {
|
|
close(fd);
|
|
fprintf(stderr, "%s: malloc() failed: cannot alloc %d bytes\n", __FUNCTION__, (int)fds.st_size);
|
|
return NULL;
|
|
}
|
|
if ((rb=read(fd, rc, fds.st_size)) != fds.st_size) {
|
|
free(rc);
|
|
close(fd);
|
|
if (rb == -1) {
|
|
fprintf(stderr, "%s: read() failed: %s\n", __FUNCTION__, strerror(errno));
|
|
} else {
|
|
fprintf(stderr, "%s: read() reads less bytes than expected =/\n", __FUNCTION__);
|
|
}
|
|
return NULL;
|
|
}
|
|
rc[fds.st_size]=0;
|
|
close(fd);
|
|
rcs=g_strsplit(rc, "\n", 0);
|
|
free(rc);
|
|
return rcs;
|
|
}
|
|
|
|
/* free rc... */
|
|
void trc_close(gchar **rcs) {
|
|
if (rcs) {
|
|
g_strfreev(rcs);
|
|
}
|
|
}
|
|
|
|
/* return string value for given parameter. if not found retun NULL */
|
|
gchar *trc_get_str(gchar **rcs, gchar *param)
|
|
{
|
|
gint i;
|
|
gchar **strval,*val;
|
|
|
|
if (!rcs) {
|
|
fprintf(stderr, "%s called with uninitialised rcs. strange. \n", __FUNCTION__);
|
|
return NULL;
|
|
}
|
|
if (!param) {
|
|
fprintf(stderr, "%s called with NULL param. strange. \n", __FUNCTION__);
|
|
return NULL;
|
|
}
|
|
for (i=0;rcs[i];i++) {
|
|
if (rcs[i][0] && rcs[i][0]!='#' && (strval=g_strsplit(rcs[i],"=",2)) && strval[0] && strval[1]) {
|
|
if (!(strcmp(g_strstrip(strval[0]),param))) {
|
|
val=g_strdup(g_strstrip(strval[1]));
|
|
g_strfreev(strval);
|
|
return val;
|
|
}
|
|
g_strfreev(strval);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/* return unsigned integer value for given parameter. if not found retun -1 */
|
|
gint trc_get_uint(gchar **rcs, gchar *param) {
|
|
gchar *val;
|
|
gint ret;
|
|
|
|
if (!(val=trc_get_str(rcs, param))) {
|
|
return -1;
|
|
}
|
|
ret = atoi(val);
|
|
g_free (val);
|
|
return ret;
|
|
}
|