home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d547
/
powersource.lha
/
PowerSource
/
source.lzh
/
source
/
genmenus.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-15
|
14KB
|
432 lines
/*----------------------------------------------------------------------*
GenMenus.c version 3.0 - © Copyright 1991 Jaba Development
Author : Jan van den Baard
Purpose: Generating the menu source code.
*----------------------------------------------------------------------*/
extern struct ge_prefs prefs;
extern struct MyMenu *MenuStrip;
extern struct MyMenuItem dummy;
extern UWORD SubCount, ItemCount;
extern UBYTE MenuLabel[32];
extern UBYTE ItemLabel[32];
extern UBYTE SubLabel[32];
#define STAT (prefs.static_structures)
#define NOFLAGS (prefs.no_flags)
void WriteCIText( BPTR file, struct IntuiText *itext )
{
WriteFormat(file," %ld,%ld,",itext->FrontPen,itext->BackPen);
WriteDrMd(file,itext->DrawMode,FALSE);
WriteFormat(file,",%ld,%ld,NULL,(UBYTE *)\"%s\",NULL,\n",itext->LeftEdge,itext->TopEdge,itext->IText);
}
void WriteAsmIText( BPTR file, struct IntuiText *itext, UWORD inum, BOOL sub )
{
if(sub)
WriteFormat(file,"%sText%ld:\n",&SubLabel[0],inum);
else
WriteFormat(file,"%sText%ld:\n",&ItemLabel[0],inum);
WriteFormat(file," DC.B %ld,%ld,",itext->FrontPen,itext->BackPen);
if(NOFLAGS)
WriteFormat(file,"$%0.20lx,0\n",itext->DrawMode);
else {
WriteDrMd(file,itext->DrawMode,TRUE);
WriteFormat(file,",0\n");
}
WriteFormat(file," DC.W %ld,%ld\n DC.L 0\n",itext->LeftEdge,itext->TopEdge,itext->IText);
if(sub)
WriteFormat(file," DC.L %sIText%ld,0\n\n",&SubLabel[0],inum);
else
WriteFormat(file," DC.L %sIText%ld,0\n\n",&ItemLabel[0],inum);
if(sub)
WriteFormat(file,"%sIText%ld:\n",&SubLabel[0],inum);
else
WriteFormat(file,"%sIText%ld:\n",&ItemLabel[0],inum);
WriteFormat(file," DC.B '%s',0\n",itext->IText);
WriteFormat(file," CNOP 0,2\n\n");
}
ULONG INum( struct MyMenu *menu )
{
struct MyMenu *tmp;
struct MyMenuItem *it;
ULONG inum = 0L;
for(tmp = MenuStrip; tmp != menu; tmp = tmp->NextMenu) {
for(it = tmp->FirstItem; it; it = it->NextItem)
if(it != &dummy)
inum++;
}
return(inum);
}
ULONG SNum( struct MyMenuItem *sub )
{
struct MyMenu *tmp;
struct MyMenuItem *it, *sb;
ULONG snum = 0L;
for(tmp = MenuStrip; tmp; tmp = tmp->NextMenu) {
for(it = tmp->FirstItem; it; it = it->NextItem) {
if(it->SubItem) {
for(sb = it->SubItem; sb; sb = sb->NextItem) {
if(sb == sub) goto gotIt;
snum++;
}
}
}
}
gotIt:
return(snum);
}
void WriteCItem( BPTR file, struct MyMenuItem *item, UWORD tnum , BOOL sub)
{
struct MyMenuItem *tmp;
ULONG flags;
tmp = item;
flags = (ULONG)tmp->Flags;
if(sub) {
if(tmp->NextItem)
WriteFormat(file," &%s[%ld],",&SubLabel[0],tnum+1);
else
WriteFormat(file," NULL,");
} else {
if(tmp->NextItem)
WriteFormat(file," &%s[%ld],",&ItemLabel[0],tnum+1);
else
WriteFormat(file," NULL,");
}
WriteFormat(file,"%ld,%ld,%ld,%ld,",tmp->LeftEdge,tmp->TopEdge,tmp->Width,tmp->Height);
if(TestBits(flags,ITEMENABLED))
WriteFormat(file,"ITEMENABLED+");
if(TestBits(flags,HIGHNONE))
WriteFormat(file,"HIGHNONE+");
else if(TestBits(flags,HIGHCOMP))
WriteFormat(file,"HIGHCOMP+");
else
WriteFormat(file,"HIGHBOX+");
if(TestBits(flags,CHECKIT))
WriteFormat(file,"CHECKIT+");
if(TestBits(flags,ITEMTEXT))
WriteFormat(file,"ITEMTEXT+");
if(TestBits(flags,COMMSEQ))
WriteFormat(file,"COMMSEQ+");
if(TestBits(flags,MENUTOGGLE))
WriteFormat(file,"MENUTOGGLE+");
if(TestBits(flags,CHECKED))
WriteFormat(file,"CHECKED+");
Seek(file,-1L,OFFSET_CURRENT);
WriteFormat(file,",");
WriteFormat(file,"%ld,",tmp->MutualExclude);
if(sub)
WriteFormat(file,"(APTR)&%sText[%ld],",&SubLabel[0],tnum);
else
WriteFormat(file,"(APTR)&%sText[%ld],",&ItemLabel[0],tnum);
if(TestBits(flags,COMMSEQ))
WriteFormat(file,"NULL,%ld,",tmp->Command);
else
WriteFormat(file,"NULL,0,");
if(NOT sub AND item->SubItem)
WriteFormat(file,"&%s[%ld],0,\n",&SubLabel[0],SNum(item->SubItem));
else
WriteFormat(file,"NULL,0,\n");
}
void WriteAsmItem( BPTR file, struct MyMenuItem *item, UWORD tnum , BOOL sub)
{
struct MyMenuItem *tmp;
ULONG flags;
tmp = item;
flags = (ULONG)tmp->Flags;
if(sub) {
WriteFormat(file,"%s%ld:\n",&SubLabel[0],tnum);
if(tmp->NextItem)
WriteFormat(file," DC.L %s%ld\n",&SubLabel[0],tnum+1);
else
WriteFormat(file," DC.L 0\n");
} else {
WriteFormat(file,"%s%ld:\n",&ItemLabel[0],tnum);
if(tmp->NextItem)
WriteFormat(file," DC.L %s%ld\n",&ItemLabel[0],tnum+1);
else
WriteFormat(file," DC.L 0\n");
}
WriteFormat(file," DC.W %ld,%ld,%ld,%ld\n",tmp->LeftEdge,tmp->TopEdge,tmp->Width,tmp->Height);
WriteFormat(file," DC.W ");
if(NOFLAGS) {
if(TestBits((ULONG)item->SpecialFlags,ITEMENABLED))
WriteFormat(file,"$%0.4lx\n",item->Flags+ITEMENABLED);
else
WriteFormat(file,"$%0.4lx\n",item->Flags);
} else {
if(TestBits(flags,ITEMENABLED))
WriteFormat(file,"ITEMENABLED+");
if(TestBits(flags,HIGHNONE))
WriteFormat(file,"HIGHNONE+");
else if(TestBits(flags,HIGHCOMP))
WriteFormat(file,"HIGHCOMP+");
else
WriteFormat(file,"HIGHBOX+");
if(TestBits(flags,CHECKIT))
WriteFormat(file,"CHECKIT+");
if(TestBits(flags,ITEMTEXT))
WriteFormat(file,"ITEMTEXT+");
if(TestBits(flags,COMMSEQ))
WriteFormat(file,"COMMSEQ+");
if(TestBits(flags,MENUTOGGLE))
WriteFormat(file,"MENUTOGGLE+");
if(TestBits(flags,CHECKED))
WriteFormat(file,"CHECKED+");
Seek(file,-1L,OFFSET_CURRENT);
WriteFormat(file,"\n");
}
WriteFormat(file," DC.L %ld\n",tmp->MutualExclude);
if(sub)
WriteFormat(file," DC.L %sText%ld,0\n",&SubLabel[0],tnum);
else
WriteFormat(file," DC.L %sText%ld,0\n",&ItemLabel[0],tnum);
if(TestBits(flags,COMMSEQ))
WriteFormat(file," DC.B %ld,0\n",tmp->Command);
else
WriteFormat(file," DC.B 0,0\n");
if(NOT sub AND item->SubItem)
WriteFormat(file," DC.L %s%ld\n DC.W 0\n\n",&SubLabel[0],SNum((struct MyMenuItem *)item->SubItem));
else
WriteFormat(file," DC.L 0\n DC.W 0\n\n");
}
BOOL WriteCMenus( BPTR file )
{
register struct MyMenu *menu;
register struct MyMenuItem *item, *sub;
register struct IntuiText *itext;
register UWORD inum, snum, mnum;
if(SubCount) {
if(STAT)
WriteFormat(file,"static ");
WriteFormat(file,"struct IntuiText %sText[] = {\n",&SubLabel[0]);
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
for(item = menu->FirstItem; item; item = item->NextItem) {
if((sub = item->SubItem)) {
while(1) {
WriteCIText(file,(struct IntuiText *)sub->ItemFill);
if(NOT(sub = sub->NextItem))
break;
}
}
}
}
Seek(file,-2L,OFFSET_CURRENT);
WriteFormat(file," };\n\n");
}
if(ItemCount) {
if(STAT)
WriteFormat(file,"static ");
WriteFormat(file,"struct IntuiText %sText[] = {\n",&ItemLabel[0]);
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
if((item = menu->FirstItem)) {
while(1) {
if(item == &dummy) break;
WriteCIText(file,(struct IntuiText *)item->ItemFill);
if(NOT(item = item->NextItem))
break;
}
}
}
Seek(file,-2L,OFFSET_CURRENT);
WriteFormat(file," };\n\n");
}
snum = NULL;
if(SubCount) {
if(STAT)
WriteFormat(file,"static ");
WriteFormat(file,"struct MenuItem %s[] = {\n",&SubLabel[0]);
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
for(item = menu->FirstItem; item; item = item->NextItem) {
if((sub = item->SubItem)) {
while(1) {
WriteCItem(file,sub,snum++,TRUE);
if(NOT(sub = sub->NextItem))
break;
}
}
}
}
Seek(file,-2L,OFFSET_CURRENT);
WriteFormat(file," };\n\n");
}
inum = NULL;
if(ItemCount) {
if(STAT)
WriteFormat(file,"static ");
WriteFormat(file,"struct MenuItem %s[] = {\n",&ItemLabel[0]);
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
if((item = menu->FirstItem)) {
while(1) {
if(item == &dummy) break;
WriteCItem(file,item,inum++,FALSE);
if(NOT(item = item->NextItem))
break;
}
}
}
Seek(file,-2L,OFFSET_CURRENT);
WriteFormat(file," };\n\n");
}
mnum = 1;
if(STAT)
WriteFormat(file,"static ");
WriteFormat(file,"struct Menu %s[] = {\n",&MenuLabel[0]);
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
if(menu->NextMenu)
WriteFormat(file," &%s[%ld],",&MenuLabel[0],mnum++);
else
WriteFormat(file," NULL,");
WriteFormat(file,"%ld,%ld,%ld,%ld,",menu->LeftEdge,menu->TopEdge,menu->Width,menu->Height);
if(TestBits((ULONG)menu->Flags,MENUENABLED))
WriteFormat(file,"MENUENABLED,");
else
WriteFormat(file,"0,");
WriteFormat(file,"(BYTE *)\"%s\",",menu->MenuName);
if(menu->FirstItem != &dummy)
WriteFormat(file,"&%s[%ld],0,0,0,0,\n",&ItemLabel[0],INum(menu));
else
WriteFormat(file,"NULL,0,0,0,0,\n");
}
Seek(file,-2L,OFFSET_CURRENT);
WriteFormat(file," };\n\n");
}
BOOL WriteAsmMenus( BPTR file )
{
register struct MyMenu *menu;
register struct MyMenuItem *item, *sub;
register struct IntuiText *itext;
register UWORD inum, snum, mnum;
inum = 0;
if(SubCount) {
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
for(item = menu->FirstItem; item; item = item->NextItem) {
if((sub = item->SubItem)) {
while(1) {
WriteAsmIText(file,(struct IntuiText *)sub->ItemFill,inum++,TRUE);
if(NOT(sub = sub->NextItem))
break;
}
}
}
}
}
inum = 0;
if(ItemCount) {
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
if((item = menu->FirstItem)) {
while(1) {
if(item == &dummy) break;
WriteAsmIText(file,(struct IntuiText *)item->ItemFill,inum++,FALSE);
if(NOT(item = item->NextItem))
break;
}
}
}
}
snum = NULL;
if(SubCount) {
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
for(item = menu->FirstItem; item; item = item->NextItem) {
if((sub = item->SubItem)) {
while(1) {
WriteAsmItem(file,sub,snum++,TRUE);
if(NOT(sub = sub->NextItem))
break;
}
}
}
}
}
inum = NULL;
if(ItemCount) {
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
if((item = menu->FirstItem)) {
while(1) {
if(item == &dummy) break;
WriteAsmItem(file,item,inum++,FALSE);
if(NOT(item = item->NextItem))
break;
}
}
}
}
mnum = 0;
for(menu = MenuStrip; menu; menu = menu->NextMenu) {
WriteFormat(file,"%s%ld:\n",&MenuLabel[0],mnum);
if(menu->NextMenu)
WriteFormat(file," DC.L %s%ld\n",&MenuLabel[0],mnum+1);
else
WriteFormat(file," DC.L 0\n");
WriteFormat(file," DC.W %ld,%ld,%ld,%ld\n",menu->LeftEdge,menu->TopEdge,menu->Width,menu->Height);
if(NOFLAGS) {
if(TestBits((ULONG)menu->Flags,MENUENABLED))
WriteFormat(file," DC.W $0001\n");
else
WriteFormat(file," DC.W $0000\n");
} else {
if(TestBits((ULONG)menu->Flags,MENUENABLED))
WriteFormat(file," DC.W MENUENABLED\n");
else
WriteFormat(file," DC.W 0\n");
}
WriteFormat(file," DC.L MenuName%ld\n",mnum);
if(menu->FirstItem != &dummy)
WriteFormat(file," DC.L %s%ld\n DC.W 0,0,0,0\n\n",&ItemLabel[0],INum(menu));
else
WriteFormat(file," DC.L 0\n DC.W 0,0,0,0\n\n");
WriteFormat(file,"MenuName%ld:\n DC.B '%s',0\n",mnum++,menu->MenuName);
WriteFormat(file," CNOP 0,2\n\n");
}
}