procedure VerTipoArchivo(archivo: string; var Formato: TLineEnd; var Codificacion: string);
(*Obtiene el tipo de delimitador de línea (Line Ending) de un archivo de texto, explorando
los primeros bytes de archivo. Solo explora los primeros 8K del archivo.
Si no encuentra un salto de línea en ese tamaño, no podrá deetrminar de que tipo de
archivo se trata. También explora el posible tipo de codificación usado.
*)
const TAM_BOL = 8192;
var ar: file;
bolsa : Array[0..TAM_BOL] of char; //deja un byte más para el delimitador
Pbolsa: PChar; //variable Pchar para "bolsa"
Pos13: Word; //posición de caracter #13
Pos10: Word; //posición de caracter #10
Leidos: Word; //bytes leidos
begin
//Lee bloque de datos
AssignFile(ar,archivo);
reset(ar,1); { TODO : Dio error al abrir un archivo de solo lectura }
BlockRead(ar, bolsa{%H-}, TAM_BOL, Leidos{%H-}); //Lectura masiva
CloseFile(ar);
bolsa[Leidos] := #0; //agrega delimitador
Pbolsa := @bolsa; //cadena PChar
//Explora en busca de delimitadores de línea
Pos13 := Pos(#13, Pbolsa);
Pos10 := Pos(#10, Pbolsa);
if Pos13 = 0 then
//solo hay separador #10 o ninguno
if Pos10<>0 then
Formato := TAR_UNIX //solo hay #10
else
Formato := TAR_DESC //no se encontró separador
else if Pos10 = 0 then
//solo hay separador #13 o ninguno
if Pos13 <> 0 then
Formato := TAR_MAC //solo hay #13
else
Formato := TAR_DESC //no se encontró separador
else if Pos10 = Pos13 + 1 then
Formato := TAR_DOS //no se encontró #13#10
else
Formato := TAR_DESC; //no se reconoce delimitadores
//Analiza codifiación
Codificacion := GuessEncoding(Pbolsa); //analiza los primeros bytes
end;