Add magimail (crashmail2 fork) to repo
This commit is contained in:
423
utils/magimail/src/shared/expr.c
Normal file
423
utils/magimail/src/shared/expr.c
Normal 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);
|
||||
}
|
||||
}
|
||||
|
11
utils/magimail/src/shared/expr.h
Normal file
11
utils/magimail/src/shared/expr.h
Normal 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);
|
||||
|
92
utils/magimail/src/shared/fidonet.h
Normal file
92
utils/magimail/src/shared/fidonet.h
Normal 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
|
96
utils/magimail/src/shared/jblist.c
Normal file
96
utils/magimail/src/shared/jblist.c
Normal 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);
|
||||
}
|
||||
}
|
21
utils/magimail/src/shared/jblist.h
Normal file
21
utils/magimail/src/shared/jblist.h
Normal 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
|
78
utils/magimail/src/shared/jbstrcpy.c
Normal file
78
utils/magimail/src/shared/jbstrcpy.c
Normal 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);
|
||||
}
|
||||
|
7
utils/magimail/src/shared/jbstrcpy.h
Normal file
7
utils/magimail/src/shared/jbstrcpy.h
Normal 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
|
12
utils/magimail/src/shared/mystrncpy.c
Normal file
12
utils/magimail/src/shared/mystrncpy.c
Normal 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;
|
||||
}
|
||||
|
8
utils/magimail/src/shared/mystrncpy.h
Normal file
8
utils/magimail/src/shared/mystrncpy.h
Normal 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
|
100
utils/magimail/src/shared/parseargs.c
Normal file
100
utils/magimail/src/shared/parseargs.c
Normal 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");
|
||||
}
|
||||
|
24
utils/magimail/src/shared/parseargs.h
Normal file
24
utils/magimail/src/shared/parseargs.h
Normal 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
|
57
utils/magimail/src/shared/path.c
Normal file
57
utils/magimail/src/shared/path.c
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
5
utils/magimail/src/shared/path.h
Normal file
5
utils/magimail/src/shared/path.h
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
void MakeFullPath(char *path,char *file,char *dest,uint32_t destsize);
|
||||
char *GetFilePart(char *str);
|
||||
|
||||
|
21
utils/magimail/src/shared/storedmsg.h
Normal file
21
utils/magimail/src/shared/storedmsg.h
Normal 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 */
|
||||
};
|
11
utils/magimail/src/shared/types.h
Normal file
11
utils/magimail/src/shared/types.h
Normal 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
|
Reference in New Issue
Block a user