program EOEC_User;

uses
    Crc, Crt, Ernst;

var
    UserName : string;
    Users    : text;
    RegReport: text;
    Buffer   : string;
    Count    : byte;

(* ---------------------------------------------------------------------- *)
function ValToChar(Valor: LongInt): string;
begin
    ValToChar := Chr(Valor+65);
end;

(* ---------------------------------------------------------------------- *)
function TrimVal4(w : Word) : String;
         {Ajusta um n£mero para duas casas, colocando zero na frente, se
         necess rio.  Retorna o resultado numa string}

var
  s : String;

begin

    Str(w:0,s);
    if length(s) < 4 then s := '0' + s;
    if length(s) < 4 then s := '0' + s;
    if length(s) < 4 then s := '0' + s;
    if length(s) < 4 then s := '0' + s;
    TrimVal4 := s;

end;

(* ---------------------------------------------------------------------- *)
function CopyInt(Valor:longint; Pos1, Len:byte) : longint;
var Valor1, Valor2 : longint;

     function DezA(X:byte) : longint;
     begin
         DezA := round(exp(ln(10)*X));
     end;

begin

    valor1 := (Valor div DezA(Pos1-Len));
    valor2 := (Valor div DezA(Pos1))*(DezA(Len));

    CopyInt := Valor1 - Valor2;

end;

(* ---------------------------------------------------------------------- *)
function Do63(Str1 : string): String;
var Need : byte;

begin

if length(str1) >= 63 then
    Do63 := copy(Str1, 1, 63)
else
begin
    Need := 63 - length(Str1);
    for Need := length(Str1)+1 to 63 do
        Str1 := Str1 + ' ';
    Do63 := Str1;
end;

end;


(* ---------------------------------------------------------------------- *)
function RegCode(UserName : string): string;
var UserCRC  : longint;
    RegCode1 : string[1];
    RegCode2 : string[4];
    RegCode3 : string[1];

begin

UserCRC := Abs(CRC32(Upper(UserName)));
RegCode1 := ValToChar(CopyInt(UserCRC,2,2) mod 25);
RegCode2 := TrimVal4(CopyInt(UserCRC,6,4));
RegCode3 := ValToChar(CopyInt(UserCRC,8,2) mod 25);

{ Composi‡„o do c¢digo de registro do usu rio de acordo com o CRC32:

               CRC32 = XXXXXXXXXX
                         À´ÀÄÂÙÀ´
                          ³  ³  ³
                          ³ÚÄÁ¿ÚÙ
  User Register Code =    @NNNN@

                   @ = chr(XX mod 25)
                NNNN = XXXX                     }


RegCode := RegCode1+RegCode2+RegCode3;

end;


(* ====================================================================== *)
begin

writeln('EOEC Registration Code Report Generator v1.0 (EOEC v1.5)');
writeln;

assign(Users, 'C:\EOEC\USERS.DAT');
assign(RegReport, 'C:\EOEC\EOECREG.DAT');
reset(Users);
rewrite(RegReport);

for Count := 1 to 6 do
begin
    readln(Users, Buffer);
    writeln(RegReport, Buffer);
end;

while not Eof(Users) do
begin
      readln(Users, Buffer);
      if (Buffer[26] <> ' ') and (Buffer[26] <> 'Ä') then
      begin
          UserName := RTrim(copy(Buffer, 26, 26));
          writeln(RegReport, Do63(copy(Buffer, 17, length(Buffer)-16))+'³ '+RegCode(UserName));
      end;
end;

close(Users);
close(RegReport);

end.
