+unsigned int i = 0;
+char tokenValue[50];
+enum TokenType {
+ MOTCLE,
+ SECTION,
+ SSECTION,
+ NPARA,
+ MOT,
+ FIN
+} tokenType;
+const char* tokenTypestr[] = { "MOTCLE", "SECTION", "SSECTION", "NPARA", "MOT", "FIN" };
+
+bool istAlpha() {
+ if (c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f' || c == 'g' || \
+ c == 'h' || c == 'i' || c == 'j' || c == 'k' || c == 'l' || c == 'm' || c == 'n' || \
+ c == 'o' || c == 'p' || c == 'q' || c == 'r' || c == 's' || c == 't' || c == 'u' || \
+ c == 'v' || c == 'w' || c == 'x' || c == 'y' || c == 'z' || \
+ c == 'A' || c == 'B' || c == 'C' || c == 'D' || c == 'E' || c == 'F' || c == 'G' || \
+ c == 'H' || c == 'I' || c == 'J' || c == 'K' || c == 'L' || c == 'M' || c == 'N' || \
+ c == 'O' || c == 'P' || c == 'Q' || c == 'R' || c == 'S' || c == 'T' || c == 'U' || \
+ c == 'V' || c == 'W' || c == 'X' || c == 'Y' || c == 'Z' || \
+ c == '.' || c == '?' || c == '!' || c == ',' || c == ';' || c == ':' || c == '-' || \
+ c == '\''|| c == '#' || \
+ c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || \
+ c == '7' || c == '8' || c == '9') {
+ return true;
+ }
+ return false;
+}
+
+bool isSeparator() {
+ if (c == '\t' || c == ' ' || c == '\n') {
+ return true;
+ }
+ return false;
+}
+
+int scanner() {
+const char* Titre = "Titre";
+const char* Auteur = "Auteur";
+unsigned int j = 0;
+
+// The main loop get the next character
+init:
+ if (c == ' ' || c == '\t') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto init;
+ }
+ if (c == '>') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto MC1;
+ }
+ if (c == '=') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto S1SS1;
+ }
+ if (istAlpha()) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto M1;
+ }
+ if (c == '\n') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto initLV1;
+ }
+ if (c == EOF) {
+ goto FIN;
+ } else {
+ goto error;
+ }
+
+MC1:
+ if (c == Titre[j] && j < strlen(Titre) - 1) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ j++;
+ goto MC1;
+ }
+ if (c == Auteur[j] && j < strlen(Auteur) - 1) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ j++;
+ goto MC1;
+ } else {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto MC2;
+ }
+
+S1SS1:
+ if (isSeparator() || c == EOF) {
+ goto SECTION;
+ }
+ if (c == '=') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto SS2;
+ }
+
+SS2:
+ if (isSeparator() || c == EOF) {
+ goto SECTION;
+ }
+
+SECTION:
+ tokenType = SECTION;
+ return 1;
+
+M1:
+ if (istAlpha()) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto M1;
+ }
+ if (isSeparator() || c == EOF) {
+ goto MOT;
+ }
+
+initLV1:
+ if (c == '\n' || c == '\t') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto initLV1;
+ }
+ if (istAlpha()) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto M1;
+ }
+ if (c == '=') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto S1SS1;
+ }
+ if (c == '>') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto MC1;
+ }
+ if (c == '\n') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto initLV1LV2;
+ }
+ if (c == EOF) {
+ goto FIN;
+ }
+
+initLV1LV2:
+ if (isSeparator()) {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto initLV1LV2;
+ }
+ if (c == '>') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto MC1;
+ }
+ if (c == '=') {
+ c = fgetc(source);
+ tokenValue[i] = c;
+ i++;
+ goto S1SS1;
+ }
+ if (c == EOF) {
+ goto FIN;
+ }
+ if (istAlpha()) {
+ goto NPARA;
+ }
+
+NPARA:
+ tokenType = NPARA;
+ return 1;
+
+MOT:
+ tokenType = MOT;
+ return 1;
+
+MC2:
+ if (isSeparator() || c == EOF) {
+ goto MOTCLE;
+ }
+
+MOTCLE:
+ tokenType = MOTCLE;
+ return 1;
+
+FIN:
+ tokenType = FIN;
+ return 1;
+
+error:
+ tokenType = FIN;
+ return -1;
+}