#ifndef __MENUETOS_MCOFF_H
#define __MENUETOS_MCOFF_H

#include"_coff.h"

typedef struct {
 char			* co_loadptr;
 unsigned long		  co_loadaddr;
 unsigned long		  co_filesize;
 FILHDR			* co_filehdr;
 SCNHDR			* co_sections;
 SYMENT			* co_symtab;
 char			* co_strtab; 
 char			* co_bssptr;
 unsigned long		  co_bssaddr;
 unsigned long		  co_bsssize;
 unsigned long		  co_bsssectnum;
} coffobj_t;

coffobj_t * mcoff_load_file(char * fname);
void unload_coff_file(coffobj_t * obj);
SCNHDR * find_section(char * name,coffobj_t * obj);
int read_section_data(coffobj_t * obj,SCNHDR * hdr,void ** readp);
SYMENT * find_coff_symbol(coffobj_t * obj,char * objname);

typedef int (* symlookupfn_t)(coffobj_t *,unsigned long *,unsigned long *,int);
int relocate_coff_file(coffobj_t * obj,symlookupfn_t lookupfn);
int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
 unsigned long * sym_sect,int index);
unsigned long mcoff_get_ref(coffobj_t * obj,char * symname);

/*
Your lookup function can be similar to this:

int mcoff_std_symlookupfn(coffobj_t * obj,unsigned long * sym_val,
 unsigned long * sym_sect,int index)
{
 SYMENT * symtab,* lookup;
 char xname[9];
 char * symnamep;
 symtab=obj->co_symtab+index;
 *sym_sect=(unsigned long)symtab->e_scnum;
 if(symtab->e_scnum>0)
 {
  *sym_val=symtab->e_value;
  return 0;
 }
 if(symtab->e.e.e_zeroes==0)
 {
  symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset);
 } else {
  symnamep=(char *)symtab->e.e_name;
  memset(xname,0,9);
  memcpy(xname,symnamep,8);
  symnamep=xname;
 }
 lookup=find_coff_symbol(obj,symnamep);
 if(!lookup) return -1;
 *sym_val=lookup->e_value+obj->co_sections[lookup->e_scnum-1].s_scnptr+obj->co_loadaddr;
 return 0;
}
*/

#endif