#define PUBZERO ( MEMF_PUBLIC | MEMF_CLEAR )
#define MYALLOC(T) ( (T *) (AllocRemember(&remkey, sizeof(T), PUBZERO)) )

#define MAXMI 80
#define MAXIT MAXMI
#define MAXMN 12

struct MenuItem  miarr[MAXMI];
struct IntuiText itarr[MAXIT];
struct Menu	 mnarr[MAXMN];

int mictr=0;
int itctr=0;
int mnctr=0;

int menupos=0, itempos=0;
struct MenuItem **lastmiptr=NULL;
struct Menu **lastmenuptr=NULL;
struct Menu *firstmenu=NULL;

struct Menu *newmenu(char *);
struct MenuItem *newitem(char *);

struct Menu *newmenu(s)
char *s;
{
struct Menu *mn;

mn=&(mnarr[mnctr++]);
check (mnctr<MAXMN, "Too many Menu");

mn->NextMenu	=NULL;
mn->LeftEdge	=menupos;
mn->TopEdge	=0;
mn->Width	=strlen(s)*10;
mn->Height	=0;
mn->Flags	=MENUENABLED;
mn->MenuName	=s;
mn->FirstItem	=NULL;

menupos += (mn->Width+20);

itempos=0;

if (lastmenuptr) (*lastmenuptr)=mn;
lastmenuptr=(&mn->NextMenu);

lastmiptr=(&mn->FirstItem);

if (firstmenu==NULL) firstmenu=mn;

return mn;
}

struct MenuItem *mi;

struct MenuItem *newitem(s)
char *s;
{
struct IntuiText *it;

mi=&(miarr[mictr++]);
check (mictr<MAXMI, "Too many MenuItem");

it=&(itarr[itctr++]);
check (itctr<MAXIT, "Too many IntuiText");

mi->NextItem	=NULL;
mi->LeftEdge	=0;
mi->TopEdge	=itempos;
mi->Width	=strlen(s)*10;
mi->Height	=9;
mi->Flags	=(ITEMTEXT | ITEMENABLED | HIGHCOMP);
mi->MutualExclude=NULL;
mi->ItemFill	=(APTR)it;

itempos+=9;

it->FrontPen	=0;
it->BackPen	=1;
it->DrawMode	=JAM2;
it->LeftEdge	=0;
it->TopEdge	=0;
it->ITextFont	=NULL;
it->IText	=s;
it->NextText	=NULL;

if (lastmiptr) *lastmiptr=mi;
lastmiptr=(&mi->NextItem);

return mi;
}

void setcommand(c)
char c;
{
mi->Flags |=COMMSEQ;
mi->Width += COMMWIDTH;
mi->Command=c;
}

struct Window *activew()
{
extern struct IntuitionBase *IntuitionBase;
return IntuitionBase->ActiveWindow;
}
