📄 misc.c
字号:
/*** $Id: misc.c,v 1.44 2003/11/22 13:49:59 weiym Exp $**** misc.c: This file include some miscelleous functions. **** Copyright (C) 2003 Feynman Software.** Copyright (C) 1999 ~ 2002 Wei Yongming.**** Create date: 1998/12/31**** Current maintainer: Wei Yongming.*//*** 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*//*** TODO:*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <limits.h>#include <pwd.h>#include <sys/ioctl.h>#include <sys/types.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "misc.h"/* Handle of MiniGUI etc file object */GHANDLE hMgEtc = 0;#ifndef _INCORE_RESchar ETCFILEPATH [MAX_PATH + 1];#define ETCFILENAME "MiniGUI.cfg"static BOOL LookForEtcFile (void){ char etcfile [MAX_PATH + 1]; char buff [10]; struct passwd *pwd; if ((pwd = getpwuid (geteuid ())) != NULL) { strcpy (etcfile, pwd->pw_dir); if (etcfile [strlen (etcfile) - 1] != '/') strcat (etcfile, "/"); strcat (etcfile, "."); strcat (etcfile, ETCFILENAME); if (GetValueFromEtcFile (etcfile, "system", "gal_engine", buff, 8) == ETC_OK) { strcpy (ETCFILEPATH, etcfile); return TRUE; } } strcpy (etcfile, "/usr/local/etc/" ETCFILENAME); if (GetValueFromEtcFile (etcfile, "system", "gal_engine", buff, 8) == ETC_OK) { strcpy (ETCFILEPATH, etcfile); return TRUE; } strcpy (etcfile, "/etc/" ETCFILENAME); if (GetValueFromEtcFile (etcfile, "system", "gal_engine", buff, 8) == ETC_OK) { strcpy (ETCFILEPATH, etcfile); return TRUE; } return FALSE;}BOOL InitMisc (void){ if (!LookForEtcFile ()) { fprintf (stderr, "MISC: Can not locate your MiniGUI.cfg file or bad files!\n"); return FALSE; } return InitMgEtc ();}#endif /* _INCORE_RES *//****************************** ETC file support ******************************/static char* get_section_name (char *section_line){ char* current; char* tail; char* name; if (!section_line) return NULL; current = section_line; while (*current == ' ' || *current == '\t') current++; if (*current == ';' || *current == '#') return NULL; if (*current++ == '[') while (*current == ' ' || *current == '\t') current ++; else return NULL; name = tail = current; while (*tail != ']' && *tail != '\n' && *tail != ';' && *tail != '#' && *tail != '\0') tail++; *tail = '\0'; while (*tail == ' ' || *tail == '\t') { *tail = '\0'; tail--; } return name;}static int get_key_value (char *key_line, char **mykey, char **myvalue){ char* current; char* tail; char* value; if (!key_line) return -1; current = key_line; while (*current == ' ' || *current == '\t') current++; if (*current == ';' || *current == '#') return -1; if (*current == '[') return 1; if (*current == '\n' || *current == '\0') return -1; tail = current; while (*tail != '=' && *tail != '\n' && *tail != ';' && *tail != '#' && *tail != '\0') tail++; value = tail + 1; if (*tail != '=') *value = '\0'; *tail-- = '\0'; while (*tail == ' ' || *tail == '\t') { *tail = '\0'; tail--; } tail = value; while (*tail != '\n' && *tail != '\0') tail++; *tail = '\0'; if (mykey) *mykey = current; if (myvalue) *myvalue = value; return 0;}/* This function locate the specified section in the etc file. */static int etc_LocateSection(FILE* fp, const char* pSection, FILE* bak_fp){ char szBuff[ETC_MAXLINE + 1]; char *name; while (TRUE) { if (!fgets(szBuff, ETC_MAXLINE, fp)) { if (feof (fp)) return ETC_SECTIONNOTFOUND; else return ETC_FILEIOFAILED; } else if (bak_fp && fputs (szBuff, bak_fp) == EOF) return ETC_FILEIOFAILED; name = get_section_name (szBuff); if (!name) continue; if (strcmp (name, pSection) == 0) return ETC_OK; } return ETC_SECTIONNOTFOUND;}/* This function locate the specified key in the etc file. */static int etc_LocateKeyValue(FILE* fp, const char* pKey, BOOL bCurSection, char* pValue, int iLen, FILE* bak_fp, char* nextSection){ char szBuff[ETC_MAXLINE + 1 + 1]; char* current; char* value; int ret; while (TRUE) { int bufflen; if (!fgets(szBuff, ETC_MAXLINE, fp)) return ETC_FILEIOFAILED; bufflen = strlen (szBuff); if (szBuff [bufflen - 1] == '\n') szBuff [bufflen - 1] = '\0'; ret = get_key_value (szBuff, ¤t, &value); if (ret < 0) continue; else if (ret > 0) { fseek (fp, -bufflen, SEEK_CUR); return ETC_KEYNOTFOUND; } if (strcmp (current, pKey) == 0) { if (pValue) strncpy (pValue, value, iLen); return ETC_OK; } else if (bak_fp && *current != '\0') fprintf (bak_fp, "%s=%s\n", current, value); } return ETC_KEYNOTFOUND;}static int etc_ReadSection (FILE* fp, PETCSECTION psect){ char szBuff[ETC_MAXLINE + 1 + 1]; char* sect_name; int max_key_nr = 5; psect->name = NULL; psect->key_nr = 0; while (TRUE) { int bufflen; if (!fgets(szBuff, ETC_MAXLINE, fp)) { if (feof (fp)) { if (psect->name) break; else return ETC_SECTIONNOTFOUND; } else return ETC_FILEIOFAILED; } bufflen = strlen (szBuff); if (szBuff [bufflen - 1] == '\n') szBuff [bufflen - 1] = '\0'; if (!psect->name) { /* read section name */ sect_name = get_section_name (szBuff); if (!sect_name) continue; psect->name = strdup (sect_name); psect->key_nr = 0; psect->keys = malloc (sizeof(char*)*max_key_nr); psect->values = malloc (sizeof(char*)*max_key_nr); } else { /* read key and value */ int ret; char *key, *value; if (psect->key_nr == max_key_nr) { max_key_nr += 5; psect->keys = (char **) realloc (psect->keys, sizeof(char*)*max_key_nr); psect->values = (char **) realloc (psect->values, sizeof(char*)*max_key_nr); } ret = get_key_value (szBuff, &key, &value); if (ret < 0) continue; else if (ret > 0) { /* another section begins */ fseek (fp, -bufflen, SEEK_CUR); break; } *(psect->keys + psect->key_nr) = strdup (key); *(psect->values + psect->key_nr) = strdup (value); psect->key_nr ++; } } return ETC_OK;}GHANDLE GUIAPI LoadEtcFile (const char * pEtcFile){ FILE* fp; int max_sect_nr = 15; ETC_S *petc; PETCSECTION psect; if (!(fp = fopen(pEtcFile, "r"))) return ETC_FILENOTFOUND; petc = (ETC_S*) malloc (sizeof(ETC_S)); petc->section_nr = 0; /* we allocate 15 sections first */ petc->sections = (PETCSECTION) malloc (sizeof(ETCSECTION)*max_sect_nr); psect = petc->sections; while (etc_ReadSection (fp, psect) == ETC_OK) { petc->section_nr ++; psect ++; if (petc->section_nr == max_sect_nr) { /* add 5 sections each time we realloc */ max_sect_nr += 5; petc->sections = realloc (petc->sections, sizeof(ETCSECTION)*max_sect_nr); psect = petc->sections+petc->section_nr; } } fclose (fp); return (GHANDLE)petc;}int GUIAPI UnloadEtcFile (GHANDLE hEtc){ int i; ETC_S *petc = (ETC_S*) hEtc; if (!petc) return -1; for (i=0; i<petc->section_nr; i++) { PETCSECTION psect = petc->sections + i; int j; if (!psect) continue; for (j=0; j<psect->key_nr; j++) { free (psect->keys[j]); free (psect->values[j]); } free (psect->keys); free (psect->values); free (psect->name); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -