
Modificaciones introducidas por Francisco Gracia a la versin 4.2.7 de Winboard.


- Todas las introducidas en la versin 4.2.6.

- Modificacin del men principal, redistribuyendo su contenido de manera ms lgica e incluyendo explcitamente algunas posibilidades implcitas. As he sacado al men la opcin de depuracin, porque el modo de activacin que indica la ayuda, con Ctrl+Alt+F12, es interceptado en mi ordenador por el sistema y lo que origina es el apagado de la pantalla. Tambin he sacado a primer plano la activacin o no de que se vean las consideraciones que est haciendo el programa de ajedrez, cuando lo haya. Las alternativas relacionadas puramente con la presentacin del conjunto las he independizado en una opcin principal 'Ver'. He cambiado el orden de las opciones relativas a la realizacin de jugadas (Step) y de las correspondientes a la totalidad de la partida ('Action'). 
	Inicialmente la tarea pareci sencilla, pues bastaba con hacer las modificaciones en el editor de MSVC, que las aceptaba. Pero al compilar resultaba que haba cosas que no se modificaban, como algunos nombres y la desactivacin de algunas opciones. Una investigacin ms a fondo ha puesto de manifiesto que hay que hacer modificaciones tambin en 'winboard.c' y en 'winboard. h'. Probablemente por razn de compatibilidad, la estructura del men principal se define en winboard.c, siendo necesario introducir aqu tambin las modificaciones.
//
/*
#define MENU_BAR_ITEMS 6

char *menuBarText[2][MENU_BAR_ITEMS+1] = {
  { "&File", "&Mode", "&Action", "&Step", "&Options", "&Help", NULL },
  { "&F", "&M", "&A", "&S", "&O", "&H", NULL },
};
*/

#define MENU_BAR_ITEMS 7

char * menuBarText[2][MENU_BAR_ITEMS+1] = {
  { "&Archivo", "&Modo", "&Jugada", "A&ccin", "&Ver", "&Opciones", "Ay&uda", NULL },
  { "&A", "&M", "&J", "&c", "&V", "&O", "&u", NULL },
};

//

El resultado de ello es que las opciones principales no tienen asignado identificador, por lo que para actuar sobre ellas hay que conocer su posicin. En los casos que interesan esto se hace en winboard.h:

/* Positions of some menu items.  Origin is zero and separator lines count. */
/* It's gross that these are needed. */
//#define ACTION_POS 2	 /* Posn of "Action" on menu bar */
//#define OPTIONS_POS 4	 /* Posn of "Options" on menu bar */
//#define ICS_POS 4 	 /* Posn of "ICS " on Options menu */
//#define SOUNDS_POS 6     /* Posn of "Sounds" on Options menu */
/* end grossness */

//	Cambios introducidos por FG en el men principal
// Se empieza a contar las posiciones desde 0
#define ACTION_POS 3	 /* Posn of "Action" on menu bar */
#define OPTIONS_POS 5	 /* Posn of "Options" on menu bar */
#define ICS_POS 2 	 /* Posn of "ICS " on Options menu */
#define SOUNDS_POS 4     /* Posn of "Sounds" on Options menu */
//
 

- Traduccin completa al espaol. Se han aadido muchas sartas que haban quedado pendientes y adems se han traducido los recursos de Windows. Ahora hay en total 240 sartas traducidas, ms todas las de los recursos de Windows, que son bastantes.

	La compilacin present algunos problemas, pero pocos en proporcin con todas las manipulaciones realizadas. Esta fase queda fundamentalmente concluida el 9 de marzo de 2004.


10 de marzo de 2004

Hoy he continuado refinando cosas. La presentacin u ocultacin de las cogitaciones del programa (Show thinking) desde el men funciona ya perfectamente (?). He pulido muchos trminos del men principal de mi primera traduccin, tras entender a lo que se referan leyendo la ayuda.

El recuadro inicial de Winboard es muy antiptico. Ms an porque la especificacin del programa de ajedrez que se quiere que juegue en las lneas de entrada correspondientes es arcana, ya que no consiste en la indicacin normal del nombre del fichero ejecutable con su ruta desde la raz (como sera 'C:/Archivos de programa/Crafty/Crafty19_3.exe'), sino que tiene que estar dividida en dos partes: primero se indica el nombre del fichero (sin necesidad de utilizar la extensin '.exe'), luego se inserta el cdigo "/fd" o "/sd", segn que se trate de la ruta del directorio en que se encuentren el primer o el segundo programas, detallndose a continuacin y finalmente la ruta entre comillas (la forma correspondiente al caso anterior sera: 'Crafty19_3 /sd "C:/Archivos de programa/Crafty/"', especificado como segundo programa y en su lnea correspondiente).

Para aliviarlo se me ha ocurrido insertar en el recuadro un botn estndar de Windows 'Examinar...', que permita buscar grficamente los ficheros. He copiado el botn de este tipo que tiene el recuadro de dilogo de las opciones de salvaguardia, incluyendo su identificador como un caso ms en la funcin StartUpDialog(), que maneja sus mensajes. No se responde a la pulsacin ms que si ya est marcado el punto que indica que se quieren usar programas de ajedrez con Winboard. La apertura del recuadro de seleccin se hace perfectamente y sin problemas. Ms retorcida ha sido la utilizacin de los resultados de la seleccin. Por lo pronto no se me ha ocurrido todava una forma de poder utilizar el mismo botn para los dos programas. Lo he intentado consiguiendo la referencia de la primera lnea, viendo si estaba enfocada y mandndole a ella los datos en tal caso y a la segunda en el contrario. Pero resulta que, cuando se hace la comprobacin, el elemento que est enfocado es naturalmente el propio botn 'Examinar...', por lo que no puede hacerse as. De momento he colocado dos botones, uno para cada lnea, una vez comprobado que el primero era de una gran comodidad de uso. Y como el resultado del proceso de seleccin es una ruta completa, como la del primer ejemplo, he escrito una nueva funcin 'TrocearRuta()', que recibe la ruta completa y la devuelve recompuesta en la forma requerida.


11 de marzo de 2004

La facilidad de especificar la ubicacin de los programas de ajedrez me ha hecho intentar unas pruebas enfrentando a dos de ellos... momento en el que he descubierto que haba un problema serio: todo funcionaba normalmente en apariencia; el tablero se presentaba, el nombre de los programas apareca en la barra superior y los relojes se ponan en marcha, pero el tiempo pasaba y no se ejecutaba ninguna jugada; tampoco apareca ningn resultado de la actividad de los programas en la lnea contigua al tablero por encima. El teclado y el ratn no producan ningn efecto, salvo para cerrar el programa. Ulteriores comprobaciones han demostrado que el problema afectaba ya a la ltima versin 4.2.6G, mientras que los originales ingleses no lo padecan. Era pues claro que tena que ver con el proceso de traduccin.

	Tras una paciente depuracin, he encontrado la causa: la traduccin indebida de dos pares de sartas ("first" y "second", "white" y "black") en InitBackEnd1() de backend.c. La traduccin es indebida porque en diversos lugares del programa se utilizan los trminos ingleses como discriminante (p. ej., 'if (first.twoMachinesColor[0] == 'w')' en TwoMachinesEvent() y en muchas otras funciones del mismo fichero). Por tanto he terminado tropezando con el temido problema de traducir sartas que no deben traducirse, aunque ahora hay que esperar que aparezca en algn otro lado el problema inverso, por utilizarse estas sartas en algn texto dirigido a personas y no a mquinas (por qu si no utilizar sartas literales, en vez de valores numricos o valores de verdad y por qu poner un cdigo de nueva lnea al final de 'blancas' y de 'negras'?). Adems en el mismo fichero se definen 'first' y 'second' como variables del tipo ChessProgramState, lo que ya dio problemas en una primera asignacin de las sartas a variables del mismo nombre (first[] = "first"), problemas oscuros reflejados en las arcanas quejas del compilador. Durante la excavacin he descubierto dos flecos sueltos del cdigo original, aunque no parece que hayan dado problemas hasta ahora: 1) cuando juega un solo programa, aunque el men tiene marcada la opcin "El programa juega negras", la variable gameMode no tena el valor 2, que corresponde a este estado, sino 0, que es BeginningOfGame; lo he resuelto aadiendo la asignacin explcita del valor correcto en 'InitChessProgram(cps)' de backend.c. 2) La razn del anterior descuido probablemente se encuentre en que la diferencia de modos no tenga demasiada importancia, pues en 'TwoMachinesEvent()' del propio backend.c se los considera a casi todos como equivalentes al juego manual. He insertado un 'break;' despus de MachinePlaysWhite y MachinePlaysBlack para que por lo menos a stos no se los considere as. Pero puede que esta insercin sea precipitada. [Efectivamente lo era: si se recuperaba una partida con un programa de ajedrez activo, el conjunto se pona, segn las marcas del men Modo, en situacin de 'Edicin de circunstancias' (?, no s por qu razn) y las teclas de flecha estaban muertas y no provocaban la repeticin de las jugadas. He revocado estas dos modificaciones y todo vuelve a funcionar como antes; Winboard est entonces, segn las marcas del men principal, en 'Pausa'. 14 de marzo de 2004.]

	Tambin ha quedado resuelta mi duda de qu sera lo que aparecera en la lnea informativa superior en el caso de actuacin de dos programas: si se hace jugar a Crafty contra s mismo aade una W o una B tras el corchete de cierre de la hondura de anlisis. Y aparece otro problema de traduccin, puesto que en la versin espaola tambin esta 'B' es traducida a 'A', como est mandado. El problema se complica adems porque cada programa har cosas distintas en esta situacin, por lo que ser muy difcil encontrarle una solucin satisfactoria.

	Afortunadamente este ltimo problema ha sido relativamente fcil de resolver, pues estos datos no provienen del programa, sino que los aporta el propio Winboard al final de la inmensa funcin 'HandleMachineMove(message, cps)' de backend.c. Pero aunque inicialmente realic all los remiendos correspondientes para que el resultado traducido fuese correcto, sin necesidad de modificar TranslateMoveList(), mis pretensiones se han visto frustradas porque la lista entera se somete luego al proceso de traduccin, volviendo a trabucarse las letras. Por tanto le he metido mano a TranslateMoveList() para que traduzca tambin las iniciales del bando de forma correcta y para todos los posibles idiomas (cosa que la primera solucin no haca). Le he pegado un buen repaso, que yo creo que la har funcionar casi tan rpidamente como la versin anterior, a pesar de hacer ms cosas. Y adems le he quitado el tercer argumento que inicialmente tena, la referencia a la sarta de caracteres locales, pues es una variable global a la que puede accederse desde todas partes sin cuidados especiales.

	De todos modos, tengo que encontrar todava la causa de que a veces aparezca "{White mates}" al final de una partida, a pesar de mis esfuerzos por que la traduccin fuese exhaustiva.


12 de marzo de 2004

	Continuando con las 'racionalizaciones' he modificado la disposicin del recuadro de entrada, colocando en primer lugar la alternativa del juego manual y desplazando las otras dos hacia abajo. Adems he hecho que inicialmente est marcado el botn correspondiente, de modo que baste con pulsar la tecla Entrar para que todo contine.

	He resuelto el problema de las sartas intraducidas de final de partida por medio de varios remiendos a HandleMachineMove(), en el apartado rotulado '* look for win, lose, draw, or draw offer'. Sera deseable simplificar esta funcin, pero sin duda debe ser difcil, dadas las diferencias que existirn en la salida de los diferentes programas de ajedrez. No es imposible por ello que de vez en cuando vuelvan a aparecer sartas sin traducir.


14 de marzo de 2004

Ayer me puse a completar mi remiendo a la recuperacin correcta de posiciones, que inicialmente no manejaba una notacin distinta de las posiciones de ajedrez distinta de la FEN, usada aparentemente por los Xboards iniciales y que en la fuente se designa como 'old style'. Tras saber en qu consista (es una representacin diagramtica del tablero al comienzo de ocho lneas sucesivas, con los escaques vacos representados por puntos), lo he resuelto y ya de paso he adoptado la forma ms general posible, de modo que ahora lee 141 posiciones en 'Oldpos.wds', 126 originarias en un formato diagramtico parecido, pero no idntico, al de Xboard, ms las 15 transcripciones FEN aadidas por m posteriormente. Todos estas notaciones se leen correctamente en cualquier posicin que ocupen en el archivo, con la excepcin de que deben encontrarse al comienzo de una lnea, salvo en el caso de la notacin 'estilo 12', que no saba que existiera hasta hace unos das y que tambin he incorporado. Como en este caso hay un marcador inicial, la sarta descriptiva puede comenzar en cualquier punto de la lnea.

Un punto difcil es el de determinar el bando al que le toca mover en la posicin concreta. Como lo predominante es que muevan las blancas, esta es la alternativa que se establece por defecto, ya que su extraccin de los datos originales es bastante problemtica, dada la variabilidad de maneras de representar este aspecto y hasta su posible ausencia. Los algoritmos interpretan la primera letra que sigue a la sarta posicional (sea en la misma lnea o en la siguiente) como indicadora del color, interpretndose 'b' como turno para las negras y cualquier otra cosa como turno para las blancas. 

Como el tratamiento de todos los dems estilos pasa por su conversin a una sarta FEN, no sera difcil ofrecer al usuario la nueva posibilidad de guardar en otro fichero la conversin realizada.

He modificato tambin 'char * GameListLine(number, gameInfo)' de gamelist.c para que la informacin presentada por la lista de partidas sea ms presentable de lo que era antes.


15 de marzo de 2004

He introducido una variacin en las comprobaciones realizadas por OKToStartUserMove() para que informe de que no se responde a las pulsaciones del ratn sobre las piezas porque la partida ha terminado, cuando se ha llegado a una posicin de mate, aunque sea en el modo de juego manual, pues resultaba un poco desconcertante tal congelacin sin aparente explicacin. No estn resueltos con ello todos los casos en que esto pasa y puede que no sea fcil hacerlo, dada la multiplicidad de estados en que puede encontrarse el programa y la indefinicin de lo que cada uno de sus Modos signifique exactamente: el modo EndOfGame, por ejemplo, aunque se le tiene en cuenta en muchos rastreos con 'switch', no se asigna ms que una vez en todo el programa, en la funcin GameEnds(), en la forma 'nextGameMode = EndOfGame', lo que se hace en el caso de encontrarse en algunos de los otros modos (entrenamiento, las situaciones en que juegan programas de ajedrez?). No s por tanto lo que significa, pero puede que sea el modo que congela cualquier continuacin.
 

17 de marzo de 2004

He terminado de organizar la posibilidad de disponer de una lista de las jugadas de la partida. He utilizado como base el contenido del fichero 'whistory.c' de Wilkin Ng. A pesar de ello me ha dado bastante guerra, pues no hay grandes comentarios del propsito de las funciones ni de la utilidad de las estructuras de datos, aparte de que era una cosa hecha de modo muy precipitado, con gazapos e insuficiencias, y explicada muy confusamente. He reconstruido el recuadro de presentacin (en el que l pona botones de mando, con fines que no he logrado entender) y he logrado que se vea bien la sucesin de jugadas de la partida.

Me ha costado hacer que se viesen los datos si se abra el recuadro con la partida ya empezada en modo manual. He pensado mucho rato que era un defecto de  actualizacin puramente visual, pero todos los esfuerzos por resolverlo por esta va han sido infructuosos, hasta que me he dado cuenta de que si no se mostraba nada era porque no haba nada que mostrar, es decir, no se haba montado la lista de la partida al ponerse en marcha el recuadro. Esto ya se hace ahora en 'case WM_INITDIALOG:' de 'HistoryDialogProc()' de whistory.c, con lo que todo funciona como debe ser. Se han aadido tambin llamadas a la puesta a cero de la lista en los casos de carga de nuevas posiciones o partidas desde un fichero y cuando se decreta un comienzo de partida.
Tambin he hecho las modificaciones necesarias para que se salven los valores requeridos en el fichero de ajustes, de modo que se reproduzca la situacin que tena esta alternativa al finalizar la ltima partida.

Para que la lista se vea bien tabulada es imprescindible utilizar una letra monoespaciada, siendo Courier la nica que conozco. Lograr que el recuadro de dilogo se adaptase a mis deseos me ha dado tambin mucha guerra, pues pasan cosas realmente inconcebibles, como que el editor de recursos de Windows cree un recurso de dilogo con la propiedad 'Visible' desmarcada, con lo cual al ejecutarlo ingenuamente no se ve nada, o lo arcano que es conseguir que el marco y la vista se acoplen y aumenten o disminuyan coordinadamente (es decir, que el marco funcione exclusivamente como un reborde fijo de la vista). Otra fuente de prdida de tiempo han sido las puetas de C. El intento de llamar a 'InitHistory()' desde los lugares requeridos de backend.c me ha dado muchos quebraderos de cabeza por los mensajes crpticos proporcionados por el compilador y el montador. Al final he descubierto que la causa era que, por alguna razn, el famoso Wilkin ha caracterizado a casi todos los datos y funciones de whistory.c como 'static', lo que los hace invisibles fuera del archivo en el que se encuentran. Pero bueno, la verdad es que as es como se aprenden cosas y yo lo estoy haciendo.

He vuelto a modificar la estructura del men principal, aadindole una nueva opcin 'Edicin', obligada en el ambiente de Windows y que en Winboard tambin tiene mucho sentido, a donde he reconducido las alternativas de copiar y pegar partidas y posiciones, aadir y modificar comentarios y circunstancias y la composicin del tablero.


24 de marzo de 2004

Creo haber acabado las adiciones de 1) la caja de jugadas y 2) una nueva posibilidad de guardar en un fichero las posiciones albergadas en otro y que no utilicen la notacin FEN, previa su conversin. Lo que en ambos casos me ha dado bastante guerra ha sido la elaboracin y el correcto funcionamiento de las cajas de dilogo, en el primer caso hasta que he aprendido a gestionar la lista de sartas indicativas de las jugadas y en el segundo la presentacin y manejo de datos y botones de seleccin. Tras muchas pruebas, repeticiones y frustraciones creo que ahora funcionan casi por completo como yo quiero. De todos modos no he logrado recuperar dos rasgos de la lista de jugadas que se perdieron en alguna fase del desarrollo sin que sepa por qu: 1) en el funcionamiento real la caja no presenta la barra de desplazamiento vertical, cuando procedera, a pesar de estar especificada en el editor de recursos y de aparecer en l cuando se prueba; 2) el recuadro no se cierra pulsando el botn correspondiente con el aspa; he tenido que reproducir la funcionalidad en el bucle de tratamiento de los mensajes del recuadro.

La verdadera dificultad es encontrar informacin adecuada sobre lo que uno pretende. Ni la del CD ni los libros que tengo permiten aclarar las dudas con certeza y una cierta rapidez. Adems de eso el editor de recursos tiene muchos fallos, habiendo tenido que corregir algunas cosas abriendo a mano los archivos de texto 'winboard.rc' y 'resource.h' (p. ej. la asignacin de algunos identificativos o la especificacin del idioma de los recursos, que no sirve inicialmente para nada). Adems los 'estilos' de los diferentes controles que se incorporan a estas cajas tienen influjos recprocos y poco evidentes que dan al traste con su funcionamiento esperado: p. ej. en el caso de los 'botones de radio', el orden numrico de sus identificadores es importante, as como que la propiedad 'group' no est activada ms que en el primero de ellos. Yo creo que los problemas de la caja de jugadas se deben a la necesidad que ha habido de interceptar pulsaciones directas del teclado o del ratn (dobles clic, seleccin de una lnea y luego pulsacin de Intro) por medio de 'want keyboard input', que perturban el funcionamiento de los tratamientos predeterminados del sistema. Este pilago puede sortearse con los valores retornados por las diversas secciones de la funcin que procesa los mensajes, pero aqu se alcanza el colmo de la confusin cuando se intenta saber si en una circunstancia determinada tiene que devolverse FALSE, TRUE o cualquier otro valor moldeado a BOOLEAN, como sucede al intentar manejar las lneas de la lista de jugadas.

De todos modos la ventana de jugadas manifiesta un perfecto sincronismo con la apariencia del tablero, de modo que el realce del listado se desplaza en respuesta a la repeticin de jugadas en el tablero mediante las teclas de flecha, al tiempo que la posicin del tablero se corresponde con la de la ltima jugada contenida en la lnea sobre la que se pulsa dos veces con el botn izquierdo del ratn o se selecciona con una pulsacin y la posterior de la tecla Intro. Las posiciones recuperadas de los ficheros se cargan bien, tanto tengan la mano las blancas como las negras (lo que me ha dado bastante guerra el conseguir), y cuando se produce un truncamiento en el tablero la lista se adapta inmediatamente, ya sea la jugada blanca o negra y una recin hecha u otra muy alejada en la partida (aspectos todos estos que menciono porque en un momento u otro no han funcionado, y cuando se arreglaba uno se descompona el otro). Adems he hecho que se salven tambin los ajustes relativos a su visibilidad y posicin en el fichero correspondiente.

A pesar de las dificultades, o quiz precisamente por ellas, me estoy envalentonando y pretendiendo hacer cada vez ms cosas que no hace mucho me hubiesen parecido inverosmiles y que entran en el mbito de lo virtuoso. Aunque slo sea por cabezonera, parece que termino consiguiendo lo que me propongo o algo muy aproximado.

He metido algo de mano tambin en el procedimiento 'OpenFileDialog()', fundamentalmente para permitir la apertura en modo de sobrescritura y no solo de adicin al final, como nicamente estaba previsto inicialmente. Este es un paso previo a la salvaguardia de modificaciones de posiciones y partidas en su lugar inicial en un fichero mltiple.


26 de marzo de 2004

He incorporado una modificacin estilstica a la funcin 'PrintPosition()' para vadear un escollo que se presentaba con las versiones traducidas. Cuando se salvan partidas o posiciones en estilo antiguo, y cuando se salvan partidas en el actual, se registra, exclusivamente en el primer caso y anteponindolo a la lista de jugadas en el segundo, una representacin diagramtica del tablero inicial. Esta representacin incluye originalmente la sarta "White plays" o "Black plays" a continuacin de la ltima fila de escaques para indicar quin tiene el turno, aadiendo luego una ristra de guiones terminados por un corchete o por una llave de cierre en la misma lnea. El efecto esttico del resultado es penoso para las personas, pero adems, si se traducen las sartas a otros idiomas, resultar confuso para las mquinas y no cumplir la funcin por la que previsiblemente se mont este engendro, a saber, que a continuacin de la notacin del ltimo escaque y separadas de l por espacios o por el carcter o caracteres de nueva lnea se encuentren las letras "w" o "b" para indicar la mano de manera fcilmente interpretable por las rutinas de lectura, cosa que naturalmente es muy poco probable que suceda en las versiones traducidas.

Inicialmente se me ocurri anteponer la "w " o la "b " a la sarta traducida, pero luego he dado con una solucin que me parece mucho mejor, pues resuelve el problema esttico adems del funcional: la letra del turno que corresponda se incorpora al comienzo de la sarta de guiones, en sustitucin de los dos primeros, y esta sarta a su vez se sita inmediatamente despus de la ltima fila del tablero, con lo que la apariencia gana mucho, recuperndose la simetra con el inicio de la representacin del tablero, y por ltimo se aade la indicacin verbal del bando que tiene la mano, que ya puede traducirse sin ningn problema porque est dedicada exclusivamente a consumo humano.


28 de marzo de 2004

He incorporado otra modificacin adicional al que va pareciendo tapiz inacabable de la salvaguardia y recuperacin de partidas y posiciones. En este caso se trata de que originalmente Winboard grababa un diagrama del tablero inicial siempre que se guardaba una partida no empezada desde la posicin de salida; en el caso de la notacin antigua esto est bien, pues es la nica forma de indicar la posicin inicial, pero en el caso de la notacin PGN es generalment un incordio, sobre todo porque adems hay un gazapo (que todava no me he dedicado a eliminar) que aumenta el nmero de estos diagramas si una partida se salva varias veces en sucesin (como estas salvaguardias se aaden una a continuacin de otra, la primera tiene un diagrama, la segunda dos y as sucesivamente; esto me sucedi hace tiempo en una ocasin en que meta una partida, pero ahora no lo he podido reproducir guardando las jugadas sucesivas de una posicin recuperada de un fichero). He aadido a la caja de dilogo 'DLG_SaveOptions' una nueva casilla de verificacin que permite indicar si se quiere o no tal diagrama, desactivndola cuando se usa la notacin antigua por no ser aplicable. La nueva alternativa tambin queda registrada en 'Winboard.ini' y parece funcionar sin problemas.

Aclarado fundamentalmente el misterio de la no aparicin de la barra de desplazamiento en la caja de la lista de jugadas de una partida. La causa era que las instrucciones contenidas en 'case WM_INITDIALOG' de 'HistoryDialogProc' establecan sus propios condicionamientos y destruan los iniciales. He deshabilitado todo el bloque (aunque aparece en muchas otras cajas de dilogo, pero la verdad es que no entiendo lo que hace ni para qu sirve) puesto que en el presente caso la caja no tiene botones ni otros elementos que redimensionar ni situar. Pero las inconveniencias no estn completamente resueltas, pues no he encontrado el modo de hacer que la lista "se pegue" al marco de la caja, de tal modo que cuando se redimensione a sta suceda lo mismo con la otra: si se elige el estilo 'Resizing' el reborde exterior se desplaza, pero la lista no cambia de tamao. He dejado pues un tamao fijo, pero con la barra de desplazamiento funcionando y permitiendo ver la totalidad de la partida.

Tambin el misterio del directorio en que se inician las operaciones de recuperacin de partidas y posiciones est empezando a ser algo menos misterioso. La funcin de Winboard 'OpenFileDialog()' (en winboard.c) recurre para la parte dura del trabajo a la funcin de Windows32 'GetOpenFileName(&openFileName)', que es la que abre la caja de dilogo comn correspondiente y realiza todas las operaciones relacionadas. Esta funcin utiliza una estructura de tipo OPENFILENAME para organizarse y en la informacin de 'Windows Base Services: Platform SDK' se lee respecto de su componente 'lpstrInitialDir': 

	"Pointer to a string that specifies the initial file directory. 
	
Windows NT 5.0 and later; Windows 98 and later: 
	If lpstrInitalDir is NULL and the current directory contains any files of the specified 	filter types, the initial directory is the current directory. 
	If lpstrInitalDir is NULL and the current directory does not contain any files of the 	specified filter types, the initial directory is the personal files directory of the 	current user. To specify the current user's personal files directory as the initial 	directory, set lpstrInitialDir to the path returned by calling the 	HGetSpecialFolderLocation function with the CSIDL_PERSONAL flag. 
Earlier versions of Windows and Windows NT: 
	If lpstrInitalDir is NULL, the initial directory is the current directory."

Por tanto podra forzarse la apertura en un directorio concreto realizando las tareas previas de indagacin que permitan a OpenFilDialog() asignar a lpstrInitialDir la ruta deseada, tras haber modificado la propia rutina, pues ahora en ella se le asigna siempre el valor NULL, ya que no se dispone siquiera del argumento necesario para pasarle este parmetro.


15 de mayo de 2004

He empezado la traduccin del fichero de ayuda, hacindolo ms explcito y adaptndolo a las modificaciones introducidas por m en WinBoard 2.4.7. He traducido tambin algunas sartas que todava andaban descontroladas en los recuadros desplegables de insercin de piezas.

Me he propuesto llevar a sus ltimos lmites el propsito de que las opciones que no puedan o no deban utilizarse en una situacin dada aparezcan desactivadas en los mens. No se haca hasta ahora nada con las instrucciones para recorrer la lista de jugadas de una partida en uno y otro sentido. Es claro que cuando no se ha hecho ninguna jugada no tiene sentido su pulsacin, pero el hacerlo dio problemas al organizar la presentacin de la lista de jugadas, pues apareca el '1.' de la primera lnea si se pulsaba la tecla hacia la derecha sin haber hecho ninguna jugada, cosa que, sin ser gran defecto, me resultaba chapucero. En cuanto se hace la primera, en cambio, hay que activarlas todas, pues tanto la jugada siguiente como la anterior adquieren una realidad concreta, aunque esculida, lo mismo que les pasa a la primera y a la ltima. Llevarlo a la prctica ha requerido crear unas cuantas variables y estructuras ms (noMoveEnables, MoveEnables, walkingEnabled y gameTruncated). Esta ltima porque en las operaciones de reactivacin del desplazamiento he vuelto a tropezar con el problema del inicio de partida y de la primera jugada de las blancas y las negras (debido a la numeracin de las variables 'first', 'last' y 'current'), siendo necesario mayor rigor en la aplicacin de InitHistory(), ya que ella inhabilita los movimientos, por su propia esencia. He terminado localizando en punto donde se 'digiere' la realizacin de un movimiento de pieza ('case EditGame:' de 'OKToStartUserMove(x, y)' en Backend.c) y se realiza el truncamiento, al dar a 'forwardMostMove' el valor de 'currentMove'. Por tanto he levantando all el indicador del hecho (gameTruncated = TRUE) que permite a 'HistorySet()' limpiar o no la lista de jugadas previas y actualizarla a la nueva situacin. Tambin se levanta en la funcin 'TruncateGame()', que parece no utilizarse ms que en contextos de juego por correspondencia o a travs de Internet.

