Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6445 → Rev 6446

/programs/develop/cmm/debug.cpp
0,0 → 1,1410
#include "tok.h"
 
 
 
#define _DEBUG_
 
 
 
#define MAXDBGS 1000
 
#define MAXNUMSYM 500
 
#define MAXLSTSTR 128 //ìàêñèìàëüíûé ðàçìåð ñòðîêè ëèñòèíãà
 
 
 
void AddNameToTable(char *name);
 
void AddSymbolList(struct idrec *ptr);
 
int CreateDosDebug();
 
int CreateW32Debug();
 
void GeneratLst();
 
 
 
unsigned int *dbgloc=NULL; //àäðåññ òî÷êè
 
unsigned int *dbgnum; //íîìåð ñòðîêè
 
unsigned short *dbgmod; //íîìåð ôàéëà
 
char **lststring; //ñòðîêè èñõîäíîãî òåêñòà
 
unsigned char *lstflag=NULL; //ôëàãè óïðàâëåíèÿ ëèñòèíãîì
 
unsigned int *lstend;
 
 
 
unsigned int pdbg=0; /* number of post entrys */
 
unsigned int pdbgmax=MAXDBGS; /* max number of post entrys */
 
static unsigned int oline=0,omodule=0xFFFFFFFF;
 
unsigned int ooutptr=0xffffffff;
 
char lsttypedata=0; //òèï äàííûõ äëÿ ëèñòèíãà, ïî óìîë÷àíèþ êîä
 
unsigned int outputcodestart=0;
 
 
 
struct D16START{
 
unsigned long sign; //0 Signify & Version
 
unsigned long pol_size; //4 Name Pool Size (in bytes)
 
unsigned long numname; //8 Number of Names
 
unsigned long numtentr; //12 Number of Type Entries
 
unsigned long nummentr; //16 Number of Member Entries
 
unsigned long numsymbl; //20 Number of Symbols
 
unsigned long numgsymb; //24 Number of Global Symbols
 
unsigned long numsours; //28 Number of Source Modules
 
unsigned long numlsumb; //32 Number of Local Symbols
 
unsigned long numscop; //36 Number of Scopes
 
unsigned long numline; //40 Number of Line Number Entries
 
unsigned long numincl; //44 Number of Include Files
 
unsigned long numseg; //48 Number of Segments
 
unsigned long numcorrel; //52 Number of Correlation Entries
 
unsigned long imagesize; //56 Image Size
 
unsigned short data[2]; //60 Basic RTL String Segment Offset & Data Count
 
unsigned long casesensiv;//64 Case Sensivitive Link
 
unsigned long ucnovn;
 
//òîëüêî äëÿ 128-áàéòîâîãî çàãîëîâêà
 
unsigned long ucnovn1[6];
 
unsigned long sizeblock; //ðàçìåð ìåæäó íà÷àëîì èìåí è êîíöîì çàãîëîâêà
 
unsigned long ucnovn2[2];
 
unsigned short fdebug; //Debug Flags
 
unsigned long reftsize; //Reference Information Table Size (in bytes)
 
unsigned long numnamesp; //Number of Namespace Entries
 
unsigned long numunamesp; //Number of Namespace Using Entries
 
unsigned long ucnovn3;
 
unsigned short ucnovn4;
 
////////////////////////////////
 
};
 
 
 
struct MODULE{
 
unsigned long name;
 
unsigned char language;
 
unsigned char memmodel;
 
unsigned long symindex;
 
unsigned short symcount;
 
unsigned short sourindex;
 
unsigned short sourcount;
 
unsigned short corindex;
 
unsigned short corcount;
 
};
 
 
 
typedef struct _SFT_
 
{
 
unsigned long idx;
 
struct ftime time;
 
}SFT;
 
 
 
typedef struct _LT_
 
{
 
unsigned short line;
 
unsigned short ofs;
 
}LT;
 
 
 
typedef struct _CT_
 
{
 
unsigned short segidx;
 
unsigned short filidx;
 
unsigned long beg;
 
unsigned short count;
 
}CT;
 
 
 
