int max_modes=20; /* currently we have a maximum number of extensions! */
int mode=0;       /* number of modes recorded */

string Name[max_modes];
string Ext[max_modes];
string Var[max_modes];
string Func[max_modes];

int export AddMode(string modename,
                   string extensions,
                   string modevar,
                   string funcname)
{
  if(mode>=max_modes)
    return 1;

  Name[mode] = modename;
  Ext[mode]  = extensions;
  Var[mode]  = modevar;
  Func[mode] = funcname;

  mode++;
  return 0;
}


/*****************************************************************************
********************************************************* LoadModeControl() **
*****************************************************************************/

int export LoadModeControl()
{
   string name = ReadInfo("file_name");
   string req = GetLine();
   int i = strstr(req,"-*-");		/* extract mode request from line 1 */
   if(mode) { /* are there any modes at all? */
     
     if (i>=0) {
        int a = strstr(req,"-*-",i);
        if(a>0) {
          req = substr(req, i+3, a-i-3);
        }
        else {
          i=-1;
        }
     }
     if(i>=0) {
       for(i=0; i<mode; i++) {
         if(0 == Stricmp(Name[i], req)) {
           DoTheJob(i);
           return 0;
         }
       }
     }
   }
   return(0);
}

export int CheckExt_hook(string path, string name)
{
  int i;
  i = strstr(name, ".");
  if (i > 0) {
    string ext;
    string cmp;
    int a, b, c;
    ext = substr(name, i + 1, -1);    
    while(a<mode) {
      if(0 == Stricmp(Ext[a], ext)) {
        DoTheJob(a);
        return 0;
      }
      a++;
    }
    /* no extension matched */
  }
}

void DoTheJob(int number)
{
  SetInfo(-1, Var[number], 1);
  if(strlen(Func[number])) {
    string str = sprintf("%s(%ld);", Func[number], GetBufferID());
    ExecuteString(str);
  }
}

HookPast("Load","LoadModeControl();",""); /* the load-checking for modename */
Hook("GetFile", "CheckExt_hook");         /* extension checker */

