Added source files C--.

git-svn-id: svn://kolibrios.org@6446 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
GerdtR
2016-06-13 02:07:22 +00:00
parent 393851c2ba
commit 6bd5a354f5
38 changed files with 57942 additions and 0 deletions

View File

@@ -0,0 +1,534 @@
#include "tok.h"
#include "coff.h"
char *meserr="Plese, send this obj and sources files to me (sheker@mail.ru)";
struct LISTINCLFILE{
char *name;
int typefind;
int type;
};
enum{
s_extern,
s_code,
s_data,
s_bss
};
struct LISTNAMESYMBOL{
int idx; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
int seg;
int adr;
idrec *rec;
int dbg;
char name[IDLENGTH];
}*listnamesymbol;
char *curobjname;
int numobj=0,numname;
LISTINCLFILE *listobj;
unsigned int adr_end;
void LoadObj();
void AddPost(unsigned long loc,int type,unsigned int num);
int searchtree2(idrec *fptr,ITOK *itok4,int *tok4,unsigned char *string4);
int GetSegm(int seg)
{
OBJECT_ENTRY *obj;
if(seg){
seg--;
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*seg));
seg=obj->vsize;
}
return seg;
}
int GetOffSec(int seg)
{
OBJECT_ENTRY *obj;
if(seg){
seg--;
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*seg));
seg=obj->sectionRVA;
}
return seg;
}
void AddNameObj(char *name,int typefind,int type)
{
int len;
len=strlen(name);
if(!numobj)listobj=(LISTINCLFILE *)MALLOC(sizeof(LISTINCLFILE));
else listobj=(LISTINCLFILE *)REALLOC(listobj,sizeof(LISTINCLFILE)*(numobj+1));
(listobj+numobj)->name=BackString(name);
(listobj+numobj)->typefind=typefind;
(listobj+numobj)->type=type;
numobj++;
}
void AddObj()
{
int hold;
for(int i=0;i<numobj;i++){
curobjname=(listobj+i)->name;
// puts(curobjname);
hold=loadfile(curobjname,(listobj+i)->typefind);
if(hold==1||hold==-1){
unableopenfile(curobjname);
continue;
}
if((listobj+i)->type==0)LoadObj();
free(input);
}
}
int GetAlighSize(long flag)
{
int align=0;
int i=(flag&IMAGE_SCN_ALIGN_MASK)>>20;
if(i)align=1<<(i-1);
if(align==1)align=0;
return align;
}
void ConvertName(char *name)
{
int i1,i2;
char c;
tok=tk_ID;
i1=i2=0;
c=name[i1];
if(c=='?'){
i1++;
c=name[i1];
if(c=='?'){
i1=2;
c=name[i1];
}
}
else if(c=='_'){
if(strncmp(name,"__imp__",7)==0){
i1=7;
c=name[i1];
}
else if(name[1]=='$'){
i1=2;
c=name[i1];
}
}
while(c!=0){
if(c>='a'&&c<='z')tok=tk_id;
name[i2]=c;
i1++;
i2++;
c=name[i1];
if(c=='@'||c=='$')break;
}
name[i2]=0;
}
void AddPost(unsigned long loc,int type,unsigned int num)
{
CheckPosts();
(postbuf+posts)->num=num;
(postbuf+posts)->type=type;
(postbuf+posts)->loc=loc;
posts++;
}
void ScanSection(int numobj)
{
int poutptr,poutptrdata,ppostsize,align;
OBJECT_ENTRY *obj;
long flag;
poutptr=outptr;
poutptrdata=outptrdata;
ppostsize=postsize;
for(int i=0;i<numobj;i++){
obj=(OBJECT_ENTRY *)(input+(sizeof(COFF_HEADER)+sizeof(OBJECT_ENTRY)*i));
flag=obj->flags;
align=GetAlighSize(flag);
obj->vsize=-1;
if((flag&IMAGE_SCN_CNT_CODE)&&(flag&IMAGE_SCN_MEM_EXECUTE)){//ᥪ<><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD>
obj->vsize=s_code;
obj->sectionRVA=poutptr=Align(poutptr,align);
poutptr+=obj->psize;
if(splitdata==FALSE)poutptrdata=poutptr;
}
else{
if((flag&IMAGE_SCN_MEM_READ)&&(flag&IMAGE_SCN_MEM_WRITE)){
if(flag&IMAGE_SCN_CNT_INITIALIZED_DATA){ //ᥪ<><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obj->vsize=s_data;
obj->sectionRVA=poutptrdata=Align(poutptrdata,align);
poutptrdata+=obj->psize;
if(splitdata==FALSE)poutptr=poutptrdata;
}
else if(flag&IMAGE_SCN_CNT_UNINITIALIZED_DATA){ //ᥪ<><E1A5AA><EFBFBD> bss
obj->vsize=s_bss;
obj->sectionRVA=ppostsize=Align(postsize,align);
postsize+=obj->psize;
}
}
}
}
}
void AddLstName(int numname)
{
unsigned int minofs;
int i,j,minname;
int oseg;
unsigned int ooutptr,ooutptrdata;
ooutptr=outptr;
ooutptrdata=outptrdata;
for(i=0;i<numname;i++){
if((listnamesymbol+i)->dbg==0){
oseg=(listnamesymbol+i)->seg;
minofs=(listnamesymbol+i)->adr;
minname=i;
for(j=i+1;j<numname;j++){
if(splitdata==FALSE)goto checkadr;
else if((listnamesymbol+j)->seg==oseg){
checkadr:
if(minofs>=(listnamesymbol+j)->adr&&(listnamesymbol+j)->dbg==0){
if(minofs==(listnamesymbol+j)->adr){
(listnamesymbol+minname)->dbg=1;
}
minofs=(listnamesymbol+j)->adr;
minname=j;
oseg=(listnamesymbol+j)->seg;
}
}
}
if(minname!=i)i--;
// printf("seg=%d adr=%d %s\n",oseg,(listnamesymbol+minname)->adr,(listnamesymbol+minname)->name);
if(oseg==s_code){
if((listnamesymbol+minname)->rec){
idrec *ptr;
ptr=(listnamesymbol+minname)->rec;
if(ptr->rectok==tk_undefproc||ptr->rectok==tk_proc||ptr->rectok==tk_interruptproc)goto dproc;
outptrdata=(listnamesymbol+minname)->adr;
if(splitdata==FALSE)outptr=outptrdata;
AddDataNullLine(3,(listnamesymbol+minname)->name);
}
else{
dproc:
outptr=(listnamesymbol+minname)->adr;//12.08.04 00:05 +ooutptr;
AddCodeNullLine((listnamesymbol+minname)->name);
}
}
else if(oseg==s_data){
outptrdata=(listnamesymbol+minname)->adr;//12.08.04 01:19 +ooutptrdata;
if(splitdata==FALSE)outptr=outptrdata;
AddDataNullLine(3,(listnamesymbol+minname)->name);
}
(listnamesymbol+minname)->dbg=1;
}
}
outptr=ooutptr;
outptrdata=ooutptrdata;
}
int ScanName(COFF_HEADER *head)
{
int size,i,j,numname,seg,count;
IMAGE_SYMBOL *tsym;
unsigned int ooutptr,ooutptrdata,opostsize;
idrec *rec;
ooutptr=outptr;
ooutptrdata=outptrdata;
opostsize=postsize;
numname=head->COFFsize;
size=numname*sizeof(IMAGE_SYMBOL)+head->pCOFF;
listnamesymbol=(LISTNAMESYMBOL *)MALLOC(sizeof(LISTNAMESYMBOL)*numname);
for(i=0,j=0;i<numname;i++){
tsym=(IMAGE_SYMBOL *)(input+head->pCOFF+i*sizeof(IMAGE_SYMBOL));
(listnamesymbol+j)->rec=0;
if(tsym->SectionNumber>=0){
(listnamesymbol+j)->idx=i;
if(tsym->N.Name.Short==0){
strcpy((char *)string,(char *)(input+size+tsym->N.Name.Long));
}
else{
strncpy((char *)string,(char *)tsym->N.sname,8);
string[8]=0;
}
//<2F><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
ConvertName((char *)string);
seg=(listnamesymbol+j)->seg=GetSegm(tsym->SectionNumber);
// printf("find name \"%s\" seg=%d type=%d class=%d\n",(char *)string,seg,tsym->Type,tsym->StorageClass);
(listnamesymbol+j)->adr=tsym->Value+GetOffSec(tsym->SectionNumber);
(listnamesymbol+j)->dbg=0;
strcpy((listnamesymbol+j)->name,(char *)string);
if(seg==s_data){
outptrdata=(listnamesymbol+j)->adr;//12.08.04 01:20 +ooutptrdata;
count=FindOff(string,DS);