Todo funciona ahora satisfactoriamente con una codificacin ms limpia y austera. El juego se trunca limpiamente incluso en la primera jugada y la habilitacin e inhabilitacin de las opciones de Jugada se hace como es debido. Me queda la duda de si esforzarme por lograr que, si se introduce una jugada en situacin 'retrasada' de la partida, no se produzca el truncamiento si la jugada es idntica a la que haba originariamente. Ahora se trunca la lista aunque ste sea el caso. Tampoco parece cosa decisiva, pero creo que hacerlo le dara al programa la apariencia de ser un poco ms despierto. (Tras unas cuantas pruebas, la aplicacin de la idea resulta ms complicada de lo que parece, dada la gran cantidad de aspectos que intervienen en el decurso correcto de las cosas [rastrese para convencerse todo lo que sucede despus de analizada y aceptada la entrada de TypeInEvent(): UserMoveEvent()->FinishMove()->MakeMove()->ShowMove(), etc. y la gran cantidad de cosas que hay que hacer en UserMoveEvent() cuando el programa funciona como tutor (training mode) para que la comprobacin de los movimientos introducidos no perturbe la partida original ni el aspecto del tablero.]) Adems he descubierto que la introduccin de las jugadas sigue vias diversas segn provenga del teclado y de otros programas (datos algebraicos desde el origen) o del ratn, por lo que hay que duplicar el armado de la bandera 'gameTruncated' en TypeInEvent() y en OKToStartUserMove(). De hecho resultan candidatos todos los puntos del programa en los que se haga 'forwardMostMove = currentMove' (que es la actualizacin habitual del contador en condiciones de juego real) siendo 'lastMove > currentMove'. Pero no me he atrevido a hacerlo en las situaciones de juego vivo (con programas o con ICS) por ignorar cmo debera funcionar el programa en estos casos; por esta misma razn es probable que la presentacin de la lista de jugadas sea defectuosa en algunas de estas situaciones (sobre todo en los casos de truncamientos implcitos; el truncamiento explcito de TruncateGame() s levanta la bandera).

He hecho que en el modo de entrenamiento se oculte la lista de jugadas y se mantengan inactivas las posibilidades de desplazamiento por la partida, ya que de lo contrario se frustra la finalidad especfica de la alternativa. En el caso de la lista de jugadas, de todos modos, puede hacerse trampa y volverla a mostrar mediante 'Ver / Lista de jugadas', como recurso final para casos desesperados.


19 de mayo

He terminado por activar el truncamiento de la lista visible en todos los sitios en que 'forwardMostMove = currentMove', pues cuando se hacan retrocesos y cambios de una partida en el modo de anlisis, la actualizacin de la lista visible era errnea. Ahora parece arreglado. Esto me ha hecho pensar de nuevo en lo conveniente que sera aclarar conceptualmente el grupo 'modo' y los posibles valores que puede adoptar la variable 'programMode', pues resulta un poco abrumador el ver la cantidad de valores que contiene la enumeracin 'GameMode' de 'common.h', y las complejas relaciones de compatibilidad o exclusin que pueden imaginarse entre ellos.


27 de junio

He solucionado un problema de Winboard que haba credo derivaba de mis manipulaciones, pero que luego he comprobado que ya se produce con la versin 4.2.7 original.
Si se lanza Winboard con Crafty y a continuacin se activa el modo de Anlisis, aparece el correspondiente recuadro para mostrar los resultados de las cogitaciones del programa de ajedrez. Si se minimiza entonces la ventana principal, todos los recuadros secundarios desaparecen con ella, pero al poco rato reaparece solo el recuadro de anlisis, que contina mostrando las cavilaciones del programa de ajedrez. Pero en esta situacin no puede hacerse que la ventana principal recupere su tamao inicial; hay que terminar el anlisis, cerrando su ventana, para que pueda volver a maximizarse la ventana principal. Pero entonces aparece un recuadro fantasma, cuyo contenido permanece invariable y que no puede cerrarse (aunque se le puede reactivar volviendo a elegir el modo de anlisis). Esta secuencia se produce sin necesidad de haber empezado a jugar, pero igualmente en el transcurso de la partida.
Me he dado cuenta de que la causa del problema tena que estar en el hecho de que se hiciese reaparecer aisladamente el recuadro de anlisis, cuando el resto de la aplicacin est minimizado, pues entonces no le llegan a sta los mensajes reactivadores (aunque no entiendo por qu y esto tambin me parece un defecto; supongo que por la forma en que est escrita 'AnalysisDialog()' o algn otro manejador de mensajes), por lo que hay que salir del bucle mediante la nica orden que en ella se acepta, a saber, la de cambiar de modo, cerrando el anlisis. El recuadro que reaparece cuando al fin se puede recuperar el tablero es solo una imagen grfica remanente, pero que carece de toda funcionalidad, incluyendo que tampoco se la puede eliminar.
Lo he solucionado modificando 'AnalysisPopUp()', la funcin que se encarga de crear el recuadro y de actualizarlo, condicionando la presentacin del mismo en la pantalla al hecho de que la ventana principal no est minimizada, con lo que todo parece funcionar como es debido.
He enviado un informe al respecto al grupo de desarrollo.

He aadido el funcionamiento conmutador a la instruccin de modo 'anlisis', mediante un pequeos cambios en el apartado 'case IDM_AnalysisMode:' de 'WndProc()' en 'winboard.c'.


30 de junio de 2004

Elimino la opcin 'Analize file' del grupo 'Modo' del men principal; tiene el identificativo 'IDM_AnalizeFile' y ningn rasgo adicional marcado. Vanse mis crticas a ella en los comentarios al primer grupo de modificaciones.
En la seccin de codificacin lo que he hecho ha sido convertir en comentarios las partes correspondientes. No he eliminado el modo concreto en la enumeracin de los mismos ni cuando se hacen evaluaciones del mismo, que casi siempre son participadas por 'AnalyzeMode': lo nico que suceder es que nunca sern aplicables.


2 de julio de 2004

El ttulo del recuadro de modificacin de comentarios no presentaba las jugadas con los cdigos de pieza traducidos. Corregido aadiendo las instrucciones correspondientes en 'EditCommentEvent()' de 'backend.c'.
Cuando se iniciaba una partida nueva desde otra previa no desaparecan los recuadros de circunstancias y de comentarios de la primera, si es que inicialmente estaban abiertos, con lo que presentaban informacin inadecuada a la nueva situacin. Modificado aadiendo las instrucciones correspondientes a 'ResetGameEvent()' de 'backend.c'.


Julio de 2004

Me he decidido por fin a realizar la modificacin que permita modular la salvaguardia de partidas en disco. Para mayor claridad y comodidad he creado un nuevo fichero fuente, llamado 'wFGmodifications.c' en el que he agrupado tanto el procedimiento de conversin de posiciones a notacin FEN como esta nueva que ahora estoy aplicando.

No basta con aadir el nuevo fichero al proyecto para que las cosas funcionen como es debido, pues con eso solo no se compila ni enlaza. El proyecto 'winboard', tal como est, se encuentra gobernado exclusivamente por el fichero 'msvc.mak', que constituye el guin por el que se rige NMAKE (nmake.exe) para la ejecucin ordenada de las tareas de comprobacin, compilacin y enlazado. He intentado entender su estructura y convenciones en la ayuda de Windows, con resultado negativo. Por analoga con las entradas referentes a los otros ficheros fuente he logrado integrar este mo en el proceso, como ya haba hecho con 'whistory.c', insertando su nombre en los lugares donde estn los restantes o copiando los conjuntos de especificaciones correspondientes a cada uno de ellos. Pero no he logrado en cambio saber cmo producir la versin corriente (release), pues la que ahora se est generando es la de depuracin y tiene aproximadamente el doble del tamao necesario. Cambiando a 'Release' el 'setting' del proyecto (que ahora est en 'Debug') desde el men de Visual C++, lo nico que se consigue es obtener un gazapo oscuro, pues aparece el crptico mensaje 'Program cannot be executed.', o algo parecido, al intentar lanzar el ejecutable, sin ms posibilidades de aclaracin. Toda la dificultad estriba en que ahora lo est buscando en el directorio 'Release', en el que no se encuentra, puesto que NMAKE sigue haciendo las cosas igual que antes.

Como de 'msvc.mak' no logro entender siquiera las especificaciones que se dan tanto al compilador C (cl) como al enlazador (link), he copiado del recuadro de mensajes de salida del programa lo que aparece al reconstruir Winboard tras una modificacin a wFGmodifications.c, por si alguna vez pudiera servir de hilo conductor en las pesquisas:

	--------------------Configuration: winboard - Win32 Debug--------------------
	Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
	Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
	 cl -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -D_X86_=1 -D_WINNT -D_WIN32_WINNT=	0x0400 -D_WIN32_IE=0x0300 -DWINVER=0x0400 -DWIN32  -D_WIN32 -I. -I.. -DWINVER=0x0400 -Z7 	-Od wFGmodifications.c
	wFGmodifications.c
 	link -debug:full -debugtype:cv /NODEFAULTLIB /INCREMENTAL:NO /PDB:NONE /RELEASE /NOLOGO -	subsystem:windows,4.0 winboard.obj backend.obj parser.obj moves.obj lists.obj  	gamelist.obj pgntags.obj wedittags.obj wgamelist.obj zippy.obj  wsockerr.obj wcl
	ipbrd.obj woptions.obj whistory.obj  wFGmodifications.obj  wsock32.lib comctl32.lib 	winmm.lib libc.lib oldnames.lib kernel32.lib  advapi32.lib user32.lib gdi32.lib 	comdlg32.lib winspool.lib  ws2_32.lib  winboard.rbj -out:winboard.exe

	winboard.exe - 0 error(s), 0 warning(s)