static struct _SMB_
 
{
 
unsigned long idxname;
 
unsigned long type;
 
unsigned short ofs;
 
unsigned short seg;
 
unsigned short clas;
 
}*symbols;
 
 
 
static struct SEGMENT{
 
unsigned short idx;
 
unsigned short segm;
 
unsigned short ofs;
 
unsigned short size;
 
unsigned short scopei;
 
unsigned short scopec;
 
unsigned short correli;
 
unsigned short correlc;
 
}*segment;
 
 
 
unsigned char dbg=FALSE,dbgact;
 
static short numsymbols=0;
 
static int sizetabsym=MAXNUMSYM;
 
static unsigned short numcorrel;
 
static unsigned char *bufname;
 
static int lastofspul=0;
 
static int segcode;
 
 
 
static struct _COR_INFO_
 
{
 
unsigned int ofs; //íà÷àëî áëîêà
 
unsigned int end; //êîíåö áëîêà
 
unsigned int startline; //íîìåð ïåðâîé ñòðîêè èíôîðìàöèè
 
unsigned short count; //÷èñëî ñòðîê
 
unsigned short file; //ôàéë
 
}*corinfo=NULL;
 
 
 
void InitDbg()
 
{
 
if(fobj)dbg&=0xFE;
 
if(dbg&&(dbgloc==NULL)){
 
dbgloc=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
 
dbgnum=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
 
dbgmod=(unsigned short *)MALLOC(MAXDBGS*sizeof(unsigned short));
 
dbgact=1; //çàïðåòèòü ñáîð èíôîðìàöèè
 
}
 
if((dbg&2)&&lstflag==NULL){
 
lststring=(char **)MALLOC(MAXDBGS*sizeof(char *));
 
lstflag=(unsigned char *)MALLOC(MAXDBGS*sizeof(char));
 
lstend=(unsigned int *)MALLOC(MAXDBGS*sizeof(unsigned int));
 
memset((char *)lstflag,-1,MAXDBGS*sizeof(char));
 
memset((unsigned int *)lstend,0,MAXDBGS*sizeof(unsigned int));
 
}
 
}
 
 
 
void AddDataLine(char ssize/*,char typev*/)
 
{
 
/* if(typev==pointer||typev==farpointer)ssize=(typev==pointer?(char)2:(char)4);
 
else*/ //if(tok==tk_string)ssize=(char)3;
 
lsttypedata=(unsigned char)(ssize<<1);
 
AddLine();
 
lsttypedata=0;
 
}
 
 
 
void AddDataNullLine(char ssize,char *name)
 
{
 
oline--;
 
 
 
lsttypedata=(unsigned char)(ssize<<1);
 
AddLine(TRUE);
 
lsttypedata=0;
 
dbgnum[pdbg-1]=0; //î÷èñòèòü íîìåð ñòðîêè
 
//new !!!
 
if(name!=NULL)lststring[pdbg-1]=BackString(name);
 
}
 
 
 
void AddCodeNullLine(char *name)
 
{
 
oline--;
 
AddLine(TRUE);
 
dbgnum[pdbg-1]=0; //î÷èñòèòü íîìåð ñòðîêè
 
if(name!=NULL)lststring[pdbg-1]=BackString(name);
 
oline--;
 
}
 
 
 
void AddEndLine()
 
{
 
if(pdbg/*&&lstend[pdbg-1]==0*/)lstend[pdbg-1]=outptr;
 
}
 
 
 
void AddLine(int SkipLineInfo)
 
