StoneAge/saac/wk/tools.c
2018-08-07 00:51:35 -07:00

297 lines
5.3 KiB
C

#include "error.h"
#include "tools.h"
#include "version.h"
#define BUF_SIZE 4096
//#define P(A) { printf("%d\n",A); }
char Xtoken; // Original leading charactor of strxtok
char Ytoken; // Original tail charactor of strxtok
int bakayaro(char *name)
{
int i,sum;
if (!name) return 0;
for (i=0,sum=0;name[i];i++) sum+=name[i]*(i+1);
// error3("Aho:%s%d\n","",sum);
return sum;
}
char *iptoa(unsigned long ip)
{
static char buffer[80];
unsigned char *p;
p=(unsigned char *)&ip;
sprintf(buffer,"%u.%u.%u.%u",p[0],p[1],p[2],p[3]);
return(buffer);
}
char *strxcpy(char *src)
{
static char dst[BUF_SIZE];
int i;
if (src) {
for (i=0;i<=strlen(src);i++)
dst[i]=(src[i]=='\n')?'\t':src[i];
return(dst);
} else {
return(0);
}
}
//
char *strxtok(char *src,int _limit)
{
static char buf[BUF_SIZE];
static char *ptr;
static int i,j,limit;
if (src) {
limit=_limit<BUF_SIZE?_limit:BUF_SIZE-1;
memcpy(buf,src,limit);
buf[limit]=0; i=0; j=0;
}
Xtoken=0; Ytoken=0;
if (i<limit) ptr=&buf[j]; else return(0);
Xtoken=buf[i];
while (i<limit) {
// '\'
if (buf[i]=='\\') {
// '\\' => '\' or '\;' => ';' or '\&' => '&'
if (buf[i+1]=='\\' || buf[i+1]==';' || buf[i+1]=='&') {
i++; buf[j++]=buf[i++];
}
// '\' -> Ignore '\'
else { i++; }
} else if (buf[i]==';') { // Bug from AP
i++; buf[j++]=0;
Ytoken=';';
return(ptr);
} else {
buf[j++]=buf[i++];
}
}
buf[j]=0;
Ytoken=0;
return(ptr);
}
// Add up \ for \, ; and &
char *xchange(char *src)
{
static char buffer[BUF_SIZE];
int i,j,limit;
if (!src) return(0);
limit=strlen(src);
if (limit>=BUF_SIZE/2) limit=BUF_SIZE/2-1;
for (j=0,i=0;i<limit;i++) {
if ((src[i]=='\\') || (src[i]==';') || (src[i]=='&'))
buffer[j++]='\\';
buffer[j++]=src[i];
}
buffer[j]=0;
return(buffer);
}
/*main()
{
char buffer[BUF_SIZE];
char *ptr;
int i,len;
sprintf(buffer,"%s;%s;\n",xprintf("123\\456"),xprintf("789;1000"));
printf("%s",buffer);
}*/
void stockInit(Stock_Struct *s)
{
s->head=s->tail=0;
s->count=0;
}
void stockAdd(Stock_Struct *s,char *data)
{
Stock *new;
if (!s) return;
if (!data) data="";
// Make new stock
new=(Stock *)calloc(1,sizeof(Stock));
new->data=strcpy((char *)calloc( 1,strlen(data)+1),data);
new->flag=0;
// Link new stock
if (!s->head) { // First Item, add to tail
s->head=s->tail=new;
} else { // Add to tail
s->tail->link=new;
s->tail=new;
}
s->count++;
}
char *stockOut(Stock_Struct *s)
{
static char buf[BUF_SIZE];
Stock *t;
if (!s || !s->head) return(0);
t=s->head;
s->head=t->link;
strcpy(buf,t->data);
free(t->data);
free(t);
s->count--;
if (!s->head) s->tail=0;
return(buf);
}
void stockDel(Stock_Struct *s,int count)
{
Stock *t;
if (!s || !s->head) return;
while ((t=s->head) && count) {
s->head=t->link;
free(t->data);
free(t);
count--;
s->count--;
}
if (!s->head) s->tail=0;
}
int stockCount(Stock_Struct *s)
{
return(s->count);
}
void stockClear(Stock_Struct *s)
{
Stock *t,*u;
if (!s) return;
u=s->head;
while (t=u) {
u=u->link;
free(t->data);
free(t);
}
s->head=0; s->tail=0;
s->count=0;
}
void stockStore(Stock_Struct *s,char *buf,int limit)
{
char *ptr;
// show(s);
if (!s || !buf) return;
ptr=strxtok(buf,limit);
// if (ptr && s->tail) P(s->tail->flag);
if (ptr && s->tail &&
(s->tail->flag&STOCK_NONTERM)) { // Last message is non-terminated
strcat((char *)realloc(s->tail->data,
strlen(s->tail->data)+strlen(ptr)+1),ptr);
if (Ytoken==';') { s->tail->flag^=STOCK_NONTERM; s->count++; }
ptr=strxtok(0,0);
}
while (ptr) {
stockAdd(s,ptr);
if (Xtoken=='&') s->tail->flag|=STOCK_START; // The start
if (Ytoken!=';') { // Non-terminated
s->tail->flag|=STOCK_NONTERM;
s->count--; // This is not a valid item
}
ptr=strxtok(0,0);
}
}
void rankAdd(Stock_Struct *ss,int rank,Rank_Struct *rs)
{
int i;
if (!ss) { error("rankAdd(): Null Stock?\n"); return; }
if (!rs) { error("rankAdd(): Null Storage?\n"); return; }
if (rank<=0) {error("rankAdd(): Invalid rank\n"); return; }
for (i=0;i<10;i++) { rs->entry[i].name[0]=0; rs->entry[i].score=0; }
rs->rank=rank;
for (i=0;(i<10)&&(ss->head);i++) {
strcpy(rs->entry[i].name,stockOut(ss));
if (ss->head) rs->entry[i].score=atoi(stockOut(ss));
else rs->entry[i].score=0;
}
}
int rankSelect(int rank)
{
return(((rank-1)/10)*10+1);
}
int charXCount(char *buf)
{
int i,count;
if (!buf) { error("charCount(): Null buffer?\n"); return(0); }
i=0; count=0;
while (buf[i]) {
if (buf[i]=='\\') {
if ((buf[i+1]=='\\') || (buf[i+1]=='&') ||
(buf[i+1]==';')) {
i++;
}
} else if (buf[i]==';') count++;
i++;
}
return(count);
}
// Construct the 8-byte formatted string
char *construct(char *src)
{
static char dst[BUF_SIZE];
const char *AND="&&&&&&&&";
int n;
if (!src) { dst[0]=0; return(dst); }
else {
sprintf(dst,"&;%d;%s",charXCount(src)+1,src);
n=strlen(dst)%8;
if (!n) return(dst);
strcat(dst,AND+n);
}
return(dst);
}
void show(Stock_Struct *s)
{
Stock *trace;
if (!s) return;
for (trace=s->head;trace;trace=trace->link)
error3("<%s:%d>",trace->data,trace->flag);
error("\n");
}
/*main()
{
Stock_Struct s;
char buf[100];
char buf1[4096];
int i;
stockInit(&s);
while (1) {
gets(buf);
// for (i=0;buf[i];i++) printf("(%c)",buf[i]);
// stockStore(&s,buf,strlen(buf));
printf("%s\n",construct(buf));
// show(&s);
}
}*/