home *** CD-ROM | disk | FTP | other *** search
- #include <string.h>
- #include "uucpbase.h"
- #include "uucpproto.h"
- #include <time.h>
-
- #define ZERO 0
- #define CTLZ ('z'&0x1F)
-
-
- // Interne Prototypes:
- extern void __stdargs SPRINTF(UBYTE *, UBYTE *, ...);
-
- // Konstante(!) globale Variablen:
- const UWORD Days_in_Month[] =
- {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
-
-
- /*
- NAME
- FindConfig -- find a config entry in uulib:config
-
- SYNOPSIS
- configentry = FindConfig(keyword)
- D0 A0
-
- FUNCTION
- This function searches for the keyword in UULIB:config and
- returns, if found, the line behind it.
-
- INPUTS
- keyword - the keyword to search for.
-
- RESULT
- The approprate line
-
- */
-
- char *__asm _FindConfig(register __a6 struct UUCPBase *UUCPBase,
- register __a0 char *field)
- {
- char *buf;
- char *str;
- short flen = strlen(field);
-
- buf = UUCPBase->ConfigBuffer;
- if(buf == NULL)
- {
- BPTR fh;
- fh = Open("S:UUConfig", MODE_OLDFILE);
- if (fh == ZERO)
- fh = Open("UULIB:Config", MODE_OLDFILE);
-
- if(fh != ZERO)
- {
- long buflen;
- Seek(fh, 0L, OFFSET_END);
- buflen = Seek(fh, 0L, OFFSET_BEGINNING);
- if (buflen > 0 && (buf = AllocMem(buflen + 1, MEMF_PUBLIC)))
- {
- UUCPBase->ConfigBuffer = buf; // Pointer auf buffer merken
- UUCPBase->CB_Length = buflen + 1; // LΣnge in Library eintragen
-
- Read(fh, buf, buflen);
- buf[buflen] = CTLZ; /* can't use \0 */
- for (str = (char *)buf; *str; ++str)
- {
- char *bup;
- if (*str == '\n') /* make separate strs */
- {
- *str = 0;
- /* remove white space at end */
- for (bup = str - 1; bup >= (char *)buf && (*bup == ' ' || *bup == 9); --bup)
- *bup = 0;
- }
- }
- }
- else
- {
- buf = NULL;
- }
- Close(fh);
- }
- else
- {
- UUCPBase->Error = "Couldn't open S:UUConfig or UULIB:Config";
- }
- }
-
- if(buf == NULL)
- return(NULL);
-
- /*
- * Search ConfBuf for Field<space/tab>
- */
-
- for (str = (char *)buf; *str != CTLZ; str += strlen(str) + 1)
- {
- if(*str == 0 || *str == '#')
- continue;
- if (strncmp(str, field, flen) == 0 && (str[flen] == ' ' || str[flen] == '\t'))
- {
- str += flen;
- while (*str == ' ' || *str == 9)
- ++str;
- return(str);
- }
- }
- return(NULL);
- }
-
- char *__asm _GetConfig(register __a6 struct UUCPBase *UUCPBase,
- register __a0 char *field,
- register __a1 char *def)
- {
- char *result = FindConfig(field);
-
- if(result == NULL)
- result = def;
-
- return(result);
- }
-
- char *__asm _GetConfigDir(register __a6 struct UUCPBase *UUCPBase,
- register __a0 char *field)
- {
- char *result = FindConfig(field);
-
- if(result == NULL)
- result = field + strlen(field) + 1;
-
- return(result);
- }
-
- char *__asm _MakeConfigPath(register __a6 struct UUCPBase *UUCPBase,
- register __a0 char *field,
- register __a1 char *trailer)
- {
- char *Buf;
- char *result = GetConfigDir(field);
- short len = strlen(result) - 1;
-
- if((Buf =
- UUAllocMem((ULONG)(strlen(result) + strlen(trailer) + 5), MEMF_PUBLIC)) != NULL)
- {
- if(len > 0 && result[len] == '/' || result[len] == ':')
- {
- strcpy(Buf, result);
- strcat(Buf, trailer);
- }
- else
- {
- strcpy(Buf, result);
- strcat(Buf, "/");
- strcat(Buf, trailer);
- }
- }
- return(Buf);
- }
-
-
- /*
- * void UULog(char *)
- *
- */
- VOID __asm UULog(register __a6 struct UUCPBase *UUCPBase,
- register __a0 char *format,
- register __a1 LONG *args)
- {
-
- }
-
-
- /*
- * Verschiedene nⁿtzliche Routinen
- */
-
- /*
- GetTime()
-
- Liefert die Sekunden seit dem 1.1.1970 zurⁿck.
- */
- struct tm *__asm _GetTime(register __a6 struct UUCPBase *UUCPBase)
- {
- #define SECSFROM70TO78 ((long)(2*(4*365+1)*(60*60*24)))
- struct MsgPort *mp;
- struct timerequest tr;
- LONG secs = -1;
-
- if((mp = CreatePort(NULL, NULL)) != NULL)
- {
- if((OpenDevice(TIMERNAME, UNIT_VBLANK, &tr.tr_node, 0L)) == 0)
- {
- tr.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
- tr.tr_node.io_Message.mn_Node.ln_Pri = 0;
- tr.tr_node.io_Message.mn_Node.ln_Name = NULL;
- tr.tr_node.io_Message.mn_ReplyPort = mp;
- tr.tr_node.io_Command = TR_GETSYSTIME;
- DoIO((struct IORequest *)&tr);
-
- secs = tr.tr_time.tv_secs + ((tr.tr_time.tv_micro + 500000) / 1000000);
- secs += SECSFROM70TO78;
-
- CloseDevice((struct IORequest *)&tr);
- }
- DeletePort(mp);
- }
-
- if(secs != -1L)
- {
- struct tm *tm;
-
- LONG l, t;
- int i;
-
- if((tm = UUAllocMem(sizeof(struct tm), MEMF_CLEAR)) != NULL)
- {
- l = secs;
-
- tm->tm_sec = l % 60;
- l /= 60;
- tm->tm_min = l % 60;
- l /= 60;
- tm->tm_hour = l % 24;
- l /= 24;
- tm->tm_wday = (l + 4) % 7; /* add 4 days since first day of 70 not sunday */
- tm->tm_year = 70 + (l / (4 * 365 + 1)) * 4;
- l %= 4 * 365 + 1;
-
- while(l)
- {
- t = 365;
- if((tm->tm_year & 3) == 0)
- t++;
- if(l < t)
- break;
- l -= t;
- tm->tm_year++;
- }
- tm->tm_yday = l++;
-
- for(i = 0; i < 12; i++)
- {
- t = Days_in_Month[i];
- if(i == 1 && (tm->tm_year & 3) == 0)
- t++;
- if(l <= t)
- break;
- l -= t;
- }
- tm->tm_mon = i;
- tm->tm_mday = l;
-
- return tm;
- }
- }
- return NULL;
- }
-
-
- /*
- * TimeStamp()
- *
- * Liefert die aktuelle Zeit in einem Format zurⁿck, das direkt von den
- * Logging Routinen verwendet werden kann.
- *
- */
- UBYTE *__asm _TimeStamp(register __a6 struct UUCPBase *UUCPBase)
- {
- struct tm *tp;
- static char str[30];
-
- tp = GetTime(); // aktuelle Zeit holen
-
- SPRINTF(str, "%ld/%ld-%ld:%02ld:%02ld", tp->tm_mon + 1,
- tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
-
- return str;
- }
-
-
- /*
- SPrintfA()
- void __asm _SPrintfA(register __a6 struct UUCPBase *UUCPBase,
- register __a0 UBYTE *buffer,
- register __a1 UBYTE *format,
- register __a2 LONG *args)
- {
- RawDoFmt(format, (APTR)args, prbuf, (APTR)buffer);
- }
- */