{
 
if(/*ooutptr!=outptr&&*/dbgact==0&&(oline!=linenumber||omodule!=currentfileinfo)){
 
while(ooutptr>outptr&&pdbg!=0&&ooutptr!=0xffffffff)KillLastLine();
 
if(pdbg==pdbgmax){
 
pdbgmax+=MAXDBGS;
 
dbgloc=(unsigned int *) REALLOC(dbgloc,pdbgmax*sizeof(unsigned int));
 
dbgnum=(unsigned int *) REALLOC(dbgnum,pdbgmax*sizeof(unsigned int));
 
dbgmod=(unsigned short *)REALLOC(dbgmod,pdbgmax*sizeof(unsigned short));
 
if(lstflag){
 
lststring=(char **)REALLOC(lststring,pdbgmax*sizeof(char *));
 
lstflag=(unsigned char *)REALLOC(lstflag,pdbgmax*sizeof(char));
 
lstend=(unsigned int *)REALLOC(lstend,pdbgmax*sizeof(unsigned int));
 
memset((char *)lstflag+(pdbgmax-MAXDBGS),-1,MAXDBGS*sizeof(char));
 
memset((unsigned int *)lstend+(pdbgmax-MAXDBGS),0,MAXDBGS*sizeof(unsigned int));
 
}
 
}
 
dbgloc[pdbg]=ooutptr=outptr;
 
dbgnum[pdbg]=oline=linenumber;
 
dbgmod[pdbg]=(unsigned short)currentfileinfo;
 
omodule=currentfileinfo;
 
if(dbg&2){
 
if(SkipLineInfo)lststring[pdbg]=NULL;
 
else{
 
char *ofs=startline;
 
char c;
 
int sizestring=0;
 
char buf[MAXLSTSTR];
 
for(;sizestring<(MAXLSTSTR-1);sizestring++){
 
c=*ofs;
 
ofs=ofs+1;
 
if(c==13||ofs==endinput)break;
 
buf[sizestring]=c;
 
}
 
buf[sizestring]=0;
 
strbtrim(buf);
 
if((sizestring=strlen(buf))==0)lststring[pdbg]=NULL;
 
else{
 
lststring[pdbg]=(char *)MALLOC(sizestring+1);
 
strcpy(lststring[pdbg],buf);
 
}
 
}
 
lstflag[pdbg]=(unsigned char)(am32|lsttypedata);
 
AddEndLine();
 
// printf("%s(%d) outptr=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,outptr);
 
}
 
pdbg++;
 
(startfileinfo+currentfileinfo)->numdline++;
 
}
 
}
 
 
 
void KillLastLine()
 
{
 
// printf("dbgact=%d pdbg=%d outptr=%08X ooutptr=%08X\n",dbgact,pdbg,outptr,ooutptr);
 
if(outptr==0&&ooutptr==0x100){
 
ooutptr=0;
 
return;
 
}
 
if(dbgact==0&&pdbg!=0){
 
// printf("pdbg=%d dbgmod=%d currentfileinfo=%d\n",pdbg,dbgmod[0],currentfileinfo);
 
if(pdbg==1&&dbgmod[0]!=(unsigned short)currentfileinfo)return;
 
pdbg--;
 
if(pdbg==0){
 
oline=0;
 
omodule=ooutptr=0xFFFFFFFF;
 
}
 
else{
 
oline=dbgnum[pdbg];
 
omodule=dbgmod[pdbg];
 
ooutptr=dbgloc[pdbg];
 
}
 
// printf("%s(%d) pdbg=%d oline=%d ooutptr=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,pdbg,oline,ooutptr);
 
(startfileinfo+dbgmod[pdbg])->numdline--;
 
}
 
}
 
 
 
//ñîçäàíèå îòëàäî÷íîãî ôàéëà
 
void DoTDS()
 
