?? misc.c
字號:
/*** $Id: misc.c,v 1.57.4.2 2005/03/02 02:59:49 panweiguo 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 <ctype.h>#include <errno.h>#include <limits.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "misc.h"#ifndef __NOUNIX__# include <unistd.h># include <time.h># include <pwd.h># include <sys/ioctl.h># include <sys/types.h>#endif#ifdef _CLIPBOARD_SUPPORT#include "clipboard.h"#endif/* Handle of MiniGUI etc file object */GHANDLE hMgEtc = 0;#ifndef _INCORE_RES/* Initialize MiniGUI etc file object, call before accessing MiniGUI etc value */BOOL InitMgEtc (void){ if (hMgEtc) return TRUE; if ( !(hMgEtc = LoadEtcFile (ETCFILEPATH)) ) return FALSE; return TRUE;}/* Terminate MiniGUI etc file object */void TerminateMgEtc (void){ UnloadEtcFile (hMgEtc); hMgEtc = 0;}#elseextern ETC_S MGETC;BOOL InitMgEtc (void){ extern ETC_S MGETC; hMgEtc = (GHANDLE) &MGETC; return TRUE;}void TerminateMgEtc (void) { }#endif /* _INCORE_RES */#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; } getcwd (etcfile, MAX_PATH); strcat (etcfile, "/"); strcat (etcfile, ETCFILENAME); if (GetValueFromEtcFile (etcfile, "system", "gal_engine", buff, 8) == ETC_OK) { strcpy (ETCFILEPATH, etcfile); return TRUE; } return FALSE;}#endif /* _INCORE_RES */BOOL InitMisc (void){#ifndef _INCORE_RES if (!LookForEtcFile ()) { fprintf (stderr, "MISC: Can not locate your MiniGUI.cfg file or bad files!\n"); return FALSE; }#endif#ifdef _CLIPBOARD_SUPPORT InitClipBoard ();#endif return InitMgEtc ();}void TerminateMisc (void){#ifdef _CLIPBOARD_SUPPORT TerminateClipBoard ();#endif TerminateMgEtc ();}/****************************** 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -