home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
comm
/
misc
/
cyberpager
/
source
/
library
/
aliases.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-07
|
4KB
|
168 lines
/*
* read the aliases file looking for a particular alias. returns a struct
* describing that alias if found or NULL if not found (or an error occurs).
* format of lines in the alias file are:
*
* ; indicates start of a comment
*
* <alias> <service name> <pin> <max message> <max page>
*/
#include "memory.h"
#define TEMPLATE "NAME/A,SERVICE/A,PIN/A,MAXMSG/N/A,MAXPAGE/N/A"
enum templateArgs {
ARG_NAME,
ARG_SERVICE,
ARG_PIN,
ARG_MAXMSG,
ARG_MAXPAGE,
ARG_sizeof
};
#define INPUT_BUFFER_SIZE (1024)
PagerAlias_t *__saveds __asm FindPagerAlias(register __a0 PagerHandle_t * ph, register __a1 STRPTR aliasName)
{
PrivatePagerAlias_t *pals;
PagerAlias_t *als;
ULONG line = 0;
STRPTR inputBuffer, ptr;
struct RDArgs *ArgsPtr, *MyArgs;
char *ArgArray[ARG_sizeof];
BOOL leave;
BPTR fh;
ObtainSemaphore(&ph->ph_Sema);
/* first look to see if we have already read this alias in */
for (pals = (PrivatePagerAlias_t *) ph->ph_AliasList.mlh_Head;
pals->pals_Node.mln_Succ;
pals = (PrivatePagerAlias_t *) pals->pals_Node.mln_Succ)
if (stricmp(aliasName, pals->pals_Alias.als_Name) == 0) {
pals->pals_UseCount++;
ReleaseSemaphore(&ph->ph_Sema);
return &pals->pals_Alias;
}
/*
* oh, well. need to read the aliases file to find information on
* this aliases
*/
als = NULL;
if (inputBuffer = MyAllocVec(INPUT_BUFFER_SIZE)) {
/* try and open the aliases file */
if (fh = Open("pager:aliases", MODE_OLDFILE)) {
/* loop reading lines looking for the alias desired */
leave = FALSE;
while (leave == FALSE && FGets(fh, inputBuffer, INPUT_BUFFER_SIZE - 1)) {
line++;
/*
* check to make sure the line isn't all
* blank
*/
ptr = inputBuffer;
while (isspace(*ptr))
ptr++;
if (!*ptr)
continue;
/*
* check for comment character at beginning
* of line
*/
if (*ptr == ';')
continue;
/* setup to call ReadArgs() to parse the line */
if (MyArgs = (struct RDArgs *)AllocDosObject(DOS_RDARGS, TAG_DONE)) {
MyArgs->RDA_Flags |= RDAF_NOPROMPT;
MyArgs->RDA_Source.CS_Buffer = inputBuffer;
MyArgs->RDA_Source.CS_Length = strlen(inputBuffer);
MyArgs->RDA_Source.CS_CurChr = 0L;
memset((char *)ArgArray, 0, sizeof(ArgArray));
if (ArgsPtr = ReadArgs(TEMPLATE, (LONG *)&ArgArray, MyArgs)) {
if (stricmp(aliasName, ArgArray[ARG_NAME]) == 0) {
/*
* we've found the
* alias so allocate
* and fill in a
* alias structure
*/
leave = TRUE;
if (pals = (PrivatePagerAlias_t *) MyAllocVec(sizeof(PrivatePagerAlias_t) + strlen(ArgArray[ARG_NAME]) + strlen(ArgArray[ARG_SERVICE]) + strlen(ArgArray[ARG_PIN]) + 3)) {
pals->pals_Handle = ph;
pals->pals_UseCount = 1;
AddTail((struct List *)&ph->ph_AliasList, (struct Node *)&pals->pals_Node);
als = &pals->pals_Alias;
als->als_Name = (STRPTR)&als[1];
als->als_Service = als->als_Name + strlen(ArgArray[ARG_NAME]) + 1;
als->als_PIN = als->als_Service + strlen(ArgArray[ARG_SERVICE]) + 1;
strcpy(als->als_Name, ArgArray[ARG_NAME]);
strcpy(als->als_Service, ArgArray[ARG_SERVICE]);
strcpy(als->als_PIN, ArgArray[ARG_PIN]);
als->als_MaxMessageLen = *((LONG *)ArgArray[ARG_MAXMSG]);
als->als_MaxPageLen = *((LONG *)ArgArray[ARG_MAXPAGE]);
}
}
FreeArgs(ArgsPtr);
}
else {
Fault(IoErr(), NULL, inputBuffer, INPUT_BUFFER_SIZE - 1);
ULog(ph, -1, "Error in aliases file - line %ld: %s", line, inputBuffer);
leave = TRUE;
}
FreeDosObject(DOS_RDARGS, MyArgs);
}
}
Close(fh);
}
else
ULog(ph, -1, "Couldn't open aliases file");
MyFreeVec(inputBuffer);
}
ReleaseSemaphore(&ph->ph_Sema);
return als;
}
void __saveds __asm FreePagerAlias(register __a0 PagerAlias_t * als)
{
PrivatePagerAlias_t *pals;
if (als) {
pals = (PrivatePagerAlias_t *) ((size_t) als - offsetof(PrivatePagerAlias_t, pals_Alias));
ObtainSemaphore(&pals->pals_Handle->ph_Sema);
if (--pals->pals_UseCount == 0) {
Remove((struct Node *)&pals->pals_Node);
MyFreeVec(pals);
}
ReleaseSemaphore(&pals->pals_Handle->ph_Sema);
}
}