{
 
int retcode;
 
unsigned int i,j;
 
//ñîçäàòü ôàéë
 
if(lstflag)GeneratLst();
 
if(dbg&1){
 
//óáðàòü èç ñïèñêà ôàéëîâ íå èñïîëüçóåìûå
 
for(i=0;i<totalmodule;i++){
 
if((startfileinfo+i)->numdline==0){
 
totalmodule--;
 
if(totalmodule!=i){
 
memcpy(&(startfileinfo+i)->filename,
 
&(startfileinfo+totalmodule)->filename,sizeof(FILEINFO));
 
//êîððåêòèðîâêà òàáëèö ñòðîê
 
for(j=0;j<pdbg;j++){
 
if(dbgmod[j]==(unsigned short)totalmodule)dbgmod[j]=(unsigned short)i;
 
}
 
i--;
 
}
 
}
 
}
 
//ñîçäàòü òàáëèöó êîððåëÿöèé
 
corinfo=(struct _COR_INFO_ *)MALLOC(sizeof(_COR_INFO_));
 
corinfo->ofs=dbgloc[0];
 
corinfo->startline=0;
 
omodule=corinfo->file=dbgmod[0];
 
numcorrel=0;
 
for(j=1;j<pdbg;j++){
 
if((unsigned short)omodule!=dbgmod[j]){
 
(corinfo+numcorrel)->count=(unsigned short)(j-(corinfo+numcorrel)->startline);
 
(corinfo+numcorrel)->end=dbgloc[j]-1;
 
numcorrel++;
 
corinfo=(struct _COR_INFO_ *)REALLOC(corinfo,sizeof(_COR_INFO_)*(numcorrel+1));
 
(corinfo+numcorrel)->ofs=dbgloc[j];
 
(corinfo+numcorrel)->startline=j;
 
omodule=(corinfo+numcorrel)->file=dbgmod[j];
 
}
 
}
 
(corinfo+numcorrel)->count=(unsigned short)(pdbg-(corinfo+numcorrel)->startline);
 
(corinfo+numcorrel)->end=dbgloc[j-1]+1;
 
numcorrel++;
 
hout=CreateOutPut("tds","wb");
 
if(am32)retcode=CreateW32Debug();
 
else retcode=CreateDosDebug();
 
if(retcode==0&&fwrite(output,outptr,1,hout)!=1)retcode=-1;
 
if(retcode!=0)ErrWrite();
 
fclose(hout);
 
hout=NULL;
 
}
 
}
 
 
 
void AddNameToTable(char *name)
 
{
 
int i=0;
 
char c;
 
do{
 
c=name[i++];
 
op(c);
 
}while(c!=0);
 
}
 
 
 
void AddSymbolList(struct idrec *ptr)
 
{
 
if(ptr!=NULL){
 
AddSymbolList(ptr->right);
 
if((ptr->rectok==tk_proc&&ptr->recsegm>=NOT_DYNAMIC)||
 
(ptr->rectok==tk_interruptproc&&ptr->recsegm>=NOT_DYNAMIC)||
 
(ptr->rectok>=tk_bits&&ptr->rectok<=tk_doublevar&&modelmem!=SMALL)||
 
(ptr->rectok==tk_structvar&&modelmem!=SMALL)){
 
AddNameToTable(ptr->recid);
 
(symbols+numsymbols)->idxname=numsymbols+1;
 
(symbols+numsymbols)->ofs=(unsigned short)(ptr->recpost==0?
 
(unsigned short)ptr->recnumber:
 
(unsigned short)ptr->recnumber+ooutptr);
 
if(modelmem==TINY&&comfile==file_exe)(symbols+numsymbols)->ofs-=(unsigned short)0x100;
 
// if(ptr->rectok==tk_proc)(symbols+numsymbols)->clas=0x18;
 
numsymbols++;
 
if(numsymbols==sizetabsym){
 
symbols=(_SMB_ *)REALLOC(symbols,(sizetabsym+MAXNUMSYM)*sizeof(_SMB_));
 
memset(&(symbols+sizetabsym)->idxname,0,sizeof(_SMB_)*MAXNUMSYM);
 
sizetabsym+=MAXNUMSYM;
 
}
 
}
 
AddSymbolList(ptr->left);
 
}
 
}
 
 
 
void AddNameToPul(char *name)
 
{
 
static int sizebuf=0;
 
int i;
 
i=strlen(name);
 
if((lastofspul+i+2)>=sizebuf){
 
sizebuf+=STRLEN;
 
if(sizebuf==STRLEN)bufname=(unsigned char *)MALLOC(sizebuf);
 
else bufname=(unsigned char *)REALLOC(bufname,sizebuf);
 
}
 
bufname[lastofspul++]=(unsigned char)i;
 
strcpy((char *)(bufname+lastofspul),name);
 
lastofspul+=++i;
 
}
 
 
 
void AddGlobalName(struct idrec *ptr)
 
{
 
if(ptr!=NULL){
 
AddGlobalName(ptr->right);
 
if((ptr->rectok==tk_proc&&ptr->recsegm>=NOT_DYNAMIC)||
 
(ptr->rectok>=tk_bits&&ptr->rectok<=tk_doublevar)||
 
(ptr->rectok==tk_structvar)){
 
AddNameToPul(ptr->recid);
 
numsymbols++;
 
if(ptr->rectok==tk_proc){
 
outword(0x1c); //size
 
outdword(0x20); //type
 
}
 
else{
 
outword(0x18);
 
outdword(0x21);
 
}
 
outword(0);
 
outdword(0);
 
outdword(numsymbols); //name
 
outdword(0);
 
if(ptr->recpost==0){
 
outdword(ptr->recnumber); //offset
 
outword(segcode); //segm
 
}
 
else{
 
outdword(ptr->recnumber+(wbss!=FALSE?0:ooutptr));
 
outword(1);
 
}
 
if(ptr->rectok==tk_proc)outdword(0);
 
}
 
AddGlobalName(ptr->left);
 
}
 
}
 
 
 
int CreateW32Debug()
 
{
 
int sstNames,sstDirectory;
 
int startcode=outptr;
 
int sstGlobalSym;
 
int sstsrc;
 
unsigned int i,j,jj,ofs;
 
for(;numsymbols<(short)totalmodule;numsymbols++)AddNameToPul((startfileinfo+numsymbols)->filename);
 
segcode=(wbss==FALSE?1:2);
 
outptr=0;
 
outdword(0x41304246); // TDS - signature
 
outdword(0); // offset of Subsection Directory (fill later)
 
//sstModule subsection
 
outdword(0); // OvlNum=0 & LibIndex=0
 
outword(segcode); // SegCount
 
outword(0x5643); // CV-style
 
outdword(1); // Name
 
for(i=0;i<4;i++)outdword(0);
 
// outdword(0); //Time
 
// outdword(0);
 
// outdword(0);
 
// outdword(0);
 
if(wbss){
 
outword(0x0001); // SegNumber
 
outword(0); // flag
 
outdword(0); // start
 
outdword(postsize); // len
 
}
 
outword(segcode); // SegNumber
 
outword(0x0001); // flag
 
outdword(startptr); // start
 
outdword(startcode); // len
 
sstsrc=outptr;
 
//sstSrcModule subsection
 
outword((short)numcorrel); //cFile - êîëè÷åñòâî SRC-ôàéëîâ(ñåãìåíòîâ)
 
outword((short)numcorrel); // SegCount (see SegCount in sstModule
 
ofs=14*numcorrel+4;
 
for(i=0,jj=0;i<(unsigned int)numcorrel;i++){
 
if(i!=0)jj=jj+((corinfo+i-1)->count+1)*6+22;
 
outdword(ofs+jj);
 
}
 
for(i=0;i<(unsigned int)numcorrel;i++){
 
outdword((corinfo+i)->ofs);
 
outdword((corinfo+i)->end);
 
}
 
for(i=0;i<(unsigned int)numcorrel;i++)outword(segcode); // ìàññèâ èíäåêñîâ ñåãìåíòîâ
 
for(i=0;i<(unsigned int)numcorrel;i++){
 
outword(1); // Segm#
 
outdword((corinfo+i)->file+1);// File#
 
outdword(outptr-sstsrc+12);
 
outdword((corinfo+i)->ofs);
 
outdword((corinfo+i)->end);
 
outword(segcode); //Segm#
 
jj=(corinfo+i)->count;
 
outword(jj+1); // Lines count
 
ofs=(corinfo+i)->startline;
 
for(j=0;j<jj;j++)outdword(dbgloc[j+ofs]);
 
outdword((corinfo+i)->end);
 
for(j=0;j<jj;j++)outword(dbgnum[j+ofs]);
 
outword(0);
 
}
 
//òàáëèöà ãëîáàëüíûõ ñèìâîëîâ
 
sstGlobalSym=outptr;
 
for(i=0;i<8;i++)outdword(0);
 
// outdword(0); //modindex
 
// outdword(0); //size correct later
 
// outdword(0);
 
// outdword(0);
 
// outdword(0);
 
// outdword(0); //num others correct later
 
// outdword(0); //total correct later
 
// outdword(0); //SymHash, AddrHash
 
outdword(0x02100008); //S_ENTRY32
 
outdword(EntryPoint());
 
outword(segcode);
 
AddGlobalName(treestart);
 
sstNames=outptr;
 
outdword(numsymbols);
 
outptr=sstGlobalSym+4;
 
outdword(sstNames-sstGlobalSym-32);
 
outptr+=12;
 
outdword(numsymbols-totalmodule);
 
outdword(numsymbols-totalmodule);
 
outptr=4;
 
sstDirectory=sstNames+4+lastofspul;
 
outdword(sstDirectory);
 
if(fwrite(output,sstNames+4,1,hout)!=1)return -1;
 
if(fwrite(bufname,lastofspul,1,hout)!=1)return -1;
 
free(bufname);
 
// Subsection Directory
 
outptr=0;
 
outdword(0x0C0010);
 
outdword(4); // cDir - number of subsections
 
outdword(0);
 
outdword(0);
 
//sstModule
 
outdword(0x10120);
 
outdword(8); //start
 
outdword(sstsrc-8); // size
 
// sstSrcModule
 
outdword(0x10127);
 
outdword(sstsrc); //start
 
outdword(sstNames-sstsrc);//size
 
//sstGlobalSym
 
outdword(0x129);
 
outdword(sstGlobalSym); //start
 
outdword(sstNames-sstGlobalSym); //size
 
// sstNames
 
outdword(0x130);
 
outdword(sstNames);
 
outdword(sstDirectory-sstGlobalSym);
 
outdword(0x41304246); // TDS - signature
 
outdword(sstDirectory+outptr+4); // TDS-len
 
return 0;
 
}
 
 
 
int CreateDosDebug()
 
{
 
unsigned int i,j,count;
 
D16START d16header;
 
MODULE *module;
 
SFT *sft;
 
LT *lt;
 
CT *ct;
 
int corrnum=0,ii;
 
unsigned short beg,end;
 
outptr=0;
 
//16-áèò çàãîëîâîê
 
memset(&d16header,0,sizeof(D16START));
 
//òàáëèöà ãëîáàëüíûõ èìåí
 
symbols=(_SMB_ *)MALLOC(sizeof(_SMB_)*MAXNUMSYM);
 
memset(symbols,0,sizeof(_SMB_)*MAXNUMSYM);
 
AddSymbolList(treestart);
 
d16header.numname=totalmodule*2+numsymbols;
 
d16header.numsymbl=d16header.numgsymb=numsymbols;
 
 
 
d16header.sign=0x040352FB; //sign & version
 
d16header.imagesize=runfilesize; //image size
 
d16header.numsours=totalmodule; //1
 
d16header.numline=pdbg; //lines
 
d16header.numincl=totalmodule; //include files
 
d16header.numseg=totalmodule;//totalmodule; //1
 
d16header.numcorrel=numcorrel;//totalmodule; //Correlation
 
d16header.casesensiv=1;
 
// d16header.numtentr=NUMTYPES;
 
//òîëüêî äëÿ 128-áàéòîâîãî çàãîëîâêà
 
// d16header.fdebug=1;
 
 
 
d16header.ucnovn=0x380000;
 
d16header.sizeblock=sizeof(MODULE)*totalmodule+sizeof(SFT)*totalmodule+
 
sizeof(LT)*pdbg+sizeof(SEGMENT)*totalmodule+sizeof(CT)*numcorrel+
 
6*totalmodule+/*NUMTYPES*12+*/sizeof(_SMB_)*numsymbols/*+numsymbols*4*/;
 
d16header.reftsize=numsymbols*4;
 
 
 
//module table
 
module=(struct MODULE *)MALLOC(sizeof(MODULE)*totalmodule);
 
memset(module,0,sizeof(MODULE)*totalmodule);
 
//sourse file table
 
sft=(SFT *)MALLOC(sizeof(SFT)*totalmodule);
 
//segment table
 
segment=(struct SEGMENT *)MALLOC(sizeof(SEGMENT)*totalmodule);
 
memset(segment,0,sizeof(SEGMENT)*totalmodule);
 
//correlation table
 
ct=(CT *)MALLOC(sizeof(CT)*numcorrel);
 
for(i=0;i<totalmodule;i++){
 
//èìåíà ìîäóëåé
 
AddNameToTable((startfileinfo+i)->filename);
 
strcpy((char *)string3,(startfileinfo+i)->filename);
 
char *str=strrchr((char *)string3,'.');
 
if(str!=0){
 
str[0]=0;
 
str=strrchr((char *)string3,'\\');
 
if(str==NULL)str=(char *)string3;
 
else str++;
 
}
 
else str=(char *)string3;
 
AddNameToTable(str);
 
//òàáëèöà ìîäóëåé
 
(module+i)->name=i*2+2+numsymbols;
 
(module+i)->language=1;
 
(module+i)->memmodel=8;//modelmem==SMALL&&comfile==file_exe?9:8;
 
(module+i)->sourcount=1;//(unsigned short)totalmodule;
 
(module+i)->sourindex=(unsigned short)(i+1);
 
//èíôîðìàöèÿ îá èñõîäíûõ ôàéëàõ
 
(sft+i)->idx=i*2+1+numsymbols;
 
(sft+i)->time=(startfileinfo+i)->time;
 
count=0; //÷èñëî êîðåëÿöèé äëÿ äàííîãî ìîäóëÿ
 
for(ii=0;ii<numcorrel;ii++){//îáõîä òàáëèöû êîððåëÿöèè
 
if((corinfo+ii)->file==(unsigned short)i){ //êîðð äëÿ ýòîãî ìîäóëÿ
 
if(count==0){ //ïåðâûé áëîê
 
(segment+i)->ofs=beg=(unsigned short)(corinfo+ii)->ofs;
 
(segment+i)->correli=(unsigned short)(corrnum+1); //correlation index
 
(module+i)->corindex=(unsigned short)(corrnum+1);
 
}
 
(ct+corrnum)->beg=(corinfo+ii)->startline+1;
 
(ct+corrnum)->segidx=(unsigned short)(1+i); //segment idx
 
(ct+corrnum)->filidx=(unsigned short)(i+1); //file idx
 
(ct+corrnum)->count=(corinfo+ii)->count; //÷èñëî ëèíèé
 
end=(unsigned short)(corinfo+ii)->end;
 
corrnum++;
 
count++;
 
}
 
}
 
//òàáëèöà ñåãìåíòîâ
 
(segment+i)->idx=(unsigned short)(i+1); //segment index
 
(segment+i)->size=(unsigned short)(end-beg);//length
 
(segment+i)->correlc=(unsigned short)count;//(unsigned short)totalmodule; //correlation count
 
(module+i)->corcount=(unsigned short)count;
 
if(modelmem==TINY&&comfile==file_exe)(segment+i)->segm=0xfff0;
 
}
 
d16header.pol_size=outptr;
 
if(fwrite(&d16header,sizeof(D16START),1,hout)!=1)return -1;
 
if(fwrite(symbols,sizeof(_SMB_)*numsymbols,1,hout)!=1)return -1;
 
if(fwrite(module,sizeof(MODULE)*totalmodule,1,hout)!=1)return -1;
 
free(module);
 
if(fwrite(sft,sizeof(SFT)*totalmodule,1,hout)!=1)return -1;
 
free(sft);
 
//line table
 
lt=(LT *)MALLOC(sizeof(LT)*pdbg);
 
for(j=0;(unsigned int)j<pdbg;j++){
 
// printf("line %d loc %X\n",dbgnum[j],dbgloc[j]);
 
(lt+j)->line=(unsigned short)dbgnum[j];
 
(lt+j)->ofs=(unsigned short)dbgloc[j];
 
}
 
if(fwrite(lt,sizeof(LT)*pdbg,1,hout)!=1)return -1;
 
free(lt);
 
if(fwrite(segment,sizeof(SEGMENT)*totalmodule,1,hout)!=1)return -1;
 
free(segment);
 
if(fwrite(ct,sizeof(CT)*numcorrel,1,hout)!=1)return -1;
 
free(ct);
 
// if(fwrite(types,NUMTYPES*12,1,hout)!=1)return -1;
 
memset(&string3,0,6*totalmodule);
 
if(fwrite(&string3,6*totalmodule,1,hout)!=1)return -1;
 
/* if(numsymbols){
 
memset(symbols,0,4*numsymbols);
 
if(fwrite(symbols,4*numsymbols,1,hout)!=1)return -1;
 
}*/
 
free(symbols);
 
return 0;
 
}
 
 
 