Si alguna vez tengo tiempo y ganas, procurar desentraar este galimatas. Esto es lo ms claro que dice la ayuda de Windows al respecto:

	Build Settings for non-MFC Programs
		The build settings for a Win32 (non-MFC) program for Windows are almost the same as 		for MFC-based executables. In the following, projname is the name that is created 		based on the project name you supply. These are the default compiler options for 		new application projects:
	Debug
		/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 						"_WINDOWS" /Fp"Debug/projname.pch" /YX /Fo"Debug/" /Fd"Debug/" /c
	Release
		/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D 							"_WINDOWS" /Fp"Release/winapp.pch" /YX /Fo"Release/" /c 
	Linking
		The default link options and link libraries for a Win32 application are:
		kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib 			shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo 			/subsystem:windows 
	If you are using an external makefile, you can use the default build settings as a guide 	for the settings to use in your makefile.

	What do you want to know more about?
	What are the build settings for an MFC program? 	<_core_build_settings_for_an_mfc_exe_program.htm>

	What are the build settings for a Win32 DLL? <_core_build_settings_for_a_win32_dll.htm>

	What files are created for a new program? 	<_core_file_types_created_for_visual_c.2b2b_.projects.htm>


Las explicaciones ms detalladas y coherentes sobre el particular son las contenidas en P. Norton y P. Yao, Gua Peter Norton: Windows 3.1; tcnicas de programacin, Ariel, Barcelona, 1993, p. 37 y siguientes, aunque ya sea un poco antiguo (o precisamente por eso). No creo que esto haya cambiado mucho en los diez aos transcurridos.


17 de julio de 2004

Hoy he logrado compilar una versin 'limpia' de WinBoard. No ha sido por medio de profundizaciones tericas, sino copiando el fichero 'makefile' de la versin de D. Mehrmann, que es un poco ms explcito y est dispuesto para una versin de distribucin, y adaptndome a l. He hecho un fichero 'mak' para cada versin: el de la de depuracin se llama 'msvcD.mak' y el de la escueta 'msvcR.mak'. Ambos estn aadidos al proyecto y ahora se elige cmodamente una u otra actuacin en el recuadro 'Build / Set active configuration...', tras haber especificado en el espacio 'Build command line' del recuadro 'Project / Project settings...' la instrunccin 'nmake /f msvcD.mak' para la de depuracin y 'nmake /f msvcR.mak' para la escueta. Los ficheros objeto van ahora todos al directorio 'Winboard', aunque no s por qu. He descubierto que la especificacin de directorios se hace en 'Tools / Options / Directories', pero tampoco estoy muy seguro de lo que se consiga con ello.

Aunque 'parser.c' parece haberse compilado bien, siempre me da miedo, por lo que es mejor no tocar ninguno de los ficheros 'parser.c' y 'parser.l' y no borrar 'parser.obj', para evitar que haya de recompilarse. Tambin hay que evitar la orden 'Build / Rebuild all', que, como su nombre indica, intenta recompilarlos aun as. Es ms seguro utilizar el smbolo Build de dos flechitas de la barra de herramientas, correspondiente a la tecla  F7. En cambio la forma ms clara de determinar si un fichero '.obj' es de una u otra versin es borrarlo y recompilarlo a l solo, tras activar la variante deseada. Para mayor seguridad y futura referencia he copiado (a mano) los ficheros objeto de cada una en los dierectorios 'Winboard / Debug' y 'Winboard / Release'. Una comparacin individual muestra que los primeros tienen aproximadamente el doble de tamao que los segundos, con dos excepciones que todava no comprendo: 'pgntags.obj', que tiene el mismo tamao en ambos casos, y 'zippy.obj', que pesa casi el doble en la versin limpia! Los tamaos que yo obtengo as para el ejecutable final son de 980 kB para la versin esbelta y de 1508 kB para la pesada. Pero supongo que pueden aparecer todo tipo de tamaos intermedios, pues al parecer el enlazador vincula los ficheros objeto cualesquiera que sean, sin diferenciar entre los que tienen informacin de depuracin y los que no; todas las crpticas indicaciones del fichero MAKE parecen dirigirse exclusivamente al compilador. Por otra parte las bibliotecas del sistema tambin pueden presentar esta dualidad; las que se estn vinculando ahora a WinBoard estn purgadas de la informacin de depuracin.

Hoy he terminado tambin (segn creo) la modificacin referente a la salvaguardia de partidas. Todo funciona a mi entera satisfaccin, cosa que durante mucho tiempo he dudado que pudiese lograr, dadas las complicaciones que han ido apareciendo a la hora de realizar mis primeras ideas. El esquema del asunto es el siguiente:

Cuando una partida est relacionada con el disco, bien sea por haberse recuperado de l bien por haberse grabado ya en l una primera vez, y sufre alguna modificacin, ya sea en su lista de jugadas, en los comentarios o en las circunstancias, aparece un aviso en la pantalla cuando se intenta ejecutar alguna orden que implique el abandono de esta partida y su sustitucin por otra o el cierre del programa (partida nueva, anterior, siguiente, cargar o recargar partida, terminar y cerrar el programa) o el intento de grabarla de nuevo. En todos estos casos aparece un recuadro que informa de la situacin y permite elegir entre varias alternativas, a saber, cancelar la orden desencadenante, descartar las modificaciones o grabarlas y, en este ltimo caso, puede hacerse bien al final del mismo fichero en que ya est la imagen precedente, bien sustituyendo a sta, bien a continuacin suya o, en fin, en un nuevo fichero que se especifique. Si se elige conservar las modificaciones, se realiza la grabacin conforme a lo especificado y a continuacin se ejecuta la orden desencadenante de la interrupcin, salvo que esta orden fuese precisamente 'Salvar'. Lo mismo sucede si se descartan, salvo que en este caso no hay salvaguardia previa al disco. Si se elige 'Cancelacin' no se produce salvaguardia ni ejecucin de la orden.

Aunque inicialmente pens aplicar el mismo tratamiento al caso de las posiciones, luego he renunciado a la idea, ya que las posiciones, por su propia naturaleza instantnea y lo escueto de su reflejo en disco, no plantean ningn problema especial si siempre se graban al final del fichero, como en el WinBoard originario. En su caso es mucho ms cmodo, rpido, eficaz y claro utilizar desde el principio un procesador de textos en lugar de WinBoard para realizar los cambios y modificaciones, e incluso para las adiciones, como yo he hecho al transcribir el repertorio de Gil-Majem.

Para realizar dicho propsito se requiere:
	- detectar la relacin de la partida con el disco
	- detectar cualquier modificacin de la partida (jugadas, comentarios, circunstancias)
	- interceptar las instrucciones que puedan alterar la partida
	- presentacin de opciones y entrada de datos del usuario
	- realizacin la grabacin en un punto predeterminado del fichero
	- asegurar la continuidad del conjunto, de modo que puedan realizarse bien las 			operaciones subsiguientes, como si no hubiese pasado nada

La realizacin concreta se basa por completo en una estructura de datos especfica, llamada 'currentGame', definida en 'common.h' y creada en 'wFGmodifications.c'. Este ltimo fichero fuente contiene la parte fundamental del cdigo relacionado con esta modificacin. (Para mayor comodidad y claridad tambin he incorporado a l el referente a la conversin de notaciones ajedrecsticas.) 'currentGame' agrupa las informaciones esenciales referentes a la partida presente en la pantalla: si tiene reflejo en disco (miembro 'recorded'), en qu fichero se encuentra este reflejo (miembro 'inFile', que recoge la ruta completa), si difiere de l (miembro 'modified'), si el fichero est ya abierto ('opened', que contiene el puntero a su estructura FILE), cuntas partidas en total tiene el fichero ('totalNumber') y qu orden ocupa la actual en l ('serialNumber'), as como la distancia en byte a que se encuentran su inicio ('firstInsertionPoint') y su fin ('secondInsertionPoint') desde el origen del fichero. Hay tambin dos elementos para reflejar la eleccin del usuario: 'replace', que indica que se sustituya la versin previa, si tiene el valor TRUE, pero que se inserte a continuacin suya si es FALSE, y 'lastSelected', que permite recordar la ltima eleccin realizada, para predeteminar a ella las presentaciones subsiguientes del recuadro de eleccin. La estructura adquiere sus valores iniciales mediante la funcin 'InitCurrentGameData()'.

La deteccin de las modificaciones se hace mediante interpolaciones introducidas en 'backend.c' ('OKToStartUserMove()' y 'FinishMove()'), 'wedittags.c' ('EditTagsDialog()') y 'winboard.c' ('CommentDialog()' y 'TypeInMoveDialog()').

La intercepcin se realiza en 'winboard.c', en WndProc(), en relacin con el tratamiento de los mensajes WM_COMMAND (para las rdenes provenientes de Winboard) y WM_CLOSE (para el cierre de la ventana desde el aspa de la esquina). Como resultado de ella puede ponerse en marcha, si se cumplen todas las condiciones requeridas, el proceso 'ModifiedGameEvent()', contenido como todo el resto en 'wFGmodifications.c', que presenta el recuadro 'DLG_ModifiedGame' y lo maneja adecuadamente.

Para que la grabacin pudiese realizarse bien en la forma deseada era preciso conocer los puntos exactos de comienzo y de fin de la partida en el fichero. Dndole vueltas a cmo podra obtenerla, pens que algo parecido se necesita tambin a la hora de recuperar partidas de disco y, en efecto, la estructura 'ListGame' original (que es la ficha que utiliza la lista enlazada 'gameList' para cada partida del fichero, lista de la que a su vez se sirve 'LoadGame()' para el gobierno del proceso), definida en 'backend.h' y creada en 'gamelist.c', tiene un miembro para registrar el inicio de la partida ('offset'), pero le falta el dato del fin. Tambin descubr que este dato lo genera el analizador sintctico 'yylex()' mediante la instruccin 'yyoffset()' en 'GameListBuild()' de 'gamelist.c'. Caba la posibilidad de que tambin se generase el fin de partida, dado que la estructura 'ChessMove' de 'common.h', que enumera los tipos de 'jugada' posibles, cuenta entre ellos 'WhiteWins', 'GameUnfinished', etc. Modifiqu pues la definicin de 'ListGame', aadindole el miembro 'end', al que se da valor al final de 'GameListBuild()' mediante otra interpolacin. La cosa ha funcionado, aunque los valores asignados por el analizador sean un poco difusos: no cuenta consistentemente las lneas en blanco que pueda haber entre las partidas e incluso sospecho que el valor obtenido como comienzo de una partida es el mismo que el reflejado como fin de la precedente, lo que tiene como consecuencia que, si entre ambas hubiese texto no PGN, se pierde o se duplica, como he comprobado. Pero el mtodo es fundamentalmente vlido. (18/7/2004. La sospecha se ha confirmado: la modificacin no aporta nada esencialmente nuevo -- salvo quiz un poco de claridad -- pues el punto de demarcacin devuelto por 'yylex()' es nico, de modo que el punto final de una partida es idntico al de comienzo de la siguiente. As en 'Partidas contemporneas-pgn' los primeros valores eran:

	Partida		comienzo		fin
	   1			    71		2143
	   2			  2143		4114
	   3			  4114		6133
	   4			  6133		8223

En 'BoundedFileCopy()' he incorporado unas pruebas para evitar la prdida o la duplicacin de las lneas en blanco, pero respecto a otro tipo de texto nada puede hacerse de modo sencillo, siendo necesario fiarse de 'yylex()' y asumir las consecuencias.)

Una vez en posesin de estos datos, el proceso de grabacin se realiza del siguiente modo cuando es necesario reemplazar o insertar una partida en el fichero: se crea un fichero transitorio al que se enva la transcripcin de la partida actual, mediante el 'SaveGame()' ordinario. Se crea otro fichero transitorio y se copia a l la parte inicial inmodificada del fichero originario, si la hubiera. A continuacin se le copia el contenido del primer fichero transitorio y, por ltimo, la parte final inmodificada del fichero original, igualmente si la hubiera. Cuando se trata de reemplazar la partida original, se utiliza su inicio ('firstInsertionPoint')como punto de terminacin de la copia inicial, insertndose a continuacin la partida modificada y continuando luego la copia desde el final de la primera versin ('secondInsertionPoint'). Si se quiere aadir la segunda versin a continuacin de la primera, se usa el final de sta como punto de terminacin de la primera copia y de adicin del fichero transitorio, continuando luego el proceso del mismo modo hasta la terminacin del fichero original. Todo esto, y varias operaciones ms de intendencia y supervisin, lo realiza la funcin 'ReplaceInFile()', junto con otras dos pequeas funciones complementarias.

Para disponer de las fichas de una partida se requiere pues utilizar la lista de las mismas elaborada por 'GameListBuild()'. Pero exista el problema de que el WinBoard original no prevea ms que la existencia de una de estas listas, la mencionada 'gameList', utilizada por 'LoadGame()'. Si no se  quera, como no quera yo, alterar el status quo de una posible recuperacin en curso as como en el caso de que ni siquiera la hubiera, por tratarse de una partida grabada independientemente a un fichero (que poda contener otras partidas previas, siendo as mltiple), convena disponer de otra lista independiente para estos nuevos usos. No solo ha habido que crear esta nueva lista, llamada 'saveList' en 'gamelist,c', sino que ha habido que retocar varias de sus funciones, como 'GameListNewGame()' y 'GameListBuild()', para que pudieran tratar cualquier ejemplar de lista que se les presentase como parmetro, y no solamente la presupuesta 'gameList'.

Por ltimo ha habido que coordinar estas nuevas operaciones con las clsicas de recuperacin de partidas desde un fichero. Dado que 'LoadGame()' deja abierto el fichero fuente para posibles accesos posteriores, yo no estaba seguro de que se pudiese acceder a l para modificarlo ni de que se pudiese reponer la situacin anterior una vez finalizada la actualizacin. Como siempre, he tratado de solucionar mis dudas y miedos acudiendo a los libros. Todos repiten hasta la saciedad la misma informacin elemental: que 'fopen()' se usa para abrir o crear un fichero en tal y tal modo, etc. Ni uno solo dice explcitamente que un fichero se pueda o no abrir repetidamente ni cules sean las limitaciones de tales accesos. La escritura de 'ReplaceInFile()' me ha convertido en un experto en este campo: un fichero puede abrirse tantas veces como se quiera (dentro del lmite del mximo de ficheros que pueda manejar el sistema operativo) para ser ledo, pero no puede estar abierto previamente si ha de sufrir modificaciones (escritura, redenominacin, etc.). Esto implica que, si 'LoadGame()' tiene ya abierto el fichero en cuestin, hay que proceder previamente a cerrarlo. Cmo puede mantenerse entonces la apariencia de que la recuperacin de partidas contina funcionando como si nada hubiese pasado? Volviendo a abrir inmediatamente el fichero con el identificador que tena inicialmente. Para esto est la funcin 'freopen()', malsimamente explicada en todas las obras de referencia que tengo, pero que, en conjuncin con 'currentGame.opened' puede recomponer perfectamente la situacin previa, asignando al fichero la misma estructura 'FILE' que tena antes, con lo que el resto del programa no se entera del cambiazo. (Otras observaciones interesantes al respecto. 1) No existe en la norma C una funcin que permita recuperar el nombre del fichero correspondiente a un puntero dado, puesto que la estructura  FILE  no registra este dato. Cuando se suponga que se le vaya a necesitar posteriormente, hay que ponerlo a buen recaudo en el momento en que se lo conoce, como se hace aqu situndolo en 'currentGame.inFile'. 2) Los ndices de posicin de las operaciones de lectura y escritura dentro del fichero s que son manejados automticamente por el sistema operativo: cada estructura  FILE  registra el que le corresponde, de tal modo que se puede estar accediendo a un mismo fichero simultneamente por varios puntos -- para obtener datos -- como consecuencia de varias aperturas; no hay un ndice nico, como pudiera tender a pensarse de modo ingenuo. 3) Tampoco hay ninguna funcin que permita comprobar anticipadamente la existencia o no de un fichero dado. La nica forma de hacerlo es intentar abrirlo y ver qu pasa: si la operacin termina bien, el fichero existe y se puede proceder a cerrarlo o a lo que sea; si falla, el fichero no existe.)

Estoy muy satisfecho de haber culminado esta tarea, que fue casi la primera que me propuse, por ser el aspecto de WinBoard que me pareci ms insatisfactorio desde los primeros momentos, pero que me daba miedo y he ido demorando durante tanto tiempo. El remoloneo estaba bien justificado, pues es impresionante la cantidad de escollos (unos previstos y otros no) que he tenido que salvar para que esto funcione como es debido. Pero en el proceso he aprendido un montn de cosas, tanto sobre la programacin de Windows y la dinmica general de un programa, como sobre aspectos detallados que hasta ahora no haba tocado, como el manejo de ficheros, lo que me alegra mucho.

De momento la nica tarea pendiente que queda en mi lista es crear una 'caja de piezas', al estilo de lo que tena el ajedrez de Borland (Lucena), para poder disponerlas sobre el tablero ms cmodamente que con el men de 'te veo y no te veo' que utiliza ahora WinBoard. No es cosa que ahora me parezca difcil.

Por el contrario he renunciado a la idea de aadir una opcin del men que permita modular la maestra del juego del programa de ajedrez que se utilice e incluso servir de buzn para enviarle las rdenes adecuadas. El documento 'FAQ' de Winboard ya se manifiesta al respecto (apartado B. 24); no hay ms que dos medios razonables de hacerlo: 1) dar al programa poco tiempo para pensar y tomarse en cambio uno mismo todo el que necesite, por un lado (lo que se realiza quitando la marca de 'bandera automtica' en el cuadro de 'Opciones / generales', para que WinBoard no sea riguroso en el control del tiempo), y 2) no dejndo cogitar al programa mientras le toca jugar al contrario (lo que se hace en el mismo recuadro, desmarcando la opcin 'Considerar la prxima jugada'). El resto depende de qu posibilidades e instrucciones para ello ofrezca el programa de ajedrez y claramente es un problema peliagudo, pues implica el 'protocolo' utilizado por los programas para entenderse entre s. La informacin de Crafty demuestra que es poco tambin lo que en l puede hacerse (cfr. rdenes nmeros 28, 40, 50, 53, 54, 57 y 60 del manual) y quiz menos todava en GNUChess. (Cfr. la buena informacin al respecto contenida en los artculos de Aaron Tay 'confusion.html' y 'uciwinboard.html' en 'www.aarontay.per.sg/Winboard/'.)
Por otro lado en 'wbec-ridderkerk.nl/' bajo el apartado 'Countries' he aprendido hoy que hay rondando por ah nada menos que  260 programas, elaborados por gente de 44 pases diferentes, que pueden trabajar con WinBoard, 253 de los cuales son gratuitos. Ah es nada!


