#include <ctype.h>
#include <string.h>
#include <exec/types.h>

#define LibCall __asm __saveds

struct keyindent
{ char *key;
  int indent;
};

LibCall ULONG
ScanHandler(register __d0 ULONG txtlen, register __a0 char **text, register __a1 ULONG *line)
{
    char *version = "$VER: LaTeX Section 1.0 (28.11.96)";
    struct keyindent keywords[] = {{"part",          0},
                                   {"chapter",       0},
                                   {"section",       2},
                                   {"subsection",    4},
                                   {"subsubsection", 5},
                                   NULL};

    int len=txtlen, keylen, keylvl, lbrace, i;
    char *scan, *keystr, *namestr;

    for (scan=strchr(*text, '\\'); scan; scan=strchr(scan, '\\'))  {

        scan++;
        len=txtlen-(scan-*text);

        for (keystr=scan; len && isalpha(*scan); scan++, len--);

        for (keylvl=-1, i=0; keywords[i].key, keylen=strlen(keywords[i].key); i++) {

            if (!strncmp(keystr, keywords[i].key, keylen)) {

                keylvl=keywords[i].indent;
                break;
            }
        }

        if (keylvl != -1) {

            if (scan=strchr(scan, '{')) {

                static char tmp[281], *tmpos;
                int state=1;

                scan++;
                len=txtlen-(scan-*text);
                namestr=scan;

                for (tmpos=tmp; keylvl; *(tmpos++)=' ', keylvl--);

                for (lbrace=1; len >= 0 && lbrace; scan++, len--) {

                    switch (state) {
                        case 1:
                           if (*scan == '{') lbrace++;
                           else if (*scan == '}') lbrace--;
                           else if (*scan == '\\') state=2;
                           else *(tmpos++)=*scan;
                           break;
                        case 2:
                           if (!isalpha(*scan)) {
                               *(tmpos++)=*scan;
                               state=1;
                           }
                           else state=3;
                           break;
                        case 3:
                           if (*scan == '{') lbrace++;
                           else if (*scan == '}') lbrace--;
                           else if (*scan == ' ') state=1;
                           else if (!isalpha(*scan)) {
                               *(tmpos++)=*scan;
                               state=1;
                           }
                    }
                }

                if (!lbrace) {

                   *(tmpos++)='\0';

                   *text=tmp;

                   return((ULONG) (tmpos-tmp));
                }
            }
        }
    }

    return(0);
}
