| Cuando trabajamos con API's uno de los problema más engorrosos con que
nos encontramos es que la documentación de IBM no siempre se corresponde con la realidad.
Sobretodo me he encontrado con problemas en las cabeceras de un espacio de usuario que
casi nunca son de la longitud especificada en el manual, o que en ellos podemos ver que
son de longitud variable sin más. Esto provoca que a menudo perdamos mucho tiempo
intentando averiguar a partir de que posición comienzan los datos formateados, y en que
posición comienzan los datos de cabecera que nos interesa.
Con esta sencilla utilidad podremos visualizar el contenido de un espacio de usuario,
tanto en modo *CHAR como en modo *HEX.
En el fichero BTTSPC encontrarás los fuentes de esta
utilidad
Instalación
Extraemos los siguientes documentos a las carpetas compartidas, y con un CPYFRMPCD los
subimos al archivo fuente donde situamos las utilidades generalemente.
Asignamos los siguientes tipos y nombres a los ficheros:
Bttspc1f._ BTTSPC1F PF Fichero que recibe el contenido de un espacio de usuario
Bttspc1c._ BTTSPC1C CLLE Gestiona la visualización de un espacio de usuario
Bttspc1r._ BTTSPC1R RPGLE Vuelca el contenido de un espacio de usuario a un fichero
Bttusrsp.c_ BTTUSRSPC CMD Visualizar un espacio de usuario.
Compilaremos con un 15 los módulos CLLE y RPGLE.
Haremos CRTPGM PGM(QGPL/BTTUSRSPCC) MODULE(BTTSPC1C BTTSPC1R)
Y compilaremos el mandato para que apunte al programa BTTUSRSPCC
Funcionamiento
El funcionamiento de esta utilidad es el siguiente:
El mandato envía al CL el nombre del espacio de usuario de manera cualificada.
Creamos el fichero de trabajo en la QTEMP
Llamamos al RPG para que vuelque el contenido del *USRSPC al fichero de la siguiente
manera:
Recuperamos el puntero de memoria de donde comienza el espacio de usuario, y lo pasamos
a una estructura de datos que contiene una array de 320 elementos de 100 posiciones cada
uno, la misma longitud de registro del fichero de trabajo, para así poder contar de una
manera más fácil las posiciones.
Utilizamos la API QUSRPTRUS, que nos recupera dicho puntero, y la estructura de datos
está basada en ese puntero.
Si hay algún error al recuperar el puntero, lo pasamos a la array.
Procedemos al volcado del espacio de usuario al fichero de trabajo.
Para facilitar el control de errores de puntero, hemos creado un prototipo que se encarga
únicamente de retornar el valor de la posición de la array concreta al campo del
fichero. Normalmente el error más común es el de desbordamiento de posiciones al
intentar acceder a una posición que ya no está ocupada por el *USRSPC, y que nos
denuncia el final del *USRSPC.
Mostramos el fichero de trabajo con un DSPPFM para así de esta manera poder
obtener la representación *HEX de una manera cómoda.
En fin, espero que esta utilidad os ayude a entender los datos que nos devuelven las API's
y evitar hacer los miles de debug's necesarios para 'cuadrar' las posiciones que indican
los manuales de IBM, con la realidad que nos devuelven las API's.
Que la fuerza os acompañe.
Àlex Corretge

|