Ando retocando el karaoke y me he encontrado que las rutinas de determinación del charset de los ficheros no funcionan como deberían. Me explico:
El tema es que cada vez que le pido que determine el charset de un fichero de texto, la rutina debería leer los nombres de todos los ficheros del directorio "charset_finder", abrirlos y buscar los caracteres en ellos contenidos (que estarán codificados con la codificación que da nombre al fichero) dentro del fichero cuyo charset le he pedido que determine.
Pues resulta que sólo recorre el directorio charset_finder la primera vez. El resto de veces salta directamente al charset por defecto cuando ninguno coincide (es como si no viera los ficheros).
Adjunto parte del código en forma probable. El fichero de prueba es "tonto.prg", el resto los adjunto para comprobar la funcionalidad.
Si alguien me puede echar una mano, se lo agradecería.
PD: He renombrado el adjunto de ".tar.gz" a ".zip" para poder adjuntarlo. Depende de lo listo que sea el descompresor que useis, quizás haya que renombrarlo...
PD2: Estoy con la última versión de Bennu liberada.
disculpame, esta vez no voy a poder ayudar, estoy un poco complicado por los proximos 2 meses con proyectos personales...
Ok, no te preocupes. Ánimo con esos proyectos.
Si alguien más me puede echar una mano, lo agradecería.
Bueno, por si alguien le quiere echar un ojo, aquí va un ejemplo mucho más simple que supongo que debería funcionar distinto de como lo hace:
[code language="bennu"]import "mod_say";
import "mod_dir";
Function main()
Begin
while(glob("/*") != "")
if(fileinfo.directory == TRUE && fileinfo.name != "." && fileinfo.name != "..")
say(fileinfo.name);
end;
end;
say("Done finding dirs");
FRAME(0); // Need to frame, to restart the glob file search
while(glob("/*") != "")
if(fileinfo.directory == TRUE && fileinfo.name != "." && fileinfo.name != "..")
say(fileinfo.name);
end;
end;
say("Done finding dirs");
End;[/code]
Y la salida es:
[code language="bash"]joseba@rescubuntu:bennugd-karaoke$ bgdi tonto
home
sys
mnt
var
srv
cdrom
root
tmp
usr
proc
sbin
dev
bin
lib
lost+found
media
opt
selinux
etc
boot
Done finding dirs
Done finding dirs[/code]
Cuando entiendo que debería ser:
[code language="bash"]joseba@rescubuntu:bennugd-karaoke$ bgdi tonto
home
sys
mnt
var
srv
cdrom
root
tmp
usr
proc
sbin
dev
bin
lib
lost+found
media
opt
selinux
etc
boot
Done finding dirs
home
sys
mnt
var
srv
cdrom
root
tmp
usr
proc
sbin
dev
bin
lib
lost+found
media
opt
selinux
etc
boot
Done finding dirs[/code]
PD: lo he probado contra la última revisión del svn (104) que es más moderna que la última build oficial.
Doy fe. Hasta que sea arreglado el parche es hacer un glob a otro directorio y así seguro que reinicia el contador.
Gracias, Pixel, me estaba rayando...
Confirmo que el siguiente código sí funciona como debería:
[code language="bennu"]import "mod_say";
import "mod_dir";
Function main()
Begin
while(glob("/*") != "")
if(fileinfo.directory == TRUE && fileinfo.name != "." && fileinfo.name != "..")
say(fileinfo.name);
end;
end;
say("Done finding dirs");
glob("/tmp/*");
while(glob("/*") != "")
if(fileinfo.directory == TRUE && fileinfo.name != "." && fileinfo.name != "..")
say(fileinfo.name);
end;
end;
say("Done finding dirs");
End;[/code]
frame no reinicia el glob o si?
veo un frame(0) queriendo reiniciarlo... mmm
Según la página del wiki hace falta el FRAME.
http://wiki.bennugd.org/index.php?title=Glob
yo te suguiero usas las nuevas funciones diropen, dirread, dirclose... manejas aperturas como si fueran handles de archivos, con lo que podes abrir varias a la ves y no necesitas resetear...
¿No será que necesita un frame al 100%, o sea, FRAME o FRAME(100)?
No se, no lo he probado nunca.
@Drumpi: He probado cambiando los valores de FRAME y el asunto no mejora.
@Splinter: Le echaré un ojo a las funciones, gracias.
Hablé de esto con PiXeL hace un tiempo, no conocía la existencia de glob hasta entonces, y no he tenido ocasión de probarlo sorry.
Yo me quedé con la idea que dice Drumpi... Además tampoco conocía eso de FRAME(100) xD
no entendi para que el FRAME?
Según el wiki (sandman me ha confirmado en el foro inglés que con la revisión 27 esto funcionaba así) si haces un FRAME mientras estás haciendo un glob en un directorio, el glob se reinicia y te vuelve a dar los archivos desde el principio.
imposible... se equivoco... hay que corregir la wiki... frame nunca reseteo glob... ni siquiera en fenix...
Pues apúntalo como sugerencia en la próxima release ;D
Más que nada para estandarizar las funciones, como get_id, etc...
no, no deberia ser...
las getid y collision tienen relacion con los frame, ya que la vida y muerte de los procesos y graficos que estos usan la tienen... entonces es logico que se reseteen en cada frame, ya que el estado de los mismos cambia en cada frame... pero esto no debe ser asi, con glob, que nada de relacion tiene con los frames ni con los procesos ni con los graficos...
asi que el funcionamiento actual es el correcto.
por otro lado, la funcion glob es obsoleta... hay que usar las nuevas funciones que dan mas control...
Lo de listar el contenido del directorio es algo que valoré en mi visor 3D para poder seleccionar el fichero de los existentes... Al estilo del FPG Edit que programó Prg.
Leí los problemas de glob y prescindí de usarlo, ¿Qué alternativas hay, de qué librería son?
no hay problemas con la glob... hay que usarlo correctamente y eso significa resetear cuando se quiere releer la misma carpeta...
¿Leer otro directorio para resetear es entonces la solución? Lo pregunto por curiosidad más que nada.
disculpame, esta vez no voy a poder ayudar, estoy un poco complicado por los proximos 2 meses con proyectos personales...
No lo había leído, ánimo Splinter, sabremos esperarte con paciencia, dejas el foro en buenas manos, estamos hechos unos grandes "trolasos"
http://www.youtube.com/watch?v=sHbAYzG8IoE
Me llamo Iván xD
Menuda pedrada...
Quote from: SplinterGU on September 12, 2009, 08:47:12 PM
las getid y collision tienen relacion con los frame, ya que la vida y muerte de los procesos y graficos que estos usan la tienen... entonces es logico que se reseteen en cada frame, ya que el estado de los mismos cambia en cada frame...
Mmm... no se cambio que los SIGNAL tipo KILL (otros como SLEEP no sé) se aplicaran al instante??? antes de llegar al FRAME??? esto no afecta a esas que funciones que tienen relacion con los frames?
¿Las señales KILL ya no esperan al FRAME? No tenía conocimiento de eso, podría dar problemas para procesos que escriban algunos datos en fichero y puedan dejarse de escribir parte de ellos... Se podría arreglar con el ONEXIT pero... Es curioso cómo retorcemos los hilos y sacamos nuevos temas xD
Quote from: TYCO on September 13, 2009, 08:36:42 AM
Quote from: SplinterGU on September 12, 2009, 08:47:12 PM
las getid y collision tienen relacion con los frame, ya que la vida y muerte de los procesos y graficos que estos usan la tienen... entonces es logico que se reseteen en cada frame, ya que el estado de los mismos cambia en cada frame...
Mmm... no se cambio que los SIGNAL tipo KILL (otros como SLEEP no sé) se aplicaran al instante??? antes de llegar al FRAME??? esto no afecta a esas que funciones que tienen relacion con los frames?
No veo la relacion...
mientas vos en tu proceso, con collision y con getid no hagas un frame ningun proceso va a recibir ninguna señal... a menos que vos en tu mismo proceso lo hagas... y cuando haces un frame se resetea... sigo sin ver la relacion... no se a que vino el comentario...
Quote from: Windgate on September 13, 2009, 01:56:14 PM
¿Las señales KILL ya no esperan al FRAME? No tenía conocimiento de eso, podría dar problemas para procesos que escriban algunos datos en fichero y puedan dejarse de escribir parte de ellos... Se podría arreglar con el ONEXIT pero... Es curioso cómo retorcemos los hilos y sacamos nuevos temas xD
eso hace siglos no es asi... desde fenix que son instantaneas...
Quote from: Windgate on September 13, 2009, 12:11:56 AM
No lo había leído, ánimo Splinter, sabremos esperarte con paciencia, dejas el foro en buenas manos, estamos hechos unos grandes "trolasos"
http://www.youtube.com/watch?v=sHbAYzG8IoE
Me llamo Iván xD
Tremendo!! :D