
string fontlist_list;


string readname(int o, int p, int h)
{
 string s;
 int b, a;

 a = filetell(h);
 fileseek(o + p, h);

 while(b = filegetc(h))
  s += chars(b);

 fileseek(a, h);
 return(s);
}


// deal with 'Font list' menu entry

int fontlist_entry(int entry, int subcode)
{
 int h1, h2, i, l = 0, n, o, p;
 string s, t;

 if((fileinfo(currentfile(), s) & 1) == 0)
 {
  t = "{FONTLIST_01}";
  translate(t);
  messagebox(t);
  return(0);
 }

 h1 = fileopen(s, "rb");
 h2 = fileopen(fontlist_list, "w+");

 // read file header
 for(i = 0; i < 64; ++i)
  filereadi(h1);
 p = filetell(h1);

 // find font map object
 do
 {
  fileseek(p + l, h1);
  p = filetell(h1);
  for(i = 0; i < 7; ++i)
   l = filereadi(h1);  
  filereadi(h1);
 }
 while(filereadi(h1) != 0x1017);

 // read font map object
 filereadi(h1);
 filereadi(h1);
 filereadi(h1);
 filereadi(h1);
 filereadi(h1);

 // read number of fonts
 n = filereadi(h1);
 o = filetell(h1);

 // read each font
 for(i = 0; i < n; ++i)
 {
  filereadi(h1);
  p = filereadi(h1) & 0xFFFFFF;
  filereadi(h1);
  filereadi(h1);
  filewrites(readname(o, p, h1) + "\n", h2);
 }
 fileclose(h1);
 fileclose(h2);
 osclis("filer_run " + fontlist_list);
}


// shade Font list entry

int fontlist_flags(int entry, string &text)
{
 string s;

 if((fileinfo(currentfile(), s) & 1) == 0)
  return(SHADED);
}

// add 'Font list' option to Applets menu

void main(void)
{
 string help = "{FONTLIST_02}";

 script_menu_initialise();

 fontlist_list = "OvationPro$AppletsDir";
 getenvs(fontlist_list);
 fontlist_list += ".!FontList.List";

 addentry_menu(script_handle,"fontlist_entry","fontlist_flags","","","{FONTLIST_00}");

 if(isdefmacro("fontlist") == -1)
 {
  translate(help);
  defmacro2(0, "fontlist" ,"{fontlist_entry(0, 0)}" ,"fontlist", help);
 }
}
