home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
fsrc1241.zip
/
cfgfile_interface.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-02-14
|
8KB
|
209 lines
/*---------------------------------------------------------------------------+
| Titel: CFGFILE_INTERFACE.C |
+-----------------------------------------+---------------------------------+
| Erstellt von: Michael Hohner | Am: 12.01.1995 |
+-----------------------------------------+---------------------------------+
| System: OS/2 2.x |
+---------------------------------------------------------------------------+
| Beschreibung: |
| |
| Dynamisches CFG-Interface |
| |
| |
+---------------------------------------------------------------------------+
| Bemerkungen: |
+---------------------------------------------------------------------------*/
/*----------------------------- Header-Dateien ------------------------------*/
#pragma strings(readonly)
#define INCL_BASE
#include <os2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "structs.h"
#include "areaman\areaman.h"
#include "cfgfile_interface.h"
/*--------------------------------- Defines ---------------------------------*/
#define CFGDLL_MASK "FLTCF_??.DLL"
/*---------------------------------- Typen ----------------------------------*/
/*---------------------------- Globale Variablen ----------------------------*/
/*--------------------------- Funktionsprototypen ---------------------------*/
/*----------------------- interne Funktionsprototypen -----------------------*/
/*-----------------------------------------------------------------------------
| Funktionsname: CFG_ReadFormatList
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Beschreibung: Erstellt eine Liste der CFG-DLLs mit den unterstützten
| Formaten
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Parameter: -
|
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Rückgabewerte: Zeiger auf Anfang der Liste
|
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Sonstiges: -
|
+---------------------------------------------------------------------------*/
PCFGDLL CFG_ReadFormatList(void)
{
PCFGDLL pRetList=NULL, pRetListLast=NULL;
LOADEDCFGDLL LoadedDLL;
FILEFINDBUF3 FindBuf;
HDIR FindHandle = HDIR_CREATE;
ULONG ulNumFiles=1;
APIRET rc;
char pchCurrentDir[LEN_PATHNAME+1];
char pchDLLName[LEN_PATHNAME+1];
ULONG ulLen = sizeof(pchCurrentDir);
ULONG ulDisk, ulMapping;
DosQueryCurrentDisk(&ulDisk, &ulMapping);
DosQueryCurrentDir(0, pchCurrentDir, &ulLen);
rc = DosFindFirst(CFGDLL_MASK, &FindHandle, FILE_ARCHIVED, &FindBuf, sizeof(FindBuf),
&ulNumFiles, FIL_STANDARD);
while (!rc)
{
char *pchTemp;
/* gefundene DLL pruefen */
sprintf(pchDLLName, "%c:\\%s\\%s", '@'+ulDisk, pchCurrentDir, FindBuf.achName);
/* DLL laden */
if (!CFG_LoadDLL(pchDLLName, &LoadedDLL))
{
/* korrekte DLL, Daten holen */
if (pRetList)
{
pRetListLast->next = calloc(1, sizeof(CFGDLL));
pRetListLast = pRetListLast->next;
}
else
pRetList = pRetListLast = calloc(1, sizeof(CFGDLL));
strcpy(pRetListLast->pchDLLName, pchDLLName);
pRetListLast->ulFormatID = LoadedDLL.QueryFormatID();
pchTemp = LoadedDLL.QueryFormatName();
if (pchTemp)
strcpy(pRetListLast->pchFormatName, pchTemp);
else
_itoa(pRetListLast->ulFormatID, pRetListLast->pchFormatName, 10);
/* DLL wieder freigeben */
DosFreeModule(LoadedDLL.hmodCfgDLL);
}
/* naechste DLL suchen */
ulNumFiles = 1;
rc = DosFindNext(FindHandle, &FindBuf, sizeof(FindBuf), &ulNumFiles);
}
if (FindHandle != HDIR_CREATE)
DosFindClose(FindHandle);
return pRetList;
}
/*-----------------------------------------------------------------------------
| Funktionsname: CFG_FindFormat
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Beschreibung: Sucht ein Format in der Liste
|
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Parameter: pList: Anfang der Liste
| ulFormatID: Gesuchtes Format (CFGTYPE_ANY = beliebig)
| pPrev: vorheriges gefundenes (NULL = vom Anfang)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Rückgabewerte: NULL nicht gefunden/Ende der Liste
| sonst Pointer auf Element
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Sonstiges: -
|
+---------------------------------------------------------------------------*/
PCFGDLL CFG_FindFormat(PCFGDLL pList, ULONG ulFormatID, PCFGDLL pPrev)
{
if (!pPrev)
pPrev = pList; /* vom Anfang */
else
pPrev = pPrev->next; /* vom naechsten Element */
while (pPrev &&
(ulFormatID != CFGTYPE_ANY) &&
(pPrev->ulFormatID !=ulFormatID))
pPrev = pPrev->next;
return pPrev;
}
/*-----------------------------------------------------------------------------
| Funktionsname: CFG_LoadDLL
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Beschreibung: Laedt eine CFG-DLL
|
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Parameter: pchDLLName: Name der DLL
| pLoadedCfgDLL: Lade-Block
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Rückgabewerte: LOADCFGDLL_OK kein Fehler
| LOADCFGDLL_CANTLOAD DLL nicht ladbar
| LOADCFGDLL_FUNCMISSING Funktion fehlt
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Sonstiges: -
|
+---------------------------------------------------------------------------*/
int CFG_LoadDLL(PCHAR pchDLLName, PLOADEDCFGDLL pLoadedCfgDLL)
{
char fail[50]="";
APIRET rc=0;
if (!(rc = DosLoadModule(fail, sizeof(fail), pchDLLName, &pLoadedCfgDLL->hmodCfgDLL)))
{
if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYVER, NULL,
(PFN*)&pLoadedCfgDLL->QueryVer)))
{
if ((rc=pLoadedCfgDLL->QueryVer()) == CURRENT_CFGVER)
{
if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYID, NULL,
(PFN*)&pLoadedCfgDLL->QueryFormatID)))
if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYNAME, NULL,
(PFN*)&pLoadedCfgDLL->QueryFormatName)))
if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_READCFG, NULL,
(PFN*)&pLoadedCfgDLL->ReadCfgFile)))
return LOADCFGDLL_OK;
}
else
{
DosFreeModule(pLoadedCfgDLL->hmodCfgDLL);
return LOADCFGDLL_VERSION;
}
}
/* Fehler */
DosFreeModule(pLoadedCfgDLL->hmodCfgDLL);
return LOADCFGDLL_FUNCMISSING;
}
else
{
return LOADCFGDLL_CANTLOAD;
}
}
/*-------------------------------- Modulende --------------------------------*/