/* add message to box, in increasing numerical order */ int mesgadd(Message *mbox, char *dir, Dir *d, char *digest) { Message *m; char *name; int loaded; m = emalloc(sizeof(Message)); m->name = estrstrdup(d->name, "/"); m->next = nil; m->prev = mbox->tail; m->level= mbox->level+1; m->recursed = 0; name = estrstrdup(dir, m->name); loaded = loadinfo(m, name); free(name); /* if two upas/fs are running, we can get misled, so check digest before accepting message */ if(loaded==0 || (digest!=nil && m->digest!=nil && strcmp(digest, m->digest)!=0)){ mesgfreeparts(m); free(m); return 0; } if(mbox->tail != nil) mbox->tail->next = m; mbox->tail = m; if(mbox->head == nil) mbox->head = m; if (m->level != 1){ m->recursed = 1; readmbox(m, dir, m->name); } return 1; }
void runzzt(char* path, char* world) { #ifndef DOSBOX /* The DOS/WINDOWS way */ stringvector actions, files; stringvector info; zlaunchinfo zli; /* Initialize the vectors */ initstringvector(&actions); initstringvector(&files); /* Add the world as the first option */ pushstring(&files, str_dup(world)); pushstring(&actions, str_dup("play")); info = loadinfo(path, world); zli = loadzlinfofromsvector(info); zli.datadir = str_dup(path); zli.bindir = str_dup(path); zli.paramlist = files; stringvectorcat(&(zli.actionstoperform), &actions); zlaunchact(&zli); /* Cleanup */ zlaunchcleanup(&zli); deletezlinfo(&zli); deletestringvector(&info); /* DO NOT delete actions and files. deletezlinfo() did this already */ #else /* The LINUX way. Really, Windows could be using this too. */ char cwd[PATH_MAX]; /* ZZT world is always in current dir */ getcwd(cwd, PATH_MAX); /* And run DOSBox */ dosbox_launch(DATAPATH, cwd, world); #endif /* DOSBOX */ }