Add magimail (crashmail2 fork) to repo

This commit is contained in:
Andrew Pamment
2017-03-18 23:04:38 +10:00
parent 8fad85affc
commit 807574ccf4
98 changed files with 23583 additions and 7 deletions

View File

@@ -0,0 +1,423 @@
#include <stdlib.h>
#include <string.h>
#include "shared/types.h"
#include "shared/expr.h"
#include <oslib/os.h>
#include <oslib/osmem.h>
struct expr *expr_get(struct expr *expr,int *errpos,char **errstr)
{
int c,d,len,start;
bool hasnot,hasquote,stop;
struct expr *res;
hasnot=FALSE;
c=expr->parsepos;
/* Skip leading whitespace */
while(expr->buf[c]==' ')
c++;
/* Check for NOT */
if(strnicmp(&expr->buf[c],"NOT ",4)==0)
{
c+=4;
hasnot=TRUE;
}
/* Check if parentheses */
if(expr->buf[c]=='(')
{
int nump;
nump=1;
d=c+1;
while(nump!=0 && expr->buf[d]!=0)
{
if(expr->buf[d]=='(') nump++;
if(expr->buf[d]==')') nump--;
d++;
}
if(nump == 0)
{
start=c+1;
len=d-c-2;
if(!(res=osAlloc(sizeof(struct expr))))
{
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
if(!(res->buf=osAlloc(len+10)))
{
osFree(res);
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
res->parsepos=0;
res->offset=expr->offset+start;
res->buf[0]=0;
if(hasnot)
strcat(res->buf,"NOT ");
strncat(res->buf,&expr->buf[start],len);
expr->parsepos=d;
return(res);
}
else
{
*errpos=expr->offset+c;
*errstr="No matching parenthesis found";
return(NULL);
}
}
d=c;
stop=FALSE;
hasquote=FALSE;
while(!stop)
{
if(expr->buf[d] == 0)
stop=TRUE;
if(expr->buf[d] == ' ' && !hasquote)
stop=TRUE;
if(expr->buf[d] == '"' && hasquote)
stop=TRUE;
if(expr->buf[d] == '"')
hasquote=TRUE;
if(!stop)
d++;
}
if(expr->buf[d]=='"')
d++;
start=c;
len=d-c;
if(!(res=osAlloc(sizeof(struct expr))))
{
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
if(!(res->buf=osAlloc(len+10)))
{
osFree(res);
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
res->parsepos=0;
res->offset=expr->offset+start;
res->buf[0]=0;
if(hasnot)
strcat(res->buf,"NOT ");
strncat(res->buf,&expr->buf[start],len);
expr->parsepos=d;
return(res);
}
struct expr *expr_getrest(struct expr *expr,int *errpos,char **errstr)
{
int c,d,start,len;
struct expr *res;
c=expr->parsepos;
/* Skip leading whitespace */
while(expr->buf[c]==' ')
c++;
d=c;
while(expr->buf[d]!=0)
d++;
start=c;
len=d-c;
if(!(res=osAlloc(sizeof(struct expr))))
{
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
if(!(res->buf=osAlloc(len+10)))
{
osFree(res);
*errpos=expr->offset;
*errstr="Out of memory";
return(NULL);
}
res->parsepos=0;
res->offset=expr->offset+start;
res->buf[0]=0;
strncat(res->buf,&expr->buf[start],len);
expr->parsepos=d;
return(res);
}
struct expr *expr_makeexpr(char *str)
{
struct expr *expr;
if(!(expr=osAllocCleared(sizeof(struct expr))))
{
return(NULL);
}
if(!(expr->buf=osAlloc(strlen(str)+1)))
{
osFree(expr);
return(NULL);
}
strcpy(expr->buf,str);
return(expr);
}
void expr_free(struct expr *expr)
{
osFree(expr->buf);
osFree(expr);
}
int expr_eval(struct expr *expr,int (*eval)(char *str,int *errpos,char **errstr),int *errpos,char **errstr)
{
struct expr *e1,*e2,*e3;
e1=expr_get(expr,errpos,errstr);
if(!e1)
{
return(-1);
}
e2=expr_get(expr,errpos,errstr);
if(!e2)
{
expr_free(e1);
return(-1);
}
e3=expr_getrest(expr,errpos,errstr);
if(!e3)
{
expr_free(e1);
expr_free(e2);
return(-1);
}
if(e2->buf[0] == 0)
{
/* Only one expression */
if(strcmp(e1->buf,expr->buf)==0)
{
/* No more simplification possible */
if(strnicmp(e1->buf,"NOT ",4)==0)
{
int res;
strcpy(e1->buf,&e1->buf[4]);
e1->parsepos=0;
res=expr_eval(e1,eval,errpos,errstr);
if(res == 1) res=0;
else if(res == 0) res=1;
/* printf("NOT |%s|: %d\n",e1->buf,res); */
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(res);
}
else
{
int res,tmperrpos;
res=(*eval)(e1->buf,&tmperrpos,errstr);
if(res == -1)
*errpos=e1->offset+tmperrpos;
/* printf("EVAL: |%s|: %d\n",e1->buf,res); */
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(res);
}
}
else
{
int res;
res=expr_eval(e1,eval,errpos,errstr);
/* printf("|%s|: %d\n",e1->buf,res); */
expr_free(e1);
expr_free(e2);
expr_free(e3);
return (res);
}
}
if(stricmp(e2->buf,"AND")==0)
{
int r1,r2,res;
if(e3->buf[0] == 0)
{
*errstr="Expected second expression after AND";
*errpos=e3->offset;
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
r1=expr_eval(e1,eval,errpos,errstr);
if(r1 == -1)
{
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
r2=expr_eval(e3,eval,errpos,errstr);
if(r2 == -1)
{
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
res=0;
if(r1 && r2)
res=1;
/* printf("|%s| AND |%s|: %d\n",e1->buf,e3->buf,res); */
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(res);
}
else if(stricmp(e2->buf,"OR")==0)
{
int r1,r2,res;
if(e3->buf[0] == 0)
{
*errstr="Expected second expression after OR";
*errpos=e3->offset;
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
r1=expr_eval(e1,eval,errpos,errstr);
if(r1 == -1)
{
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
r2=expr_eval(e3,eval,errpos,errstr);
if(r2 == -1)
{
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
res=0;
if(r1 || r2)
res=1;
/* printf("|%s| OR |%s|: %d\n",e1->buf,e3->buf,res); */
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(res);
}
else
{
*errstr="Expected AND or OR";
*errpos=e2->offset;
expr_free(e1);
expr_free(e2);
expr_free(e3);
return(-1);
}
}

View File

@@ -0,0 +1,11 @@
struct expr
{
char *buf;
int parsepos;
int offset;
};
int expr_eval(struct expr *expr,int (*eval)(char *str,int *errpos,char **errstr),int *errpos,char **errstr);
struct expr *expr_makeexpr(char *str);
void expr_free(struct expr *expr);

View File

@@ -0,0 +1,92 @@
/* PktHeader */
#define PKTHEADER_ORIGNODE 0
#define PKTHEADER_DESTNODE 2
#define PKTHEADER_YEAR 4
#define PKTHEADER_MONTH 6
#define PKTHEADER_DAY 8
#define PKTHEADER_HOUR 10
#define PKTHEADER_MINUTE 12
#define PKTHEADER_SECOND 14
#define PKTHEADER_BAUD 16
#define PKTHEADER_PKTTYPE 18
#define PKTHEADER_ORIGNET 20
#define PKTHEADER_DESTNET 22
#define PKTHEADER_PRODCODELOW 24
#define PKTHEADER_REVMAJOR 25
#define PKTHEADER_PASSWORD 26
#define PKTHEADER_QORIGZONE 34
#define PKTHEADER_QDESTZONE 36
#define PKTHEADER_AUXNET 38
#define PKTHEADER_CWVALIDCOPY 40
#define PKTHEADER_PRODCODEHIGH 42
#define PKTHEADER_REVMINOR 43
#define PKTHEADER_CAPABILWORD 44
#define PKTHEADER_ORIGZONE 46
#define PKTHEADER_DESTZONE 48
#define PKTHEADER_ORIGPOINT 50
#define PKTHEADER_DESTPOINT 52
#define PKTHEADER_PRODDATA 54
#define SIZE_PKTHEADER 58
/* PktHeader FSC-0045 */
#define PKTHEADER45_ORIGNODE 0
#define PKTHEADER45_DESTNODE 2
#define PKTHEADER45_ORIGPOINT 4
#define PKTHEADER45_DESTPOINT 6
#define PKTHEADER45_RESERVED 8
#define PKTHEADER45_SUBVERSION 16
#define PKTHEADER45_VERSION 18
#define PKTHEADER45_ORIGNET 20
#define PKTHEADER45_DESTNET 22
#define PKTHEADER45_PRODCODE 24
#define PKTHEADER45_REVISION 25
#define PKTHEADER45_PASSWORD 26
#define PKTHEADER45_ORIGZONE 34
#define PKTHEADER45_DESTZONE 36
#define PKTHEADER45_ORIGDOMAIN 38
#define PKTHEADER45_DESTDOMAIN 46
#define PKTHEADER45_PRODDATA 54
#define SIZE_PKTHEADER45 58
/* PktMsgHeader */
#define PKTMSGHEADER_PKTTYPE 0
#define PKTMSGHEADER_ORIGNODE 2
#define PKTMSGHEADER_DESTNODE 4
#define PKTMSGHEADER_ORIGNET 6
#define PKTMSGHEADER_DESTNET 8
#define PKTMSGHEADER_ATTR 10
#define PKTMSGHEADER_COST 12
/* plus header strings */
#define SIZE_PKTMSGHEADER 14
/* Header flags */
#define FLAG_PVT 1
#define FLAG_CRASH 2
#define FLAG_RECD 4
#define FLAG_SENT 8
#define FLAG_FILEATTACH 16
#define FLAG_INTRANSIT 32
#define FLAG_ORPHAN 64
#define FLAG_KILLSENT 128
#define FLAG_LOCAL 256
#define FLAG_HOLD 512
/* FLAG_UNUSED 1024 */
#define FLAG_FILEREQ 2048
#define FLAG_RREQ 4096
#define FLAG_IRRR 8192
#define FLAG_AUDIT 16384
#define FLAG_UPDATEREQ 32768

View File

@@ -0,0 +1,96 @@
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#include "oslib/osmem.h"
#include "shared/jblist.h"
void jbNewList(struct jbList *list)
{
list->First=NULL;
list->Last=NULL;
}
void jbAddNode(struct jbList *list, struct jbNode *node)
{
if(!list->First)
list->First=node;
else
list->Last->Next=node;
list->Last=node;
node->Next=NULL;
}
void jbFreeList(struct jbList *list)
{
struct jbNode *tmp,*tmp2;
for(tmp=list->First;tmp;)
{
tmp2=tmp->Next;
osFree(tmp);
tmp=tmp2;
}
list->First=NULL;
list->Last=NULL;
}
void jbFreeNum(struct jbList *list,uint32_t num)
{
struct jbNode *old=NULL,*tmp;
uint32_t c;
tmp=list->First;
for(c=0;c<num && tmp;c++)
{
if(c==num-1)
old=tmp;
tmp=tmp->Next;
}
if(c==num)
{
if(old)
old->Next=tmp->Next;
if(num==0)
list->First=tmp->Next;
if(tmp->Next == NULL)
list->Last=old;
osFree(tmp);
}
}
void jbFreeNode(struct jbList *list,struct jbNode *node)
{
struct jbNode *old=NULL,*tmp;
for(tmp=list->First;tmp;tmp=tmp->Next)
{
if(tmp->Next == node)
old=tmp;
if(tmp == node) break;
}
if(tmp == node)
{
if(old)
old->Next=tmp->Next;
if(node == list->First)
list->First=tmp->Next;
if(tmp->Next == NULL)
list->Last=old;
osFree(tmp);
}
}

View File

@@ -0,0 +1,21 @@
#ifndef SHARED_JBLIST_H
#define SHARED_JBLIST_H
struct jbList
{
struct jbNode *First;
struct jbNode *Last;
};
struct jbNode
{
struct jbNode *Next;
};
void jbAddNode(struct jbList *list, struct jbNode *node);
void jbNewList(struct jbList *list);
void jbFreeList(struct jbList *list);
void jbFreeNum(struct jbList *list,uint32_t num);
void jbFreeNode(struct jbList *list,struct jbNode *node);
#endif

View File

@@ -0,0 +1,78 @@
#include <stdlib.h>
#include <stdint.h>
#include "shared/types.h"
bool jbstrcpy(char *dest,char *src,uint32_t maxlen,uint32_t *jbc)
{
uint32_t d=0;
uint32_t stopchar1,stopchar2;
uint32_t jbcpos;
jbcpos= *jbc;
while(src[jbcpos]==32 || src[jbcpos]==9) jbcpos++;
if(src[jbcpos]=='"')
{
jbcpos++;
stopchar1='"';
stopchar2=0;
}
else
{
stopchar1=' ';
stopchar2=9;
}
while(src[jbcpos]!=stopchar1 && src[jbcpos]!=stopchar2 && src[jbcpos]!=10 && src[jbcpos]!=0)
{
if(src[jbcpos]=='\\' && src[jbcpos+1]!=0 && src[jbcpos+1]!=10)
jbcpos++;
if(d<maxlen-1)
dest[d++]=src[jbcpos];
jbcpos++;
}
dest[d]=0;
if(src[jbcpos]==9 || src[jbcpos]==' ' || src[jbcpos]=='"')
jbcpos++;
*jbc=jbcpos;
if(d!=0 || stopchar1=='"')
return(TRUE);
return(FALSE);
}
bool jbstrcpyrest(char *dest,char *src,uint32_t maxlen,uint32_t *jbc)
{
uint32_t d=0;
uint32_t jbcpos;
jbcpos=*jbc;
while(src[jbcpos]==32 || src[jbcpos]==9)
jbcpos++;
while(src[jbcpos]!=10 && src[jbcpos]!=0)
{
if(d<maxlen-1)
dest[d++]=src[jbcpos];
jbcpos++;
}
dest[d]=0;
*jbc=jbcpos;
if(d!=0)
return(TRUE);
return(FALSE);
}

View File

@@ -0,0 +1,7 @@
#ifndef SHARED_JBSTRCPY_H
#define SHARED_JBSTRCPY_H
bool jbstrcpy(char *dest,char *src,uint32_t maxlen,uint32_t *jbc);
bool jbstrcpyrest(char *dest,char *src,uint32_t maxlen,uint32_t *jbc);
#endif

View File

@@ -0,0 +1,12 @@
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "shared/types.h"
void mystrncpy(char *dest,char *src,uint32_t len)
{
strncpy(dest,src,(size_t)len-1);
dest[len-1]=0;
}

View File

@@ -0,0 +1,8 @@
#ifndef SHARED_MYSTRNCPY_H
#define SHARED_MYSTRNCPY_H
#include "shared/types.h"
void mystrncpy(char *dest,char *src,uint32_t len);
#endif

View File

@@ -0,0 +1,100 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <oslib/os.h>
#include "shared/parseargs.h"
bool parseargs(struct argument *arg,int argc, char **argv)
{
int i,j;
for(i=1;i<argc;i++)
{
for(j=0;arg[j].type;j++)
if(arg[j].name && stricmp(argv[i],arg[j].name)==0) break;
if(arg[j].type)
{
/* Matches a keyword */
if(arg[j].type == ARGTYPE_STRING)
{
if(i+1 < argc)
{
/* Has argument */
arg[j].data=(void *)argv[i+1];
i++;
}
else
{
/* Argument missing */
printf("No argument for %s\n",arg[j].name);
return(FALSE);
}
}
else if(arg[j].type == ARGTYPE_BOOL)
{
arg[j].data=(void *)TRUE;
}
}
else
{
/* Fill in first empty field */
for(j=0;arg[j].type;j++)
if((!arg[j].name || arg[j].flags & ARGFLAG_AUTO) && !arg[j].data) break;
if(!arg[j].type)
{
printf("Unknown keyword %s\n",argv[i]);
return(FALSE);
}
arg[j].data=(void *)argv[i];
}
}
for(j=0;arg[j].type;j++)
if((arg[j].flags & ARGFLAG_MANDATORY) && !arg[j].data)
{
printf("Mandatory argument %s not specified\n",arg[j].name);
return(FALSE);
}
return(TRUE);
}
void printargs(struct argument *arg)
{
int j;
char buf1[50],buf2[50];
printf("\nAvailable arguments:\n\n");
for(j=0;arg[j].type;j++)
if(arg[j].name)
{
if(arg[j].flags & ARGFLAG_AUTO) sprintf(buf1,"(%s)",arg[j].name);
else strcpy(buf1,arg[j].name);
buf2[0]=0;
if(arg[j].flags & ARGFLAG_MANDATORY) strcpy(buf2," [Mandatory]");
switch(arg[j].type)
{
case ARGTYPE_STRING:
printf("%s <string>%s\n",buf1,buf2);
break;
case ARGTYPE_BOOL:
printf("%s\n",arg[j].name);
break;
}
}
printf("\n");
printf("[Mandatory] means that the argument has to be specified. Parentheses around\n");
printf("the keyword mean that the keyword itself does not have to be specified.\n\n");
}

View File

@@ -0,0 +1,24 @@
#ifndef SHARED_PARSEARGS_H
#define SHARED_PARSEARGS_H
#include "shared/types.h"
#define ARGTYPE_END 0
#define ARGTYPE_STRING 1
#define ARGTYPE_BOOL 2
#define ARGFLAG_AUTO 1 /* Keyword does not have to be specified */
#define ARGFLAG_MANDATORY 2 /* Argument cannot be left out */
struct argument
{
uint16_t type;
char *name;
uint16_t flags;
void *data;
};
bool parseargs(struct argument *arg,int argc, char **argv);
void printargs(struct argument *arg);
#endif

View File

@@ -0,0 +1,57 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <shared/types.h>
#include <shared/mystrncpy.h>
#include <oslib/os.h>
void MakeFullPath(char *path,char *file,char *dest,uint32_t destsize)
{
int d;
char *chr;
chr=OS_PATH_CHARS;
mystrncpy(dest,path,destsize);
d=strlen(dest);
if(d != 0)
{
if(!strchr(chr,dest[d-1]))
if(d+1 < destsize)
{
dest[d++]=(char)chr[0];
dest[d]=0;
}
}
if(destsize-d-1 > 0)
mystrncpy(&dest[d],file,destsize-d-1);
}
char *GetFilePart(char *str)
{
int d;
char *chr,*ret;
chr=OS_PATH_CHARS;
ret=str;
for(d=0;str[d];d++)
if(strchr(chr,str[d])) ret = &str[d+1];
return(ret);
}

View File

@@ -0,0 +1,5 @@
void MakeFullPath(char *path,char *file,char *dest,uint32_t destsize);
char *GetFilePart(char *str);

View File

@@ -0,0 +1,21 @@
struct StoredMsg
{
char From[36];
char To[36];
char Subject[72];
char DateTime[20];
UINT16 TimesRead;
UINT16 DestNode;
UINT16 OrigNode;
UINT16 Cost;
UINT16 OrigNet;
UINT16 DestNet;
UINT16 DestZone;
UINT16 OrigZone;
UINT16 DestPoint;
UINT16 OrigPoint;
UINT16 ReplyTo;
UINT16 Attr;
UINT16 NextReply;
/* Text */
};

View File

@@ -0,0 +1,11 @@
#ifndef SHARED_TYPES_H
#define SHARED_TYPES_H
#ifndef NO_TYPEDEF_BOOL
typedef int bool;
#endif
#define FALSE 0
#define TRUE 1
#endif