23 de julio de 2004

Aunque pareca que la separacin entre el modo de anlisis y la presentacin de las cogitaciones estaba ya terminada, no era as; su asociacin en el WinBoard originario es demasiado estrecha, por lo que ha habido que hurgar algo ms.
Lo primero era aclararse conceptualmente. El modo de anlisis solo funciona: a) en el modo de juego manual, que establece automticamente, b) con Crafty activo como programa de ajedrez y c) con Crafty actuando como primer programa, pues no basta que est como segundo. De hecho esta posibilidad no est siquiera prevista, por lo que varias instrucciones dan siempre por supuesto que el programa que analiza es el primero. En cambio la presentacin de las cogitaciones solo funciona cuando uno o dos programas de ajedrez toman parte activa en el juego.
La largusima funcin 'HandleMachineMove()' de 'backend.c' (lanzada por 'ReceiveFromProgram()') analiza los datos recibidos del programa y, entre otras cosas, enva a 'thinkOutput' la informacin relativa a evaluacin y continuacin principal. Para que estos datos existan el programa tiene que haber recibido la orden correspondiente, que es 'post'; esto se haca nicamente en 'ShowThinkingEvent()', por lo que la activacin del anlisis no poda funcionar autnomamente. Ahora a) se activa tambin en 'AnalyzeModeEvent()' (donde se le enva a Crafty la orden 'analyze', que sin embargo no es suficiente por s sola para que se reciba la informacin) y b) se evita que 'ShowThinkingEvent()' cierre el grifo para todo el mundo con 'nopost' cuando se la desactiva exclusivamente a ella.
'DisplayMove()' prepara la informacin que va a ser mostrada en la lnea situada por encima del tablero, cosa que termina haciendo 'DisplayMessage()', mientras que la informacin que aparece en el recuadro de anlisis se elabora en 'DisplayAnalysis()' (tomando los datos de la estructura 'programStats', que tambin ha sido rellenada por 'HandleMachineMove()') para terminar siendo mostrada por 'AnalysisPopUp()'.
De momento parece que pueden activarse independientemente una y otra posibilidad en los casos adecuados y funcionar independientemente una de otra. Lo lgico sera impedir que 'Cogitaciones' funcionase durante el anlisis, pero no lo que hecho porque es una duplicacin que tampoco crea ningn problema.
He puesto fuera de juego las instrucciones relativas a la compilacin de 'parser.c' pues se lanzan con cualquier modificacin de 'common.h', 'backend.h', 'frontend.h' y 'moves.h', aparte de 'parser.h', lo que es demasiado. Al intentar compilarlos tal como estn en los ficheros make originales se generan un montn de errores debidos a un fichero de cabecera ignoto del sistema ('bhtypes.h'de 'MicrosoftVisualStudio\VC98\Include', que no s lo que pinta en el asunto), que no puede interpretar 'UNALIGNED'.


24 de julio de 2004

La lista de jugadas presentaba un comportamiento curioso: si despus de seleccionar una jugada avanzada se pulsaba cualquier tecla, la seleccin retornaba a la primera de la lista, aunque la posicin del tablero no se modificaba. No he logrado determinar la causa exacta de este fenmeno, pero de momento lo he evitado devolviendo el enfoque a la ventana principal tan pronto como se acaba la operacin de actualizacin, que se lo concede a la lista de jugadas. El fenmeno no sucede en la lista de partidas, donde la seleccin no vara por la pulsacin de cualquier tecla (excepto 'Intro') aunque el recuadro est enfocado.

Aunque haba desactivado las lneas relativas a 'parser.c' en ambos ficheros 'mak', hoy he estado haciendo pruebas para entender cmo funciona el asunto realmente y no tenerle miedo, limitando las operaciones a l. Al intentar compilarlo en la configuracin que tena el proyecto al empezar las pruebas originaba nada menos que 103 errores, relativos al fichero de sistema 'bhtypes.h'. Le he seguido la pista y resulta que 'bhtypes.h' es incluido por 'parser.h', pero no el 'parser.h' de WinBoard, sino otro que hay con el mismo nombre en 'MicrosoftVisualStudio\VC98\Include'. Estaba claro que haba una confusin entre ellos, lo cual quera decir que el compilador intentaba acceder antes al fichero del sistema que al propio. He modificado el orden en que aparecen listadas las rutas en 'Tools / Options / Directories', de modo que ahora es: 'c:\AJEDREZ\WINBOARD\FUENTE\XBOARD-4.2.7G', 'c:\AJEDREZ\WINBOARD\FUENTE\XBOARD-4.2.7G\WINBOARD', 'c:\ARCHIVOS DE PROGRAMA\MICROSOFT VISUAL STUDIO\VC98\INCLUDE', 'C:\Archivos de programa\Microsoft Visual Studio\VC98\MFC\INCLUDE' y por ltimo 'C:\Archivos de programa\Microsoft Visual Studio\VC98\ATL\INCLUDE'. Con esto la versin de depuracin se ha compilado sin ningn problema, con 'parser.l' y 'parser.h' en 'c:\AJEDREZ\WINBOARD\FUENTE\XBOARD-4.2.7G' y los resultantes 'parser.c' y 'parser.obj' en 'c:\AJEDREZ\WINBOARD\FUENTE\XBOARD-4.2.7G\WINBOARD' (donde tambin se encuentra 'flex.exe' y a donde ahora van a parar todos los '.obj', con independencia de dnde est su fuente).

Otra finalidad de todo este ejercicio era ver si la versin corriente de este fichero tambin era menor que la de depuracin. Esta ltima mide  64 kB y 'parser.c' 139 kB. La versin de distribucin de 'parser.obj' mide 48 kB, confirmando la sospecha, mientras que 'parser.c' conserva el mismo tamao. Pero una nueva cosa importante a observar: no basta con ejecutar 'msvcR.mak', pues si 'Build / Set active configuration' est en 'Debug' esa es la versin que se genera!! El 'Winboard.exe' resultante pesa  976 kB.


19 de agosto de 2004

Un nuevo gazapo descubierto y solucionado. Poda cargarse una nueva partida sin que se avisase de la modificacin y posible salvaguardia de la anterior si se la elega directamente de la lista de partidas del fichero. Para solucionarlo he incluido en 'GameListDialog()' de 'wgamelist.c' el mismo proceso de interceptacin y funcionamiento que se sigue en 'WndProc()'.


22 de agosto de 2004

Al realizar las operaciones de regrabado de una partida a veces aparecan problemas de imposibilidad de acceso a los ficheros. Como suceda de un modo aleatorio, he pensado que pudiera deberse a que por la multitarea se intentase realizar una operacin como la de renombrar un fichero antes de que el sistema operativo hubiese terminado de cerrarlo, aunque la orden correspondiente se hubiese emitido previamente. He aadido pues bucles de espera y reintento en las fundamentales que se contienen en 'ReplaceInFile()'. Veremos qu resultado producen.


1 de septiembre de 2004

El resultado fue nefasto: de alguna manera (que no intent precisar) alguno de los bucles aadidos entraba en un proceso infinito, que grababa repetidamente hasta agotar el disco duro disponible. Volv a la disposicin anterior, pero insertando siempre una fase de comprobacin del resultado de las operaciones relacionadas con los ficheros (generalmente con presentacin de mensajes, pero no siempre), lo que parece haber solucionado el problema, probablemente porque as tambin se logra que una operacin tenga que haber concluido y presente un valor de retorno antes de que pueda empezarse la siguiente.


31 de diciembre de 2004

He logrado terminar el que creo ser el ltimo empujn mo a WinBoard, es decir, a mi versin espaola del mismo. He terminado de traducir la parte fundamental de la ayuda y he logrado que se compile razonablemente bien y que se vea y funcione perfectamente. Incluso he hecho que el recuadro de ayuda se cierre al terminar el programa, algo que no sucede en la versin original.