void KillDataLine(int line)
 
{
 
(startfileinfo+dbgmod[line])->numdline--;
 
for(unsigned int j=line;(j+1)<pdbg;j++){
 
dbgloc[j]=dbgloc[j+1];
 
dbgnum[j]=dbgnum[j+1];
 
dbgmod[j]=dbgmod[j+1];
 
}
 
lstflag++;
 
lststring++;
 
lstend++;
 
pdbg--;
 
}
 
 
 
void GeneratLst()
 
{
 
unsigned int j;
 
unsigned long startip;
 
unsigned int offs2,line;
 
unsigned char flag;
 
hout=CreateOutPut("lst","wt");
 
if(lstend[pdbg-1]==0)lstend[pdbg-1]=endinptr;
 
startip=(comfile!=file_w32&&comfile!=file_bin?0:ImageBase);
 
fprintf(hout,"SPHINX/SHEKER C-- One Pass Disassembler. Version %d.%02d%s %s\n",ver1,ver2,betta,__DATE__);
 
for(j=0;j<pdbg;j++){
 
//printf("line %d loc %X\n",dbgnum[j],dbgloc[j]);
 
if((int)lstflag[j]!=0xFF){
 
flag=lstflag[j];
 
offs2=lstend[j];
 
outptr=dbgloc[j];
 
instruction_offset=outptr+startip;
 
seg_size=(unsigned char)(16+16*(flag&1));
 
line=dbgnum[j];
 
if(offs2!=outptr){
 
/*
 
if(line!=0)printf("%s %u:",(startfileinfo+dbgmod[j])->filename,line);
 
if(lststring[j]!=NULL)printf(" %s\n",lststring[j]);
 
else if(line!=0)printf("\n");
 
*/
 
fprintf(hout,"\n");
 
if(line!=0)fprintf(hout,"%s %u:",(startfileinfo+dbgmod[j])->filename,line);
 
if(lststring[j]!=NULL)fprintf(hout," %s\n",lststring[j]);
 
else if(line!=0)fprintf(hout,"\n");
 
while(outptr<offs2){
 
if(flag&0x1e)undata(instruction_offset,offs2-dbgloc[j],(flag>>1)&15);
 
else unassemble(instruction_offset);
 
}
 
}
 
if((dbg&1)!=0&&((flag&0xe)!=0||line==0)){
 
KillDataLine(j);
 
j--;
 
}
 
}
 
}
 
fclose(hout);
 
hout=NULL;
 
}
 
 
 
#ifdef DEBUGMODE
 
void printdebuginfo()
 
{
 
static FILE *df=NULL;
 
if((df=fopen("debug.tmp","w+t"))==NULL)df=stdout;
 
fprintf(df,"%s(%d)> %08X %08X tok=%d num=%08X flag=%08X scanmode=%d %s\n",startfileinfo==NULL?"":(startfileinfo+currentfileinfo)->filename,linenumber,input,inptr2,tok,itok.number,itok.flag,scanlexmode,itok.name);
 
fflush(df);
 
}
 
#endif