1 Function getLengthOfTheInput() Which Returns Integer32 Is External;
   2 Function getCharacterAtIndex(Integer32 index)
   3          Which Returns Character Is External;
   4 Function printString(PointerToCharacter string) Which Returns Nothing
   5          Is External;
   6 
   7 PointerToCharacter elements[13]  :=   {"I",  "IV", "V",
   8                                        "IX", "X",  "XL",
   9                                        "L",  "XC", "C",
  10                                        "CD", "D",  "CM",
  11                                        "M"};
  12 Integer16 meaningsOfElements[13] :=   { 1,    4,    5,
  13                                         9     10,   40,
  14                                         50,   90,  100,
  15                                         400,  500, 900,
  16                                         1000};
  17 Character result[64], input[64], debugPrint[128];
  18 
  19 Function strcat(PointerToCharacter dest, PointerToCharacter src)
  20          Which Returns Nothing Is Declared;
  21 
  22 Function convertToRomanNumerals(Integer16 number) Which Returns Nothing Does
  23     result[0] := 0;
  24     PointerToCharacter result := AddressOf(result[0]);
  25     If number = 0 Then
  26         strcat(result,"N");
  27         Return;
  28     ElseIf number < 0 or number >= 4000 Then
  29         strcat(result,"\"Please enter a number between 0 and 4000.\"");
  30         Return;
  31     EndIf
  32     Integer32 pointerToElement := 12; // To "M" (1000).
  33     While number Loop
  34         If number > meaningsOfElements[pointerToElement] - 1 Then
  35             strcat(result, elements[pointerToElement]);
  36             number -= meaningsOfElements[pointerToElement];
  37         Else
  38            pointerToElement -= 1;
  39         EndIf
  40     EndWhile
  41 EndFunction
  42 
  43 Function strlen(PointerToCharacter str) Which Returns Integer32 Does
  44     Integer32 length : = 0;
  45     While ValueAt(str + length) Loop
  46         length += 1;
  47     EndWhile
  48     Return length;
  49 EndFunction
  50 
  51 Function strcpy(PointerToCharacter dest,
  52                 PointerToCharacter src) Which Returns Nothing Does
  53     While ValueAt(src) Loop
  54         ValueAt(dest) := ValueAt(src);
  55         dest          += 1;
  56         src           += 1;
  57     EndWhile
  58     ValueAt(dest) : = 0;
  59 EndFunction
  60 
  61 Function strcat(PointerToCharacter dest,
  62                 PointerToCharacter src) Which Returns Nothing Does
  63     strcpy(dest + strlen(dest), src);
  64 EndFunction
  65 
  66 Function strcmp(PointerToCharacter first, PointerToCharacter second)
  67          Which Returns Integer32 Does
  68     While ValueAt(first) = ValueAt(second) and not(ValueAt(first) = 0) Loop
  69         first += 1;
  70         second += 1;
  71     EndWhile
  72     If ValueAt(first) < ValueAt(second) Then Return -1; EndIf
  73     If ValueAt(first) > ValueAt(second) Then Return 1; EndIf
  74     Return 0;
  75 EndFunction
  76 
  77 Function toUpperCase(Character chr) Which Returns Character Does 
  78     Return 'a' <= chr <= 'z' ? chr - ('a' - 'A') : chr;
  79 EndFunction
  80 
  81 Function solve() Which Returns Integer32 Does
  82     debugPrint[0] := 0;
  83     strcat(AddressOf(debugPrint[0]), "strcmp(\"MMXXIV\",\"MMX\")+5 is equal to: ");
  84     Character testArray[2] := {strcmp("MMXXIV","MMX")+'5', 0};
  85     strcat(AddressOf(debugPrint[0]), AddressOf(testArray[0]));
  86     printString(AddressOf(debugPrint[0]));
  87     Integer32 i := 0;
  88     While i < getLengthOfTheInput() Loop
  89         input[i] := toUpperCase(getCharacterAtIndex(i));
  90         i += 1;
  91     EndWhile
  92     input[i] := 0;
  93     debugPrint[0] := 0;
  94     strcat(AddressOf(debugPrint[0]),"The input is: ");
  95     strcat(AddressOf(debugPrint[0]),AddressOf(input[0]));
  96     printString(AddressOf(debugPrint[0]));
  97     i := 0;
  98     result[0] := 0;
  99     While not(strcmp(AddressOf(result[0]), AddressOf(input[0])) = 0) and i < 4_000 Loop
 100         i += 1;
 101         convertToRomanNumerals(i);
 102         printString(AddressOf(input[0]));
 103         printString(AddressOf(result[0]));
 104     EndWhile
 105     Return i;
 106 EndFunction
 107 
 108