Es la primera vez que hago tal cosa y me ha dado bastante guerra, pues no he encontrado en ningn sitio una buena explicacin de en qu consiste el proceso y cmo hay que proceder. Resumiendo yo dira que los pasos y trampas fundamentales son los siguientes:

	- Hay que crear primeramente el texto de la ayuda en un fichero con formato .rtf y hay que marcarlo. Las marcas son fundamentalmente unas llamadas a nota a pie de pgina realizadas con smbolos especiales. Sirven para caracterizar y rotular los componentes de la ayuda, siendo las fundamentales para la interpretacin por WinHelp las siguientes:
	# : es la nica imprescindible; ha de ser exclusiva. Identifica una unidad temtica ('topic')dentro del conjunto y por medio de un nombre que es el que se constituye el texto de la nota a pie de pgina. Yo he conservado para estos identificadores los nombres en ingls del fichero original o he asignado otros nuevos tambin en ingls para las partes incorporadas por m. Cada bloque temtico se delimita con la insercin de un salto de pgina final.

	Las marcas siguientes son voluntarias y no hay que usarlas ms que si se necesitan.

	$ : sirve para asignar un ttulo pblico al tema previamente definido.
	K : asigna trminos que formarn parte del ndice, quedando asociados al tema. Pueden ser 		varios, separados por punto y coma, y hasta parece que puede haber niveles dentro 		de ellos.
	+ : marca un tema como punto de 'hojeo' ('browse'), es decir, como parada de una 			secuencia de saltos encadenados por los temas, saltos que pueden realizarse al 		consultar la ayuda mediante los botones '>>' y '<<' del recuadro de ayuda. El 
		texto de las notas determina el funcionamiento del recorrido, al ser ordenado en 		orden ascendente. La forma ms primaria de hacerlo es la que yo he utilizado: si se 		especifica 'auto' como texto de la nota, WinHelp recorre los temas marcados 			con + en el mismo orden en que se encuentran en el fichero rtf.

	Estas son las nicas marcas utilizadas en la ayuda de WinBoard, pero hay otras, como 'A' que sirve para el encadenamiento de bsquedas, '*' que sirve para compilaciones condicionales del documento (debiendo ser la primera nota a pie de pgina de un conjunto de ellas, si se usa), etc. Aparte de ello hay muchas otras posibilidades, como macros de ejecucin, etc. Aunque de forma no muy clara, toda esta informacin y algo ms puede extraerse de la ayuda de Microsoft Help Workshop, al que puede accederse a travs de Tools del men principal de Visual C++ o simplemente pulsando dos veces sobre cualquier fichero de proyecto de ayuda (los terminados en .hpj). La lista total de temas del fichero Winboard.hlp, con los ttulos que les atribuyen sus marcas $, es (segn la genera 'File > Report > Titles' del Help Workshop en el fichero '(nombre).dmp'):
 
		Topic Titles in c:\Ajedrez\Winboard\Fuente\xboard-4.2.7G\winboard\winboard.hlp

		Topic 1	Sumario
		Topic 2	Descripcin general
		Topic 3	Rudimentos de manejo
		Topic 4	Informacin complementaria
		Topic 5	Menus
		Topic 6	Archivo
		Topic 7	Edicin
		Topic 8	Modo
		Topic 9	Jugada
		Topic 10	Partida
		Topic 11	Mostrar
		Topic 12	Opciones
		Topic 13	Help Menu
		Topic 14	ICS Interaction Context Menu
		Topic 15	Buttons
		Topic 16	Command Line Options
		Topic 17	Chess Engine Options
		Topic 18	Internet Chess Server Options
		Topic 19	Load and Save Options
		Topic 20	User Interface Options
		Topic 21	Other Options
		Topic 22	Files
		Topic 23	Installing Chess Engines
		Topic 24	Firewalls
		Topic 25	Limitations
		Topic 26	Authors
		Topic 27	Copyright

	Los saltos temticos a voluntad, insertos dentro del texto, se arman con un subrayado doble de la palabra o palabras deseadas (que aparecern en verde en la pantalla), seguido inmediatamente (sin ningn espacio ni intermedio) por el identificador del tema al que se haya de realizar el salto (el contenido en la nota #), expresin que se marca como texto oculto, presentndose en el procesador de textos como punteada. Estas caracterizaciones se realizan a travs de 'Formato > Fuente > Subrayado' y'Formato > Fuente > Oculto'. La pulsacin del smbolo tipogrfico de prrafo (la P hacia la izquierda) de la barra de herramientas sirve para ver o no el texto oculto.

	No se dice nada en las fuentes sobre el orden de insercin de las notas (salvo en el caso de la de condicionamiento), pero no parece ser indiferente. El que mejor ha parecido funcionar ha sido 'K#$+', que por ello es el ms empleado. Me ha dado grandes quebraderos de cabeza la existencia de espacios invisibles entre las marcas de nota (por ello lo mejor es trabajar con las 'Herramientas > Opciones > Ver' a tope, para verlo todo). Tampoco la utilizacin de tabulaciones e incluso de lneas de separacin parece indiferente, descuajaringndose toda una disposicin en la pgina final slo por insertar uno de ellos indebidamente (aunque en Word se siga viendo todo perfecto). Esta discrepancia entre lo que se ve en uno y otro lado obliga a hacer muchas pruebas y recompilaciones, con las consiguientes idas y venidas.

	- Aparte del fichero con el texto rtf de la ayuda, hay que crear un 'proyecto de ayuda' para establecer las caractersticas de la compilacin, asignar el o los ficheros de .rtf pertinentes y elegir las caractersticas de la ventana de presentacin final (ttulo, botones, etc.). Esto se hace bastante bien en el recuadro que Help Workshop presenta al efecto, apretando sucesivamente cada uno de los botones laterales y cumplimentando las caractersticas deseadas. Desde aqu puede procederse a la compilacin y ver los mensajes de error o aviso que genera, junto a la informacin del proceso global. No he encontrado una referencia que sirva para interpretar los mensajes de error, descifrar su causa y saber los remedios que deban ponerse, por lo que de nuevo hay que proceder por conjeturas, tanteos y pruebas. La finalidad ha de ser naturalmente que se obtenga un fichero (nombre).hlp y que eso suceda con el menor nmero de advertencias posible. El Workshop no proporciona medio de corregir el original, por lo que habr que volver cada vez al procesador de textos.

	- He modificado tambin el fichero 'msvcR.mak' para indicarle el nombre del fichero fuente de la ayuda, aunque no s si eso ser imprescindible (quiz lo sea cuando el fichero .hpj no est actualizado) en el bloque de instrucciones referentes a la compilacin en su caso de la ayuda.

	- Por ltimo he aadido dentro de 'case WM_CLOSE:' de 'WndProc()' en 'winboard.c' una nueva llamada a 'WinHelp()' con el parmetro 'HELP_QUIT' para que desaparezca la ventana de ayuda que pudiera estar abierta al cerrarse el propio WinBoard. Tal cosa no sucede en la versin original, donde la ayuda permanece en el escritorio tras cerrarse el programa.

	Me ha dado alguna guerra la consecucin de que al abrirse la ayuda se presentase directamente la primera pgina del documento. Esto derivaba de que la llamada que crea inicialmente la ventana (la contenida en 'case WM_COMMMAND: > case IDM_HELPCONTENTS:' de la propia 'WndProc()') reza: 'WinHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")', que dirige al programa hacia un tema "CONTENTS" y exige para que funcione que el ttulo (especificado en la nota $ de la pgina deseada) sea "CONTENTS", cosa que al principio no era. 

 
	Otra modificacin que he hecho, con independencia ya del asunto de la ayuda, ha sido la de cambiar el rtulo 'Ver' del men principal por el de 'Mostrar', que me parece ms correcto, junto con algunos otros retoques de detalle en el nombre de algunos otros rtulos. Esto me ha dado mucha guerra, no porque hubiese olvidado las complicaciones que implica la modificacin del men principal y que se explican al principio de este documento, sino porque cuando trataba de ver el resultado de la compilacin siempre vea la situacin antigua, lo que me tena muy confuso. La causa es elemental y al mismo tiempo lamentable: segn las especificaciones contenidas en 'Projects > Settings' el resultado de la compilacin va al directorio 'xboard-4.2.7.G / Winboard', mientras que en la pestaa 'Debug' se especifica como 'Executable for the debug session' el programa contenido en el subdirectorio 'Debug'. Aunque lo que estaba compilando cuando se presentaba el problema era una versin de distribucin y no de depuracin, resulta que al pulsar el icono de la barra de tareas que lanza el programa (el signo de admiracin) el programa que se ejecutaba era la copia antigua que haba en el directorio Debug y no la recin compilada del directorio Winboard, por lo que no se vea que los cambios tuviesen ningn efecto. El nmero de trampas estpidas de que est sembrado este territorio de la programacin parece ser infinito!


14 de enero de 2005

Ayer observ la inesperada repeticin de un problema que ya se haba presentado en la versin anterior con otro fichero distinto, pero pareca haber quedado definitivamente resuelto con la versin 4.2.7. Al intentar ejecutar WinBoard mediante una doble pulsacin sobre el fichero 'Mates simples.pgn' lo nico que se obtiene es un mensaje de Windows diciendo que el programa ha cometido una violacin y ha de cerrarse. Con otros ficheros funciona normalmente.

He estado haciendo pruebas empricas y la causa parece residir simplemente en el nmero de lneas de puro texto que hay antes de la notacin propiamente dicha de la primera partida, pues no hay formato ni caracteres extraos. Con menos de unas quince lneas se acepta el fichero normalmente, pero si hay ms se produce la excepcin, aunque no entiendo la causa profunda de tan extrao comportamiento. En todo caso he trasladado el grueso de ese texto al final del fichero y las cosas funcionan normalmente, aunque sigue habiendo texto puro al inicio del fichero. Pero por qu sucede as? Si el problema estuviese en el nmero o la naturaleza de las lneas del texto no debera desaparecer por variar simplemente su ubicacin dentro del conjunto. Es un problema del fichero de texto, de alguna funcin de WinBoard (bsicamente 'GameListBuild()' de 'gamelist.c', con todo el arcano tema de 'yylex()' incluido), del funcionamiento del compilador o del de Windows?


14 de marzo de 2005

Ayer empec a pasar todo el paquete WinBoard al nuevo ordenador. La 'presentacin' del programa a Windows XP la hice realizando la instalacin normal del paquete oficial 4.2.7, cambiando el nombre de su 'winboard.exe' y de su 'winboard.hlp' a 'winboardA.exe' y 'winboardA.hlp' y copiando los mismos archivos de mi versin. Y descubr con sorpresa que haba un problema: el recuadro de la lista de jugadas no apareca, se activase o no la opcin de mostrarlo en el men. Tras mucha confusin y diversas pruebas, me he dado cuenta de que en 'winboard.ini' (generado originariamente por el programa) se encontraban a cero las coordenadas 'historyX, historyY, historyW y historyH', con lo que se las anulaba. Si se introducan nmeros razonables aqu el recuadro apareca a la siguiente ejecucin del programa y posteriores. Esto indicaba de todos modos un gazapo en el programa y en efecto, mientras que estas variables tienen el carcter 'static' en general, yo haba introducido luego una lnea que les daba el valor 0 cada vez que se ejecutaba 'HistoryDialogProc(), case WM_INITDIALOG:'. He revisado todo este apartado y he vuelto a dejar las cosas prcticamente como estn en los otros recuadros de comentarios y circunstancias, pues el desplazamiento de los datos de la lista por el recuadro tambin era incorrecto (el 'scroll'). Ahora parece funcionar bien.
