Description du langage .inc

Postscript-like language

Commentaire: commence par un caractère % jusqu'à la fin de la ligne
Ligne vide: non traitée
Espace: réduit à un espace entre les mots clés.
Include: %% include file.inc

Type:
 Numérique: entier 32 bits signé (123, -40, 0x12bc)
 Caractère: 'a', '\033', '\x1b', '\u20ac' (0 à 0x1fffff)
 bool: type retourné par les opérateurs logiques booléens
   les mots clés "true" et "false" ne sont pas définis par défaut, mais on peut les définir avec l'expression suivante:
   /true 0 0 eq def
   /false 0 0 ne def
 Chaîne UTF-8 (pointeur):  "test\n" (Notation: \uXXXX ou \UXXXXXXXX 
 Chaîne: pointeur
 Tableau: pointeur
   [ element1 element2 element3 ]
   Note: lors de l'instanciation d'un tableau, il faut libérer la mémoire avec free
   Astuce: "[" retourne le pointeur vers le premier élément.
   /unTableau [ obj1 obj2 obj3 ] def
   unTableau free

Le programme doit retourner une pile vide ou la valeur booléene true en haut de la pile.

Évènements (callback):
KeyEvent       Called if a key is pressed.
MenuInit       Should draw boot menu.
InfoBoxInit    Show message box (e.g. error messages).
InfoBoxDone    Hide message box.
ProgressInit   Initialize kernel load progress bar (syslinux/isolinux only).
ProgressDone   Hide progress bar.
ProgressUpdate Advance progress bar.
PasswordInit   Show password dialog.
PasswordDone   Hide password dialog.
Timeout        Timeout counter; called every 18.3th second until timeout occurs.
Timer          Called every 18.3th second regardless of timeout. 

Définition de code:
 { code }
Interprète le code jusqu'à l'accolade fermante, et ensuite exécute le code.


Macro/constante
 Nom: commence par un /, suivi de n'importe quoi sauf un espace.
 Assignation
  hexadécimal:  /nomMacro 0x0000001b def
                /nomMacro 0x020c def

  numérique:    /nomMacro 0 def

Array:
 [ var1 var2 var3 ]

Incompris:
/CapsLock { 0x417 cvp getbyte 0x40 and 0 ne } def
/bootloader sysconfig getbyte def
/lilo     bootloader 0 eq def
/syslinux bootloader 1 eq def
/grub     bootloader 2 eq def
/boot_failsafe sysconfig 3 add getbyte def
/bootdrive sysconfig 5 add getbyte def
/mediatype sysconfig 2 add getbyte def
/biosmem sysconfig 20 add getdword def

/sectorsize
  1
  sysconfig 1 add getbyte
  20 min % max. 1 MB
  dup 0 eq { pop 9 } if
  shl
def

/getinfo {
  2 shl
  sysconfig 12 add exch add getdword
} def

/true     0 0 eq def
/false    0 0 ne def

/.value { t_int settype } def
/.undef 0 t_none settype def
/.end 0 t_end settype def

macros:
/nomfonction {
  code
} def
correspondance C: #define nomfonction code

Structure:
 

Liste de fonctions:
 int 64bit           : retourne 1 si la machine est 64 bits
 int (var1 var2 and) : retourne le résultat d'un "et binaire" avec var1 et var2.
 int (var1 var2 shr) : retourne le "shift right" de var2 (entier) bits
 bool(var1 var2 eq) : retourne vrai si var1 est égal à var2
 bool(var1 var2 ne) : retourne vrai si var1 n'est pas égal à var2
 var1 var1 (var1 dup) : duplique la variable de tête de la pile (TOS)
 var1 var2 var3 put : assigne la valeur "var3" dans l'indice var2 du tableau var1 et retourne le tableau. // C: var1[var2] = var3;
 var1 var2 get      : retourne la valeur du tableau var1 à l'indice var2 // C: var1[var2]
 var1 var2 rot      : var2 var1
 varTableau free    : désalloue un tableau assigné par une définition []

Liste de fonctions internes:
 ptr (int1 _readsector) : retourne un pointeur vers un buffer static à la position int1.

Condition:
 var1 { code1 } if         : exécute "code1" si var1 est vrai.
 var1 { code1 } { code2 } elseif : exécute "code1" si var1 est vrai, sinon exécute "code2".


Boucle:
 arg1 arg2 { "code1" } forall : exécute pour tous les arguments avant les instructions "code1"
 { } loop : boucle tant que "exit" n'est pas appelé