METROPOLITANA DE IZTAPALAFA
Transcripción
METROPOLITANA DE IZTAPALAFA
U ~ I Y ~ R S I DAUTOWOMA A~ METROPOLITANA DE IZTAPALAFA PROYECTO FINAL PARA OPTAR POR L A LICENCIATURA DE C O ~ t P U T ~ C I DE O ~ LA DIVISION DE C1Lftb.l IrTAC 3 BASICAS E INVENILRIA TITULO: SIMULACION DE ARCHIVOS KSAM DE LA HP-3BM A UN M I ~ ~ O C O M ~ ~ ~ TADORA, 111678 J > \ INTRODUCCION Si.tni-tlaiiidn d e M a n e j a s de U i r e c t a r i n s y Archivas MS-DCISnF-n este p r o y e c t o se 1.l e v o a c a b o e s t a Ejimu1ac:j.oi.i p n r que es impor-. tante s a b e r el corriparta.m:i.ento de como se i m p l a n t a n 10s comando.; d e una rnicr-o t:c3r? ;iu-c:h 1.v a s i KEjarn-3~:Wi:l con sus respec::t j. vasi d e MC-Dos :l. 3 . a v e s . ESTRUCTURA DEL MODELO ESTRUCTURA DE ARCHIVOS KSAM ...,. Un a r c h i v a C::E~~~~-..AK)O s c ~ nd e un ARCHIVO DE DATOS JUNTOSCON SUS LLAVE. solo archiva Fisica: L o r i reqistr\o:; d e d a t o s se g r a b a n en un a r c h i v o d e d a t o s en el. n r d e n en el ct-ta1 f u e r b n r e c i b i d o s de un prngrarna( E l 2t:Lt:i.mo r e g i s t ; r o adic:iiinada siemprTe es er;cr-ii;o al f i n a l del. ; ~ . r c : h i v c ~ . t TECNICAS APEKDICE B Y ESTRUCTURA INTERNAS DE ARCHIVOS KSAM/3000 VISTA GENERAL Los archivos KSAM pueden s e r usados eficazmente sin niconoci miento de como estan estructurados l o s archivos o como s e d e t e r d na e l tamaño f a c t o r d e l bloqueo. Los valores de nDEFAüLTn pro= v i s t o s p a r a capacidad d e l archivo, bloqueo de llaves, número de entradas l l a v e , y ass sucesivamente, son eficaceff en muchas a p l i caciones. Este apéndice provee soporte de programRcidn sofistica da con información sobre como estan estructurados l o s archivos KSAM, como es asignado e l espacio de disco a un archivo KSAM, y como es asignado e l espacio de memoria para l o s segmentos de datos extra usados cuando un archivo ESAM es modificado o accesado. Tal información puede s e r Ú t i l para mejorar l a ejecuci6n basada en l a aplicación p a r t i c u l a r o - --- --- KSTRUCTURA DE ARCHIVOS KSAM Un archivo KSAM/3000 es dos archivos f í s i c o s : un archivo de datos La porción d e l archivo de datos de un a r chivo KSAM contiene todos l o s datos en e l archivo 9 nada d s que- y un archivo de l l a v e s . datos. Los r e g i s t r o s de datos estan grabados en e l archivo de da t o s en e l orden en e l cual fueron r e c i b i d o s de un programa, (ElÚ l t i m o r e g i s t r o adicionado siempre es e s c r i t o a l f i n a l d e l archiv o . ) Este orden cronológico no esta necesariamente en secuencia por e l v a l o r de l a l l a v e , A l tiempo que e l archivo 88 a b i e r t o , usted puede e s p e c i f i c a r que l o s r e g i s t r o s deben s e r e s c r i t o s en secuencia por la l l s v e primaria, pero e l modo de "DEZ'AüLT" es g r a bar l o s r e g i s t r o s en cualquier ordeno -- - d e l archivo de llaves de un archivo KSAM contiene l a s entradas l l a v e que mantienen l a secuencia de l o s r e g i s t r o s de datos. Cuando w3 r e g i s t r o de datos es grabado en e l archivo de datos, una entrada l l a v e es adicionada por cada l l a v e d e f i n i d a para e l archivo, y l a s conexiones secuenciales entre entradas l l a v e son actualizadas, Esto s i g n i f i c a que s i hay u p ~ l l a v e primaria y dos a l t e r n a s , t r e s entradas l l a v e s6n adicionadas por cada nuevo r e g i s t r o de dBtos, y t r e s s e r i e s de apuntadores son actualizados para r e f l e j a r l a nueva secuencia de l l a v e s de cada l l a v e . La porción -- La estructura d e l archivo de datos es i g u a l a l a de cualquier archivo MPE. Los r e g i s t r o s da datos pueden s e r de longitud f i j a o v a r i a b l e . S i es f i j a , csda r e g i s t r o es d e l tamaño especificado cuando e l archivo fu6 creado ( E l tamaño de "DEFAULT" es equivalen t e a un sector de disco de 128 palabras). S i es v a r i a b l e , e l t a z zafio a6tuai de cada negkstro es incluido en e l r e g i s t r o mismo; y e l tamaño máximo de cualquier r e g i s t r o es usado para determinar el bloqueo. Por ttDEFAUI/I"t,l o s r e g i s t r o s de datos son bloqueados de de a un registro por bloque, - - - 1 - Bloque de c o n t r o l . Este bloque de 128 palabras contiene informaci6n del archivo de datos asociado con el archivo de l l a v e s y guar da una huella d e l número y t i p o s de accemo a l archivo de l l a v e s , También e s p e c i f i c a e l número de l l a v e s (Primarias y Alternas) def i n i d a s pare e l archivo KSAM, E l nombre d e l archivo de dato6 ;y el número de l l a v e s son esenciales para asociar e l archivo de l l a ves con e l de datos. E l nfimero de l l a v e s determina cuantas entra das hay en e l bloque descriptor de l l a v e . - 4 - Bloque d e s c r i p t o r de l l a v e . Este bloque de 128 palabras contiene una entrada de 8 palabras por cada l l a v e definida para e l archivo KSAM. La primera entrada describe l a l l a v e primaria, l a s i uient e entrada describe l a primera l l a v e a l t e r n a ( s i hay algunay, y cada entrada subsecuente describe una l l a v e a l t e r n a adicional, La primer p a l a b r a de cada entrada apunta a l bloque r a í z para e88 llave; otro dato importante es l a posición de l a l l u v e en e l re(Consulte l a f i g u r a B-5) g i s t r o d e l a r c h i v o d e datos. - - 7 - I l I I f 1 i RELACION DE L.4 LLAVE AL ARCHIVO DE DATCS 1 E 1 propósito d e l archivo KSAM es mantener e l orden de l o s registros en e l archivo de datos, Para mantener e l orden secuencia1 para cada l l a v e , l o s bloques de l l a v e s estan conectados a t r a v e s de apuntadores. Además de e s t o s apuntadores, cada entrada l l a v e también debe cantener un apuntador enlaeaaido e l v a l o r de l a l l a d ve a l r e g i s t r o de d a t o s que contiene e l v a l o r de l l a v e correspon - diente. Cuando e l archivo KSAM es creado, cada l l a w es d e f i n i d a con su p o s i c i ó n i n i c i a l en e l r e g i s t r o de datos, su longitud y BU t i p o . La p o s i c i dn i n i c i a l es e s p e c i f i c a d a como l a p o s i c i ó n d e l caracter donde empieza e l v a l o r de l a l l o v e ; l a longitud es e l número mLíximo de c a r a c t e r e s usados por e l m l o r de l a l l a v e ; e l t i p o de l a l l a v e es e l t i p o de v a l o r : un integrador, una s e r i e de caract e r e s o un integrador de d o b l e palabra. Así, s i l a l l a v e primaria e s d e f i n i d a coho una s e r i e de caracteres que empieza en la p o s i c i ó n 3 y t i e n e 20 caracteres de longitud, entonces KSAM espera que cada r e g i s t m d e d a t o s ooaten&z?áun v a l o r en esas posiciones. Todo l o que e s t a l o c a l i z a d o en l a POs i c i ó n d e f i n i d a e s tratado como l a l l a v e primaria y determina el orden en e l cual los r e g i s t r o s de d a t o s estan en secuencia, E l orden en e l cual los r e g i s t r o s son fisicamente grabados en e l archivo de datos es llamado secuencia cronológica. Esta secuem c i a puede ser o no también una secuencia por l l a v e . Si l o s re-g i s t r o s fueron grabados en el archivo en secuencia por l a l l a v e primaria, eneonces estn secuenc%a y l a c r o n o l ó t i c a son iguales, S i n embargo, s i hay una llave alterna para el archivo, es muy improbable que l a secuencia de l a l l a v e a l t e r n a sea l a misma que -- l a secuencia cronológica, N O T A La secuencia de l l a v e s en archivo KSAM siempre es er! orden ascendente p o r el v a l o r de l a llave. Consulte l a f i g u r a B-7 para un diagrama s i m p l i f i c a d o de l a r e l a ción entre llaves primarias en el archivo de l l a v e s y sus r e g i s tros asociados en e l archivo de datos. (Un diagrama similar POd r í a ser hecho p a r a l a l l a v e alterna), E l diagrama muestra e l apuntador en cada entrada l l a v e apuntando directamente a un se-gistro en e l archivo de datos. - Cuando un r e g i s t r o de datos e s l o c a l i z a d o p o r e l v a l o r de l a 11% ve, e l bloque raíz es examinado primero, usando un método de bus queda binaria. S i l a l l a v e e s t a en e l bloque r a f e , l a bus uedatermina, S i no, el valor de l l a v e esta e n t r e dos w l o r e s 8 e l bloque r a í z o es menor aue el v a l o r más b a j o o es mayor que e l valer más Rito. -- - - 11 - I Usando el apuntador de la p o s i c i ó n apropiada, se localiza un blo que d e l siguiente nivel, Entonces este bloque es examinado en %i busca de l a l l a v e seieccionada. Otra vez, s i la llave es encont r a d a , la busqueda termina. S i l a llave no es hallada en e s t e nivel, el apuntador aprohiado del siguiente nivel es usado y la busqueda continfia. - Cuando el valor de I n l l a v e seleccionada e8 hallado, el apunta--' dor a l archivo de d a t o s asociado con aquel v a l o r es usftdo para l o c a l i z a r el registro en el. archivo de datos. - - 12 - I I ESTRUCTUIiR DEL ARCHIVO DE LLAVES KSAM Un archivo d e l l a v e s KCAM consta de t r e s t i p o s de informaci6n: CONTROL - Contiene información general de c o n t r o l t a l como e l nombre d e l archivo KSAM, y e l número de l l a v e s d e f i n i d a s para e l archivoa DESCRIPTOR DE LLAVE - eontiene información general para cada l l a v e t a l como l a p o s i c i ó n i n i c i a l d e l campo l l a v e en e l r e g i s t r o de datos y l a p e s i c i d n en e l archivo de l l a v e s de l a entrada r a í z l l a v e . ENTRADAS LLAVE - - - Cada entrada l l a v e contiene informacidn acerca de una l l a v e asociada con un r e g i s t r o de datos. , Esta informacidn consta de: J S ~v a l o r de la l l a v e . Tin apuntador de un r e g i s t r o d e l archivo de datos con e l mismo v a l o r de l a l l a v e . La infovmación de contleol y descripción de l l a v e esta contenida en dos bloques ( r e g i s t r o s físicos) en e l i n i c i o de cada archivo. Apuntadores de o t r o s r e g i R t r o s con e l archi vo de l l a v e s . Sin t e n e r en cuenta e l número de l l a v e s en e l archivo, cada bloque t i e n e 128 palabras (un s e c t o r ) de l o q $ t u d . Así cada archivo de l l a v e s esta precedido de dos sectores de información de c o n t r o l y descripción de l l a v e s . Las entradas l l a v e también estan organizadas dentro de bloques de un tamaño f i j o , Sin embargo, el número exacto d e bolques y e l t a maño de cada blaque esta basado en una variedad de fmtores, tal-cg mo e l tamaño de l a l l a v e , e l número de l l a v e s en e l archivo, e l número de v a l o r e s para cada l l a v e , e l f a c t o r de bloqueo de l l a v e s , y as€ sucesivamente, (El c á l c u l o d e l tamaño d e l bloque de llaves e s discutido más tarde en esta sección). Estos bloques de entradas de l l a v e estan organizades en estructura ARBOEB discutida teriormente. Una estructura separada de l l a v e s es actualizada pa ra cada l l a v e definida para e l archivo. De e s t a manera pueden .l l e g a r a s e r 16 estructuras de Arb01 separadas en un s o l o archivo - -- KSAM, Consulte l a f i g u c a B-4 para un diagrama s i m p l i f i c a d o de un archivo de l l a v e s KSAM, con dos l l a v e s , organizado en una estructura de ARBOL de dos n i v e l e s . Para una descripción detallada de l o s tres tipos de bloques consulte l a f i g u r a B-5 y B-6. -- - 6 - .-. .' . - ~. . , __... - .. -- . = Apuntador Valor de. Llave I L 1 1 I+ Raíz 1 . 3 ' II I. -/ Figura B-?. Estructura de Arbol-B de dos n i v e l e s - Adicionando o borrando l l a v e s . Cuando un bloque de l l a v e 8 está lleno y nuevas l l a v e s son adicionadas, e l bloque de n i v e l r a í z pue de necesitar que sea introducido y adicionarlilo un nuevo n i v e l alARBOL, Este proceso es i l u s t r a d o en l a figura B-2 donde la adición de una nueva l l a v e a un bloque parcialmente lleno no afectala estructura del ARBOL, pero l a ddicibn de una segunda l l a v e a l bloque lleno causa l a d i v i s i ó n de éste. Otra vez, e s t e ejemplo asume e l tamaño d n i m de bloque de l l a v e s por cuestión de simplicidad, Note que toda la actualización d e l archivo de l l a v e s es eJecutada en e l segmento de datos e x t r a KSAM donde el espacio es asignado para una l l a v e más que e l t a m d o d e l bloque de l l a v e s . Este permite l a adición de una l l a v e a un bloq que "llenot'. Antes que el bloque sea l e i d o en e l archivo de llaves, es d i v i d i d o de modo nue e l tamdo de blooue de l l a v e s es ac4 tualizado. - 3 - . . . 7 Estructura bioque If15 ~ ~ 1 1 ~ ~ ~ 1 6 ~ 0raíz ~ 2 1(padre) de llaves d e dos [+It- n i v e l e s (todos l o s bloques llenos) I ins orción división 4 ,- Estructura bloque de llaves d e t r e s niveles ( e n t r a d a s sombreadas vacías) Figura R-3. r a í z (padre) +--- rama (padre-hijo) Aumento de dos a tres niveles de árbol - Note que los bloques de llaves siempre deben ser definidos con niímero uniforme de l l a v e s , Como resultado, c u m d o una l l a v e adicionada a un bloque lleno, habrá un valor medio para formar bloque en un ~ u e v onivel. Esto mantiene el balance esencial l a estructura árbol-B. un es un de Cuando registros del archivo de datos son borrados, dos bloques del mismo n i v e l (hermanos) pueden ser mezclados en un 8010 bloque. S i siificientes r e g i s t r o s son borrados, a l bloque raiz pued e s e r mezclado en un nivel mayor, reduciendo con ello el número de niveles en l a estructura de llaves, - 5 - La estructura d e l archivo de l l a v e s es d s compleja. E l archivo garti- de 1 1 8 ~ - 8e s t a organizado de modo que l o c a l i z a r una l l a v e c u l m r e q u i e r a e l menor nfimero de accesos. Para este prop s i t o , l o s archivos de l l a v e s estan organizados en UPB estructura p a r t í c u l a r Conocida como un tiATtBOL-Btl -'I-*La estructura de ARBOEBtiene dos ventajas p r i n c i p a l e s : ---- El número de accesos a l archivo e u t a limitado a l número de nive l e s en e l ARBOL. S i hay dos n i v e l e s , no más de dos l e c t u r a s d e l archivo de l l a v e s son necesarias para l o c a l i z a r una l l a v e particular. El archivo de l l a v e s e s t a balanc.eado. Ksto s i g n i f i c a que cada apuntador de n i v e l asociado con un v a l o r de l l a v e p a r t i c u l a r apunta a aproximadamente a t ~ n t o svalores de l l a v e maybres como menores d e l siguiente n i v e l d e l ARBOL, -- La estructura de A R B O E B es explicada enseguida, seguida de como l o s archivos de llaves KSAM usan esta estructura. 1 Descrita en ftORG.AWIZATION AND MAIN!PENANCE OF U G B ORDERED INDEXEStt (Organización y Mantenimiento de Indices de Gran O r d e w miento)t BAYER Y McCRBIGm, Acta Informatica, SI?RIETGEB VERLAG 1973, paginas 173-189. ESTRUCTURA DB ARBOL-B En un ARBOL-B hay un bloque de nivel r a í z que apunta a bloquee en un n i v e l más b a j o . En e l más baa0 nivel, l o s bloques son llamados hojas y no hacen r e f e r e n c i a a o t r o n i v e l . En una 6structura de dos niveles (Vea la f i g u r a B-1) Todos l o s bloques d e l segundo nivel son S i el ARBOL t i e n e más de dos n i v e l e s , bloques intermedios (nudos o ramas) son referenciados por un n i v e l mayor y e l l o s mismos referencian un n i v e l menor. A menos que e s t e n i v e l menor sea una h o j a , también r e f e r e n c i a un n i v e l más bajo. Esto continúa hasta que e l n i v e l más b a j o (HOJA) es encontrado. - El concepto d e n i v e l mayor y menor no se r e f i e r e a l o s v a l o r e s de l l a v e s , Los v a l o r e s de l l a v e s d e l bloque r a í z siempre son c8ntrA cos y apuntan a bloques con v a l o r e s más a l t o s y más bajos, A s í que s i hay dos entradas en un n i v e l r a i z o rama, habrá t r e s apuntadores e n el siguiente n i v e l : uno para l o s v a l o r e s de l l a w meno res que e l v a l o r de l a p r i m e r a l l a v e , uno p a r a l o s v a l o r e s de l l a ve menores %;ucla segunda l l a v e pero mayores que l a primera, y uno para l o s valores de l l a v e mayores que l a segunda. - --- Dentro de cada bloque, los valores son almacenados en orden asceg dente, Aunque no todos l o s bloques estan l l e n o s de valores, cada bloque e s un ARBOL tiene e l mismo tamaño. La figura B-'l ilustra UTI ARBOL sencillo de dos niveles con u n bloque r a í z y t r e s bloquea Hojas, La raíz es un bloque s e n c i l l o y cads Hoja es un bloque d e l mismo tamaño. (Este ejemplo l o usa e l tamaño mínimo KSAM de bloque de l l a v e s consistente en cuatro entradas l l a v e por b l 0 ' 3 ~ 6 ) . -- - Bloque de entradas l l a v e , Cada bloque en e l archivo de l l a v e s contiene, además de l o s v a l o r e s de l a s llaves, apuntadores que enlazan l o s bloques de l l a v e s entre sf, y apuntiadores que enla-zan cada v a l o r l l a v e a un r e g i s t r o de datos asociado. Precedido estas entradas, e l primer dato en cada bloque de l l a v e s e8 l a d i r e c c i ó n del archivo en e l d i s c o , y e l s i g u i e n t e dato e s e l numero de l l a v e s en e l bloque, I Todos l o s accesos a bloques de l l a v e s para busqueda y modificaci6n son ejecutadas en e l segmento de datos extra. La d i r e c c i ó n en d i s c o de cada bloque de l l a v e s asegura que e l bloque e8 r e g r e sado a su posición c o r r e c t a en e l disco. - La f i g u r a B-6 i l u s t r a l a composición general de todos l o s bloques de entradas l l a v e . Cada valor l l a v e es seguido por un apuntador d e l r e g i s t r o de datos 7 un apuntador d e l bloque d e l s i g u i e n t e n i v e l con v a l o r e s de liEave mayores. &lprimer apuntador en cada hloque apunta a un bloque d e l siguiente n i v e l coa v a l o r e s de l l a ve menores. Estos apuntadores son puestOs en ceros para bloques de l l a v e s que no t i e n e n s i g u i e n t e n i v e l (las HOJAS de una estruc t u r a de ARBOL). -- - DE ENTRAD.AS LLAVE BLOQUE ~~ 5 PALABRAS EXTRAS ~~ ,la--- 2 PALABRAS LJirección en d i s c o $-Llaves en e l bloque 4-- I PALABBA Apuntador a l , s iauiente h--- c rn- REAS n i v e l en e l íirbz 1 ~~ -1 VALOR DE LA LLAVE Apuntador a Reg. ;3atos+2 Apuntador a Sig. ;Jive1 IqVALOR DE nli-rA PALABRAS 2 PALABRAS LA LLAVE Apuntador a Beg. D a t o s ‘ l e - 2 Apuntador a Sig. Nivell-2 PALABRAS PAZABRAS I I i > VALOR DP LA LLAVE Apiintador a S i g . ?live1 4FIGURA E-6. 2 PALABRA6 FSTRUCTURA DEL BLOQUE DE ENTRADAS LLAVB - 10 - 1 BLOQUE; DZ: CONTROL (primer bloque en cada a r c h i v o de l l a v e s ) 0 - 4 - 3 -- 29 - 58 61 59 63 Identifica e l archivo de d a t o s a s o c i a d o c o n el a r c h i v o de l l a v e s - hombre d e l Archivo -- 1 5 I Pecha/Hora I 17--VersiOn 19 J$ d e H-e g i s t r o s 21 if" d e Llioques 2 2 ' y r 'álmras u l t bl oque 23 h'actor de Hloqueo 24 -yamano deRegistro 18 20 16 - - Llamadas I n t r ; . n s e c o s (cada uno de d o b l e I Contadores de a c c e s o s ) t o t a l e s a l archivo, usado por qornando VERIFY palabra) 62 60 V Contador n B dE e L eLc t u r-a s . 54 Cont:idor D i v i s i o n e s 77 L_ _L \ - d e f i n i d a s 158 E s p e c i f i c a número de l l a v e s archivo para e l BLOQUE DESCRIPTOR DE LLAVE b i t s = O l 3 4 7 8 1 5 p a l a,bra P.punt a d o r al bloqr a í z d e llave primar.ia Pos 1c i ó n en regisQ-p de 1l a v e p r i m a r i a 4 D=Ban d e r a llaves d u p l i c a d a s reservado Apufitador a bloque-rafz __P d e l r i . l l a v e alterna Posición en registro_--.----p de I r a . l l a v e a l t e r n a Nombre de i r s u a r i o , cuenta, rupo 3 grupo d e " c a s a " 74 s a l a b r a s cada C w dados p o r F?FYTNFC p Llave Primari 6 I I 16 Entradas a d i c i o n a l e s />a 15 llaves alternas $ ' 79 . ' C '230 - 127 DEL ARCñIVO DE CA’POS NOMBRE 6 NUMEEiO DE LLAVES --L FILEXI I 2 ci -LIZ BLOQUE DE CONTROL - BLOQUE DESCRIPTOR DE LLAVE LLAVE ALTERNA DE I RAIZ (PADRE) I / / (HIJOS) A BLOQUE RAIZ Di3 LLAVE PRIAIARIA AREAS SOlldBREADAS I* 1 I* t=I-- \- RAIZ (PADRE) / DISPONIBLES PARA NUEVAS ENTRADAS HOJAS (HIJOS) SECUENCIA DE LLAVE PRIMARIA AA AC BC DC EE GH JM MX NO XT SECUENCIA DE LLAVE ALTYRIVA 2 5 6 7 11 12 14 18 36 42 - = APUNTADOR A L SIGUIENTE NIVEL FN EL ARBOL FIGURA B-4. ESTRUCTURA DE ARCHIVO Dk: LLAVSS KSAM CON DOS LIJAV.ES - 8 - .3 ARCHIVO DE DATOS ARCHIVO DE LLPIVXS ( FFILSX ) (FI EX) fl Nombre 4 . FILEX I Llaves I 12 I Bloque de Control Llave Llave Primaria Alterna (bloques no mostrados) Bloque Descriptor de Llaves Posicion Apuntadores a Registros de Datos Llave F'rimaria I L 3 p -CJ¿ Reg. bytes 25 Nim. O * r I hpunt a a - I 1 2 Bloque Raíz I 3 I 4 5 punt a a loque iguie ive 1 nt I 6 7 I I 8 I 9 AA AC BC DC EE GH JM MX NO Secuencias : Llave p r i m a r i a : Cronológica Llave alterna: Cronológics : BC GH MX NO XT JM EE DC AC 2 5 6 7 11 12 I 4 18 36 7 6 36 18 1 4 42 12 2 5 4 11 -F i g u r a B-7. E e l a c i Ó n entre Archivo de Llaves y Archivo de Datos - 13 - - - ., -* TAMARO DEL ARCHIVO KS:?M E l tamaiío d e l archivo de datos e s calculado por e l tamaño de cada r e g i s t r o (Para r e g i s t r o s de longitud f i j a ) . Para r e g i s t r o s de longitud v a r i a b l e , se c a l c u l a por l a máxima ocurrencia d e l tamaño de l o s bloques de datos Be cada bloque. Por llDEFAUi~T1l,un archivo de datos KSAM contiene 1024 r e g i s t r o s (o bloquea) en e l cual cada r e g i s t r d (o bloque) t i e n e 1024 palabras de longitud. Este tamaño de "DEFAULT" adapta cada bloque dentro de ocho sectores de d i s c o (cada s e c t o r t i e n e 126 palabras de longitud), y r e s u l t a en un archivo de datos de 8192 sectores. -- -- E l c á l c u l o del tamaño del archivo de l l a v e s es más complejo. Est a basado en e l número t o t a l &e l l a v e s en e l archivo (Primarias y Alternas)t el tamaño de cada entrada l l a v e (Incluyendo l a de a r r i b a ) , e l numero esperado de r e g i s t r o s de datos e s p e c i f i c a d o cuando e l archivo e s creado, mas e l espacio pasa p e r m i t i r l a d i v i s i ó n de bloques cuando se incremente e l número de entradas l l a v e . El número de entradas p o r l l a v e por l o general e8 exactamente el mismo número de r e g i s t r o s de datos esperados. Por "DEFAULT", KSAM usa e l número máximo de r e g i s t r o s de datos e s p e c i f i c a d o , o e l v a l o r de llI>EFAULT1' de 1324 r e g i s t r o s . Este número e s m u l t i p l i cado por cada llave además de l a l l a v e primaria para l l e g a r a i nií mero t o t a l de entradas l l a v e en e l archivo. --- E l tamaño de cada entrada l l a v e y e l número de entradas l l a v e por bloque ( E l f a c t o r de bloqueo) son usados pars determinar el tamaño del bloque de l l a v e s . Puesto que todos los bloques en e l ar-chivo de l l a v e s deben t e n e r e l mismo tamdo, KSAY a j u s t a e l fact o r de bloqueo de modo que todas las l l a g e s , s i n tener en cuenta s u tamaño, usen e l mismo tamaño de bloque. También, este f a c t o r de bloqueo puede s e r ajustado de modo que no sea malgastado e l e8 patio en disco. (Un bloque siempre empieza en f r o n t e r a de secotor). Por "DEFAULT", el f a c t o r de bloqueo es ajustado de modo que el tamaño d e 1024 palabras es usado p o r todos l o s bloques de - -- l l a v e s para todas l a s l l a v e s en e l archivo. A causa de l a naturaleza de l a estructura ARBOEB, s e debe d e j a r bastante s i t i o en e l archivo de l l a v e s para que e l archivo pueda ser incrementado de manera balanceada. Cuando ocurre l a d i v i s i ó n de bloque6 como resultado de adicionar nuevos v a l o r e s l l a v e , hast a l a mitad de cada bloque de llaves puede t e n e r espacios vacios. Para p e r m i t i r t a l expansión, e l tamdo del archivo de l l a v e s e s calculado, y emtonces duplicado. - La s i g u i e n t e discusión describe exactamente como c á l c u l a KSU el tamaño d e l bloque de llaves y entnnces e l tamaño t o t a l d e l archivo de l l w e s . Estos c a l c u l o s son u t i l e s principalmente s i usted no usa l o s v a l o r e s de "DFZAULT" para e l f a c g o r de bloqueo de l l a v e s y para e l número de entradas llave. En t a l e s casos pueden ayudarle a determinar e l tamaño d e bloque y e l tamaño de archivo más e f i c a z para su aplicación. - 'I4 - I TAMABO DEL BLOíJJE DE LLAVES El tamaño del bloque de llaves puede a f e c t a r l a compiiejidad de l a e s t r u c t u r a de ARBOL y e s t a puede a f e c t a r e l tiempo de acceso. Pa ra entender l a relación entre tamaño de bloque y tiempo de acceso, consideremos l a s siguientes r e g l a s generales: - 15 - Rntre más grande e l bloque, menos 8et t i e n e que d i v i d i r , y entre menos divisiones, menos n i v e l e s en e l ARBOL. Entre más n i v e l e s en e l ARBOL, es necesario más tiempo de recuperación de memoria p a r a l o a a l i z a r una l l a v e particular. De esto seguiría que p a r a reducir e l tiempo de acceso, deberia de f i n i r bloques grandes. Esto es c i e r t o solamente hasta c i e r t o p<' t o , Dependiendo del número t o t a l de l l a v e s esperado en e l archi= vo, un tamaño de bloque muy grande puede resultar en una gran c4n t i d a d de espacio sin usar en cada bloque. T a m b i h , e l f a c t o r debloqueo puede resultar en espacio de disco s i n usar puesto que to dos l o s bloques deben i n i c i a r en fronteras de saGtor. - KSAM provee un f a c t o r de bloqueo por l'DEFAULT'l que produce un blo que con lü24 palebras. Bste tamdo ha probado ser e f i c i e n t e para muchos archivos. Usted puede, s i n embargo, borrar este bloqueo de llDEFAULT1l especificando un v a l o r en el parámetro bloqueo de l l a v e s de l a opción; KEY en e l comando BUI.LD, o en la palabra 19 ue cualquier factor de bloqueo del parámetro KSAM FOPEN, que especifique t i e n e un v aNote l o r rn nimo puesto que KSAM incrementa e s t e f a c t o r de t a l manera que l a menor cantidad de espacio en d i s co sea desperdiciada. --- - i! uespués de crear un archivo KSAM, puede usar e l comando VERIFY de HSAMUTIL, p a r a determinar e l número de n i v e l e s necesarios para el archivo, v'ERIFY también muestra e l f a c t o r de bloqueo actual usa: do en l a ereacidn d e l archivo para que pueda saber s i su factor d e bloqueo ha sido incrementado. - Calculando e l tamaño d e l bloque de l l a v e s . E l t a m d o d e l bloque de l l a v e s esta basado en l o s siguientes f a c t o r e s : E l tamaño d e l l a v e en BYTES (KS), &l tamaño de l a entrada l l a v e en palabras (ES). E l número d e entradas l l a v e por bloque, f a c t o r de bloqueo (BE') Una vez que e l tamaño d e l bloque es determinado se calcula el ni mero de sectores necesarios p a r a guardar un bloque. S i este va lor (NB) desperdicia e s p a c i o en los sectore8, KSAM a j u s t a el faz t o r de bloqueo para prod.ucir un tamaño de bloque que use e l menor número d e sectores llenando cada uno t a n completamente como sea posible, Note que cuando KSAM usa e l tamaño de "DEEFAUIiT" de 1024, calcula un f a c t o r de bloqueo p o r e l mismo m6todo. --- Zos siguientes pasos muestran como KSAM determina e l tamdo bloque basado en un ffictor de bloqueo mínimo especificado. N J , O T A E l signo s i g n i f i c a redondear hacia abajo e l resultado d e l algorítmo entre corchetes a l siguiente número entero; r 7 s i g n i f i c a re-dondear h a c i a a r r i b a , del -- 1, Calcula e l tamaño de l a entrada (ES) en palabrae con e l tama ño de l l a v e (KS) en bytes, y entonces dos palabras a c a da apuntador en l a entrada l l a v e (Vea l a f i g u r a B-6), KSAMusa e l siguiente algoritmo para ejecutar ebte cálculo: ES = 2, L(KS+’I)/2J + 4 S i e l factor de bloqueo (BF) f u 6 e s p e c i f i c a d o como un número’ impar, KSAM envía un mensaje de e r r o r * De l o contrario, usa e l factor de bloaueo especificado para continuar e l cálculo del tamaño d e l bloque, 3. Determina e l tamaño d e l bloque (BS) multiplicando e l tamdo de l a entrada l l a v e p o r e l f a c t o r de bloque y sumando 5 pala bras. (Las cinco pslabras son: l a s tres palabras de informa ciÓn de control d e l i n i c i o de cada bloque, más dos palabrasVea l a f i g u r a B-6). p a r a el apuntador f i n a l en e l bloque. KSAM usa e l logaritmo: BS = (ES x BF) + 5 ‘ -- Puesto que los bloques siempre i n i c i a n en fronteras aé sector, e s t e tamaño de bloque calculado puede dejar algo de espacio de sector sin usar. Los siguientes gasos muestran como KSAM determina e l tamaño de bloque mas e f i c a z , y s i este tamaño d i f i e r e d e l tamaño calculado por e l factor de bloqueo especificado, como ajusta KSAM e l f a c t o r de bloqueo hacia arriba para producir e l tamaño de bloque Óptimo. -- - 40 - DeterminR e l número de sectores requeridos para guardar e l bloque del tama6o calculado. S i e l resultado no e s un número entero, redondea hacia arriba a l sector entero más aercano. RSAM determina e l número de sectores por bloque (NB) como s i gue : NB 5. rBS/128? Multiplica e l número de sectores por bloque poc 128 gara determinar el tamaño d e bloque óptimo: BS 6. = = NB x 128 S i e l tamaño de bloque 6ptimo calculado en e l paso 5 d i f i e r e d e l tamaño de b1oqv.e calculado en e l paso 3, o si e l tamaño de bloque de ”DEFAULT” de 1024 es usado, KSAM ajusta e l fact o r d e bloqueo a uno que oroduaca e l tamaño de bloque óptimo, Usa e l siguiente algoritmo para determinar el número de entra das l l a v e que es conveniente en e l bloque y, s i e 8 un número’ impar, l o reduce en uno, ( E l f a c t o r de bloqueo debe ser un número par). BF = r( L (BS-5)/XS 1 -1)/2 7 x 2 TAnilAflCl DEL ARCHIVO DE LLAVES KSAM usa el f a c t o r de bloqueo y e l número de sectores por bloquepare determinar e l tamaño máximo d e l archivo en sectores para a l o Jar el archivo de l l a v e s . Además, gSAM necesita conocer el nÚme= ro máximo de entradas l l a v e por esperar, y e l número de l l a v e s (primarias y alternas) definidas para e l archivo a l crearlo. -8 El d e r 0 máximo d e entradas llave para cada l l a v e puede 88r espec i f i c a d o en e l parámetro numentries (Número de entradas) de l a op ción KEYENTRIES d e l comando BUILD o en el parametEo KSAMPARAM ( P a r h e t r o HSAM) d e FOPEN, S i n embargo, e l límite d e l archivo usualmente esta basado en e l número máximo de r e g i s t r y de datos. Este v a l o r 3 s especificado en el garámetro MJME2EC (Numero de re-g i s t r o s ) de l a opción D I S C = d e l comando BUILD, o en e l par6metro FILESIZE (Tamaño de archivo) de FOPEN. S i no e s especificado en ninguno d e estos lugares, KSAM asume e l l í m i t e de archivo de "DEFAULT" da 1024 entradas l l a v e e -0- --- Puesto que e l número d e r e g i s t r o s en e l archivo de datos puede ser usado para calcular e l número máximo de llvses para una sola llave, cada l l a v e a d i c i o n a l definida por e l archivo causa que e l t a maño d e l archivo sea aumentado. Cuando el tamaño d e l archivo ha sido calculado, XSAM usa e s t e valor para asignar el n6mero d e sectores en disco al archivo de l l a ves cada vez que e l archivo sea abierto. - El tamaño d e l a c h i v o de llaves esta basado en las siguientes factores : E l número de entradas l l a v e s p o r bloque, o e l f a c t o r de bloqueo (BF) E l número de bloques p o r sector (NB). E l n6mero máximo d e entradas l l a v e por una l l a v e (FL). E l n&ro de l l a v e s definidas para e l arcbivo de llaves. KSAM usa la s i g u i e n t e f ó r m u l a para determinar el tamaño d e l arch& vo d e l l a v e s en sectores para un archivo con una l l a v e : = ( r"&L/BF 7~ 2) x IQB E s t a fórmula se deriva en los pasos siguientes: (FL) se d i v i d e por el número d e entradas l l a v e por bloque (BF) para encontrar e l nÚmero de bloaues en el arcb.ivo, Si uo es un número entero, se redondea h e c i a a r r i b a p a r a i n c l u i r todos l o s bloques. I. E1 número máximo de entradas l l a v e - Ir, - - 2. 3. El número resultante d e bloques es multiplicedo p o r 2. Xsta duillicación d e l número d. bloques de l l a v e s Be.hace para peg mitir s i t i o p a r a expansion cuando e l numero de n i v e l e s en un archivo de llaves se expande debido a l a d i v i s i ó n de bloques. Finaixente, e l número de bloques e s multiplicado p o r e l n h e r o d e bloques por s e c t o r (HB) para h a l l a r e l número t o t a l d e s e c t o r e s necesarios para contener todas l a s entradas l l a v e , & N O T A .F;1 tamaño del a r c h i v o (FS) calculado p o r e l algo ritmo anterior no incluye l o s dos s e c t o r e s requz ridos para información de c o n t r o l . . I si e l archivo t i e n e colo u,na llave. suma 2 a l tamaño d e l archi(3's + 2) Dara obtener e l tamaño t o t a l d e l archivo. ~1v a l o r 2 r e p r o s e n t a L l o s dos s e c t o r e s d e l i n i c i o de cada archivo de l l a v e s conteniendo información d e c o n t r o l y descripción de l l a v e . VO S i e l archivo de llaves t i e n e l l a v e s múltiples, entonces el tama So da bloque óptimo de cada l l a v e debe ser determinado. r;l tamz ño de bloque m&s grande se s e l e c c i o m entonces como e l t a m d o de bloque stan8ar.rparactodars:La$ l l a v e s en e l archivo KSAM. (KSAM no permite bloques de l l a v e s de longitud v a r i a b l e ) . Puesto que e l tamaño de bloque d e algunas llaves ha sido cambiado, e l f a c t o r de bloqueo (BF) debe ser calculado para e s t a s l l a v e s usando e l algoritmo : - --- Un tamaño de archivo separado es entonces calculado basado en sus varios factores de bloque. ~1 tamaño t o t a l del archivo de l l a v e s e s i u a l a l a suma de v a l o r e s de todos e s t o s tamaños de archivo (FS más 2 para los dos s e c t o r e s de c o n t r o l . 7 - -- M para c a l c u l a r e l tamaño de un archivo de una l l a v e . La f i g u r a B-9 muestra. como c a l c u l a KSAM e l tamaño d e archivo de l l a v e s para un archivo con dos llaves. Cada tamaño d e archivo de l l a v e s (FS) es calculaUo por separado, y entonces e l f a c e o r de bloqueo y e l tamaño del 8'11 chivo de l a l l a v e c:)n e l tamaño de bloque más pequeño es r e c a l c Ü lado La f i g u r a B-E! sumariza los pasos que usa W - Para un archivo con una l l a v e , KSBK simplemente suma 2 s e c t o r e s a l tamaño del archivo (FS) calculado para l a l l a v e simple, - 19 - I , I ! I I I I KS E:; BF BS FL NB FS r7 T A W 0 DE LLAVE E N BYTES TAMARO DE ENTRADA LLAVX ‘EN P A L A B R A S FACTOR DE BLOQUEO (No. DE ENTRADAS LLAVE POR BLOQUE: TAMARO DE BLOQUE DE LLAVES LIMITE DEL ARCHIVO DE DATOS EN REGISTROS NUMERO DE SBCTORES POR ELOQIJE DE L L A V E S ;PAMAl?O DEL ARCHIVO DI3 LLAVES EN SECTORES R3DONDEO H A C I A ARRIBA L i REDONDEO HACIA A B A J O v -q KO 35’ MENOR .# DE PALABRAS QUE il G P E C I P I C A D A ? CONTIEIN3 LA ENTRADA LLAVE i SI NO BF = NUMERO PAR? __e ERROR BS = 1024 (DEFAULT ) 3 PALAERAS DE CONTROL MAS 135 = (ESxBF)+S 9-----2 PALABRAS DE APUMTADOR I I9 . DE PALABRAS EN SECTOR NB =TBS/1287 I_ ES y t T A m O DE BLoQUE OPTIMO = NB x 128 SF =r(L( BS-5)/EBJ-1)/2 7 x 2 B--- BF AJUSTADO v F~~,?JITMERODE ENTRADAS L L A V E EN BLOWE \ ‘=L--REDONIIEADO AL # PAR BNTERC MAS CERCANO J . FL S S P E C I F I C A D O ? NO FL = 1024 (DEFAULT) I I FS = ( r P L / B F l x 2 ) x XB 4 DOBLE NUMERO DE BLW.UI P A 6 A DIVISION DE BLOQUES - 20 - b.suma un archivo con 2 liaves definido como: KS = 13 Y& = 53 FL = 1024 ( d e f a u l t ) PL = 1024 (default) BP = 20 BF = 12 Yálculo de PS: ES= (53+1)/2 +4 = 27+4 = 31 ES= (l3+’l)/2 +4=7+4=11 BS=(1 1x20)+5=225 BS= (31~12)+5= 377 NB= 377/128 = 2.9 = 3 s e c t NBm 225/128 = 1.75 -2 sectores BF= ( (384-5)/31 -1)/2 X2 B s = ~ 281256 x~ = ( q2.2 4 ) / 2 x2 *BPI ( (256-5)/11 -1)/2 ~2 2 ( 22.,8 -1,J/2 ~2 = (12-1)/Q x2 = 5.5 ~2 = 6x2 = 12 = (22-1)/2 x2 FS=( 1024/12 x 2 ) ~ 3 = 10.5 x2=11x2=22 FS=( 1024/22 x2)x2 = ( 85.3 ~ 2 ) ~ 3 =Yl6 sectores =( 46.5 ~ 2 ) ~ 2 B S = ~ X I ~ ~ = ~ W =I88 sectores Puesto que. l a l l a v e 1 t i e n e e l tamano de bloque m6s grande (38 p a l a b r a s en 3 s e c t o r e s ) , su f a c t o r de bloqueo no es cambiado. Qfnct3T d e bloqueo d e le l l a v e 2 es ajustado de modo que teng e l mismo tamano de bloque. e ;: usan l o s siguientes valores: - tamaño de entrada calculado p a r a l l a v e 2 tamaño d e bloque de l l a v e 1 (usada para l l a v e 2) FL=’lOZ4 (Tamaño de archivo en palabras p o r d e f a u l t NB-3 -nljmero de s e c t o r e s necesarios p a r a cada bloque de 384 p a l a b r a s ES=I’I ?3S=384 Q--- Zalcula e l nuevo Tactor d e bloqueo para lleve 2: BF= ( (784-5/‘11-1)/2 x2 = ( ’34.4 - 1 v 2 = 16.5 ~ 2 1 x 3= x2 186 sectores Sumando l o s dos taaanos de archivo y adicionando dos sectores p a r a i n f o r m q c i ó n d e cqntrol y d e s c r i p c i ó n de l l a v e s , e l tamaño t o t a l d e l archivo en sectores e s : 516 + 186 + 2 = ’704 sectores * E l alB;ori.tmo p a r a c a l c u l a r 9F puede ser expresado m8s simple si el resultado puede s e r checado por un número p a r : BF= SS-51ES si BF es un número impar, entonces BF=BF-I j. de llaves alternas en e l archivo. Puesto que e s t a fórmula (Ver Tabla B-3) mantiene e l segmento d e d a l o s e x t r a tan pequeño como es compatible con la e f i c i e n c i a , e l mero de "DEFAULT" de area8 reservadas a bloques de l l a v e s debe ser usado, excepto en caso8 e s p e c i a l e s . (Para d e t a l l e s , r e f e r i r s e a l tamaño del segmento d e d a t o s e x t r a después en e s t a sección). - NülvIlERO DE SEGMENTOS DE DATOS EXTRA K8hM daslgna un ecgmento de dai708 extra para,cada al.ahiva X0AM Puesto que mas de un proceso pue a b i e r t o por un proceso a c t i v o . d e u s a r el mismo archivo durante el acceso compartido, un archivo quizá r e q u i e r a un número de segmentos de datos extra, Así '= e l n6mero de segmentos de datos e x t r a depende de ambos: e l nÚme ro de a r c h i v o s KSAM y e l número de usuarios que usan siwíltanea mente e l archivo. (Consulte l a figura B-AO), - ARCFIKVO KSAM FILEX --- Otro f a c t o r que puede a f e c t a r l a ejecución cuando l o s archivos RSAM son usados es e l número y tamaño de l o s segmentos d e datos e x t r a KSAM, Un segmento de datos e x t r a (XDS) e s t a en una área de memoria usada como una área reservada (BUFFER) durante el acceso a l archivo KSAM. Cada segmento de datos e x t r a contiene: 4 Información e s t a d í s t i c a d e l archivo usado (Listada p o r e l co-mando VERIFY). Datos d e l bloque de c o n t r o l y d e l bloque d e s c r i p t o r de l l a v e s , l o s primeros dos s e c t o r e s de cada archivo de l l a v e s KSAM. - Un área de t r a b a j o (WORKIMG STORAGE) suficientemente grande pa ra contener un r e g i s t r o de datos y dos entradas de l l a v e s . Un . á r e a reservada p a r a e l bloque de dgtos suficientemente de para contener un bloque d e l archivo de datos. gran - A l manos uno, ;y h a s t a 20, areas reservadas para bJoques de l l a ves, s u f i c i e n t e cada uno para contener un bloque de llaveo Cilando e l archivo de l l a v e s es examinado en bhsca da un r e g i s t r o < e datos p a r t i c u l a r , e l bloque raíz y l o s bloques de nivel más ba j o , como se n e c e s i t e , son movidos hacia l a s áreas reeervadas en e l segyento de d z t o s extra. Las entradas l l a v e son comparada8 Cuando e l bloque de datos e s l o c a l i z a d o en e l area d e trabajo. se l e mueve h i c i a su área reservada d e l segmento de datos e x t r a y cuando e l r e g i s t a o de datos p a r t i c u l a r se l o c a l i z a , se l e mueve h->cia e l á r e a de trabajo. - - Puesto que cada archivoKSAM a b i e r t o es alojado en un segmento de datos e x t r a y cada se mento de datos extra puede ser hasta de 32K p a l a b r a s de longitlid 32,767 palabras) l o s archivos KSAM pueden usar mucha memoria. Cuando no hay s u f i c i e n t e sitio en memoria pa r a todos l o s segmentos de datos extra, deben ser intsrcambiados entre memoria y discc, según se necesite. Este intercambio puede hacer lento e l acceso a los archivos KSAM. 'f - Para mininizar e l intercambio usted puede r e d u c i r e l número de - archivos KSAM a l combinar v a r i o s archivos en uno solo. Esto reduce automaticamente e l número de segmentos de datos e x t r a , y p u ~ de s e r una manera e f e c t i v a para mejorar l a ejecución, p a r t i c u l a r mente cuando los archivos son compartidos ppr un número de usuarios. ( R e f e r i r s e a l número de segmentos d e datos e x t r a , abajo), Disminuir e l tamaño g l o b a l d e l segmento de datos e x t r a quiza reduzca e l i.ntercambio de los segmentos de datos extra. S i n embar go, reduciendo el n6mero de aseas reservadas aL bloque! de llaves en el segmento Be datos extra guirsa inoremente el intercambio de l o s bloques de llaves antre e l archivo llave y el segmento de dc t o s e x t r a durante l a busaueda de un archñvo. Por "DEFAULT", KSAM asigna a r e a s reservadas de acuerdo a una formula que toma en cue0 t a el tipo d e acceso por e l cual e l archivo e s t a a b i e r t o , e l nÚme r o de niveles en l a estructura d e l archivo de l l a v e s 0 e l número- - 22 - ~ I I TAVIfiO DEL SEGMENTO D E DATOS EXTRA I E l tamaño de cada segmento de datos extTa asociado con un archivo a b i e r t o KSAM e s determinado por e l numero d9 areas reservadas a bloques de l l a v e s , conteniendo e l t a m d o de cada area reservada, e l tamaÍio d e l a r e a reservada a l bloque de datos, y a UD grado menor, e l tamaño de l a entrada l l a v e y e l tamaño d e l r e g i s t r o (Consulte l a f i g u r a B-Al) de datos. Inicialmente (Cuando un archivo e s t a abierto), 12 K palabras estan asignadas a l segmento de datos extra. Si e s necesario menos espacio que e l actual, e l espacio e x t r a no es usado, pero permaSi se n e c e s i t a más, e l segmento de nece en l a memoria v i r t u a l . d a t o s extra original es liberado y un nuevo segmento de datos ex t r a es asignado con e l tamaño actual necesitado, - E l tamaño máximo d e cualquier sesmento de dntos e x t r a es de 32 K palabras. E l tamaño a.ctua1 se c a l c u l a cpn: E l tamaño t o t a l c é l área de l a s e s t a d í s t i c a s y e l &ea d e trab.ajo. E l t o t a l d e l a s areas reservadas a datos. - r1;l tamaño de cada área reservada lo1 bloque de l l a v e s y e l nÚme r o d e areas reservadas asignadas. Las e s t a d í s t i c a s y e l área d e t r a b a j o tiene aproximadamente I 1/2 H BYTES de longitud, dependiendo de v a r i a b l e s tales como e l tamg ño de la entrada llave y e l tamaño de l a entrada de datos, &l tamaño bel bloque de datos s e basa en e l tamaño de cada bloque de datos d e l archivo. Cada área reservada a l bloque de llaves deba d e s e r l o suficientemente erande para contener todas las en t r a d a s l l a v e de un bloque más una entrada l l a v e usada cuando nu: vas llaves son edicionadas a un bloque l l e n o . (Como se describ i ó a l p r i n c i p i o , v e r figura B-2)- .- - - E l tamaño del bloque d e l l a v e s por ''DEIPAUL'P" es de 2 BYTES (1024 palabras) y el tamaño máximo d e l &ea reservada a l bloque de l l a ves e s de 4KBYTES (2048 palabras), Si un bloque de l l a v e s es rcás grsnde gue 4 K BYTES KSAM reduce e l tamaño d e l bloque de modo que ningun bloque l l e g u e a ser más grande de l o conveniente en e l 6rEa reservada a las l l a v e s en e l segmento de datos extra. Así, la v a r i a b l e p r i n c i p a l en e l tamaño d e l segmento de datos ex t r n es e l número de áreas reservadas a l bloque de l l a v e s o --- - 24 - 1 -- natos usados > -. por VERIFY BLOQUE DE CONTROL DE ESTADISTICAS Y - Registro de d a t o s a c t u a l y area d e comparación de llaves Bloque d.e datos actus1 ' - BLCIQUE DESCRPTOR DE LLAVE A (aprox. 1.5 bytes) Area de t r a b a j o ($iorking S t o r a g e ) Area rese-rvada a l bloque de datos B (máximo 4 palabras) Area reservada al bloque de llaves A.rea reservada a l tlloque de llaves C 0 :{asta 20 areas I I reservadas(buffer) a bloques de llaves por tamafio de buffers de bloque de llaves (tamaño mRximo p o r bloque = 4K bytes) # de buffers Tamano t o t a l d e l Segmento de Datos Extra = A + B + C, (máximo 32K palabras) - Figura B-11. Segmento de Datos Extra KSAU - 25 - 111678 Número de areas reservadas a bloques de l l a v e s , E l Número d& es tos depende del t i p o de acceso p o r e l cual e l archivo esta abies t o , e l número de l l a v e s en e l archivo, y e l número de niveles e5 l a estructura de ARBOL para cada l l a v e . (Consulte l a Tabla B-1 pera d e t a l l e s ) . i(;l menor número de areas reservadas e s asigngdo para acceso de l e c t u r a solamente, a menos que l a l l v a e primaria tenga muchos n i v e l e s en su estructura, Más areas reservadas se-, requieren usualmente para accesos de grabar, leer/grabar o actua l i z a c i ó n . U 1 número de areas reservadas para acceso de l e c t u r a se incrementa con e l número de n i v e l e s usados por l a l l a v e , pero nunca es menor de uno. E l número de aTeas reservadas para acceso de grabacion se incrementa con e l numero de l l a v e s a l t e r n a s en e l archivo, pero nunca e s .enor de s e i s , Nl número de áreas reservadas para todos l o s demas t i p o s de accesos se incrementa con e$ número de l l a v e s a l t e r n a s y con e l número de n i v e l e s de cada l l a v e , pero nunca es menor de cuatro. --- menos que e s p e c i f i q u e un número p a r t i c u l a r de areas reservadas a bloques de l l a v e s , KSPPM asigna areas reservadas en e l segmento d e datos e x t r a d e acuerdo a %as c a r a c t e r i s t i c a s d e l archivo como se muestrs en l a Tabla B-I. A Tabla I3-1. Número d e b u f f e r s de bloques de l l a v e s asignadas p o r default ! T i p o d v Acceso Areas Reservadas ( b u f f e r s ) Asignadas E1cceso s o l o Lectura 1 b u f f e r por n i v e l en l l a v e s con muchos n i v e l e 1 (mínimo 1 y hasta 20 b u f f e r s ) Acceso solo Escritura 3 b u f f e r s por l l a v e p r i m a r i a + 3 buffers por l l a v e alterna + 3 b u f f e r s (ninimo 3 y hasta 30 b u f f e r s ) - 1 1 b u f f e r .or n i v e l en l a estructura de l l a v e Otros accesos (Lectura/Escritura n r i m a r i a + 1 b u f f e r p o r n i v e l en l a estructura' o Actualización.' ? e l l a v e alterns. + 3 buffers (un mínimo de 3 y un mhximo de 20 b u f f e r s ) Note que puede determinar e l número de n i v e l e s p o r l l a v e con e l comando VERIFY de KUAMTTIL. Por ejemplo, s i e l archivo e s a b i e r t o para l e c t u r a solamente, y l a l l a v e Única n e c e s i t a dos n i v e l e s , dos "BUFFERS" de bloques de l l a v e s son asignados. S i e l archivo e s a b i e r t o para grabación unicamenbe, y hay una l l a v e a l t e r n a en e l archivo, nueve "BUFFERE" de bloques de l l a v e s son asignados. S i e s t e mismo archivo e8 a- b i e r t o para acceso de actualización, l a l l a v e primaria usa dos n i v e l e s , y l a l l a v e a l t e r n a usa t r e s , entonces un t o t a l de ocho "BUFFERS" es asignado - 26 - S i desea borrar e l nÚmero de "BUFFERS" de bloque de l l a v e s asig- nado por "DEFAULTt1 puede usar e l comando de Y[PE:BILE antes de ab r i r e l archivo, o d a r e l parámetro 2BUMBUPFERS (Número de "BUFFERS" )de FOPEN cuando abra e l archivo pogramaticamente. La ecuación de archivo e s e s p e c i f i c a d a como sigue: :FILE F1LENAME:DEV = ,, #BUFFERS 1 ---- E l segmento de datos e x t r a KSAM asignara espacio p a r a tantos tlBUFFERS1tde bloque de l l a v e s como usted especifique, hasta un máximo de 20, (Note que e l t e r c e r parámetro n3V= es interpretado cono e l número de t'BVFEERS" de bloques de l l a v e s s o l o cuando e l nombre del archivo es u11 archivy KSAM: para archivos MPE 88-0 tander, e s t e parámetro indica e l numero de copias a listar del archivo ) - . Otra manera de reducir e l número de 'BUPFERS" de bloque de lla-ves es usar lo-men00 las l l a v e s alternas, o a j u s t a r el f a c t o r de bloqueo d o modo que l a estructura d e l archivo de l l a v e s use me-nos niveles. Caalquiera de e s t o s métodos es e f i c á z cuando e l -- archivo es grabado o actualizado, más que cuando es simplemente leído" Note que cuando carga un archivo KSAM con grandes cantidades de datos, debería incrementarse e l número de "BUFFERS" de l l a v e s . A de l l a v e s ea el segmento de datos extra, o l o más más 11BUFF7?,RStt parecido a é s t o , cuando un nueve dato es adicionado, l a s p o s i c i -o.. nes para l o s v a l o r e s de la nueva l l a v e se hallaran en memoria. Esto reduce los accesos a d i s c o y puede r e d u c i r s i g n i f i c a t i v a m e n t e e l tiempo que toma cargar e l archivo. - - Por ejemplo, s i e s t a volviendo a cargar un archivo KSAM después de una f a l l a del sistema, debería usar e l comando :FILE para incrementar e1 número de "BUFF3RS" a l máximo de 20 'BIYFFERS". Entnnces, despu6s m e e l a c h i v o es cargedo, puede p e r m i t i r l e r e v e r t i r e l número de "BUFFERS" de "DEFAULT" e s t a b l e c i d o p o r KSAM pa= r a e l archivo p a r t i c u l a r . SEGMENTOS DE DATOS EXTRA CON ACCESO COWARTID0 E l segmento de datos e x t r a asignado a cada archivo a b i e r t o actúa como un bloque de c o n t r o l para el archivo. E l segmento de datos e x t r a contiene no s o l o l b s "BUFFERS" de l o s bloques actuales d e datos y l l a v e s , sino también l a Última información de c o n t r o l pa r a e l archivo. Esta información incluye l o s apuntadores lógicoy cronológico de r e g i s t r o que indican e l r e g i s t r o que e s t a siendo accesado en e s e m v e n t n . porque l a p o s i c i ó n d e l apuntador actual no esta en un n€Xkaque..de'nso común", cuando algunos programas abren e l mismo archivo, cada uno puede a l t e r a r l a estructura d e l archivo de l l a v e s adicionando o borrando r e g i s t r o s de modo que l o s apuntadores dados p o r o t r o s programas pueden apuntar a l re-g i s t r o eqiiivocado s i n que aquellos o t r o s programas esten concien t e s de e l l o , 27 --- - - Los procedimientos independientes d e apuntador posicionan e l a-puntador s i n importar l e p o s i c i ó n actual. Los procedimientos de pendientes de apuntador deben saber en cual r e g i s t r o e s t a actuar mente posicionado e l apuntador para poder operar correctamente. Todos los procedimientos a l i s t a d o s en l a Tabla B-2 afectan e l 8puntador d e l a misma manera, Para usar e s t o s procedimientos correctamente, e s importante entender como mueve cada uno el a p u w tador, ye sea posicionando e l apuntador directamente o avanzando desde l a p o s i c i ó n actual. En general, cuando e l archivo e s "RANDOM", e l apuntador es posicionado directamente. P o r ejemplo, una llamada's FFINDBYICEY ( O CKSTART O BYSTART) posiciona e l apuntador l ó g i c o en una l l a v e p a r t i c u l a r en e l archivo de l l a v e s basado en e l v a l o r de l l a v e e s p e c i f i c a d o en l a llamada; y una laapada a FPOXNT posiciona e l apuntador cronoldgico a un r e g i s t r o particular determinado p o r --- su - número de registro cronolbgico. Cuando e l acceso a l archivo es secuencia1 o e l archivo e s t a s i e n do modificado, e l posicionamiento d e l apuntador no es d i r e c t o ST' no es en r e l a c i ó n a su posición p r e v i a . Dependiendo l a secuencra en la cual los procedimientos son ejecutados, e l apuntador puede o no puede avanzar a l s i g u i e n t e r e g i s t r o en secuencia cronológlca o por l l a v e , Internamente tma bandera e s usada para i n d i c a r SI avanza o no e l apuntador. Esta bandera, l a bandera "DE NO AVANZARtt es colocado en f a l s e (Falso) s i e l apuntador avanza secuencialmente, y en TRUE (Verdadero) s i no avanza. Algunos procedimientos nunca prueban l a bandera; e s t o s son en g e n e r a l , l o s procedimientos independientes de apirntadores que colocan e l apuntador directamente. Otros procedimientos prueban l a bandera y a-vanzan e l apuntador si la bandera es f a l s a ; generalmente, e s t o s son procedimientos que leen el archivo o posicionan el apuntador secuencialmente. La Tabla B-3 sumariza cuando el apuntador e8 colocado o avanzado. (Note que solo se a l i s t a n l o s procedimient o s UPL; cheque l a Tabla B-2 para l o s procedimientos BASIC o COBO? equivalentes) - S - 20 - ^I -.... x ...-,-. - ., ._ . . ... . . Para hacer seguro que l a Última p o s i c i d n de apuntador e s guardada en e l archivo mis bién que en e l segmento de datos e x t r a sepa rado, los programas que comparten e l mismo archivo KSAM deben usar un esquema cerrado. Cada v e z que un programa atrapa un arochivo XSAM, l a información de c o n t r o l es t r a n s f e r i d a d e l archivo a l segmento d e datos e x t r a ; y cuando un proghzma s u e l t a un ar--chivo KSAM e l cnntenido d e l segmento de datos e x t r a es grabado de regreso en e l archivo. Así, cada programa debería atrapar un' archivo KSAM antes de e j e c u t a r cualquier procedimiento que posicione un apuntador de r e g i s t r o (Procedimientos independiente -DRapuntador), y no s o l t a r e l archivo h a s t a que todos los procedimientos que dependen de e s t a p o s i c i ó n de apuntador (Procedlmientos Eependiente -DR- Apuntador), hayan completado su ej?cu--ción. Esto e s c i e r t o a pesar d e s i e l apuntador es cronologico (Apuntando a iin r e g i s t r o en e l archivo de datos) o es lógico (Apuntando a una l l a v e en el archivo de l l a v e s ) . Ambos t i p o s de apuntador son actualizsdos en e l segmeato de datos e x t r a d e l archivo abierto. - - - La Tabla B-2 lista todos los procedimientos que a f e c t a n o son afectados p o r los apuntadores de r e g i s t r o . -- T a b l a B-2. Dependencia de Apuntador Procedimientos Independientes FFINDBYKEY CKBTART BKSTART IFFINDN 1 A% : a& t Lógico L6gico t Procedimientos Dependientes FREAD I 1 , CKHEAD BKREAD FSPACX Tipo de Apuntador Lógico Lógico FWRITE CP 8 R I TE BKWXITE 1 FPOINT FREADDIR Lógico Lógico Cronoijgico I I I I 3'READBYKEY CKREADBX'YEY EKREAD BYKEY I FREMOVE CKDELE'TE I BKDELETE 1IFUPDATE CKREWRITE LdgiCo Lógico BJSRERJ3ITE I FREADC Cronoiógico" procedimiento que da e l apuntador l ó g i c o también da el cronológico; pero s ó l o FPOIXi! da e l apuntador l ó g i c o a s í *Cada como e l ~ r o u o l ó ~ ; i c a . - 29 111678 . u _ _ - Los procedimientos independientes d e apuntador p o s i c i o n a n e l -- --- apuntador s i n importar l a p o s i c i ó n acturrl. Los p r o c e d i m i e n t o s dependientes d e apuntador deben s a b e r en c u á l r e g i s t r o está actualmente p o s i c i o n a d o el apuntador pare poder o p e r a r c o r r e c t a mente. Todos los procedimientos a l i s t a d o s en l a T a b l a B-2, a f e c t a n e l I apuntador d e la misma manera. Para usar e s t o s procediznientos cor r e c t a a e n t e , e s importante entender cómo mueve cada uno e l apuntador, yj~a sea posicionando e l apuntador d i r e c t a m e n t e o avanzando desde l a p o s i c i ó n actual. En g e n e r a l , cuando e l a c c e s o a l a r c h i v o es "random", el apuntador e s posicionado d i r e c t s a e n t e . Por ejemplo una llamada a FFINDIIYKEY ( o CKSTART o BKSTART) p o s i c i o n a e l apuntridor l ó g i c o en una l l a v e p a r t i c u l a r e n e1 a r c h i v o d e l l a v e s basado e n e l v a l o r d e l l a v e e s p e c i f i c a d o e n l a llamada; y una llamada a FPOINT p o s i c i o n a e l epuntodor c r o n o l ó g i c o a un r e g i s t r o p a r t i c u l a r determinado por s u ni'íaero de r e g i s t r o c r o n o l ó g i c o . - -- Cuando, e l q c c e s o a l a r c h i v o e s s e c u e n c i a 1 o e l a r c h i v o e s t á s i e n d o modificado, e l p o s i c j . o n a n i e n t o d e l apuntador no e s d i r e c t o sic0 va en relación B su p o s f c i 6 n p r e v i a . Dependiendo d e la secuencia en l a c u s l l o s procedimientos yon e j e c u t a d o s , e l apuntad o r puede o no puede avanzar a l s i g u i e n t e r e g i s t r o e n s e c u e n c i a CronolÓgica o por l l a v e , Tnternamente, se usa una bandera para i n c l i c R r s i avanza o no e l apuntador. m t a bandera, l a bandera d e "NCJ Avanzar" es colocarle en VALSE ( f a l s o ) s i e l apuntador avanza s e c u e n c i a l m e n t e , y en TRUE (verdadero) s i no avanza. Algunos procedimientos nunca prueben l a bandera; é s t o s s o n , en g e n e r a l , l o s procedimientos i n d q e n d i e n t e s d e apuntador que c o l o c a n e l apuntador directamiente. Otros procedimientos prueban l a bandera .y avafizan e l apuntador s i l a bandera e s FALSE ( f a l s a ) ; g e n e r a l mente, é s t o s s o n procedimientos que l e e n e l a r c h i v o o p o s i c i o n a n . e l apuntsdor s e c u e n c i a l m e n t e , La T a b l a B-3 sumariza cuándo e s c o l o c s d o o avanzado e l apuntador. (Note que solo se a l i s t a n los procedimientos SPL; cheque l a T a b l a B-2 para los procedimientos e q u i v a l e n t e s BASIC o COBOL. ) - -- -- -- i?.suma un n r c h i v o con 2 llaves d e f i n i d o como: KEY=B,I ,53,12 KEY= B ,54,13 ,20 P a r a L l a v e I: KS=53 FL=lOS4 ( d e f a u l t ) BF=l;Z Para L l a v e 2: KS=l3 FL=1024 ( d e f a u l t ) 1 BF=20 Puesto cpe l a l l a v e I t i e n e e l tamaño de bloque más grande (384 p a l a b r a s e n 3 s e c t o r e s ) , su f a c t o r d e bloqueo no es cambiado. Y1 f a c t o r d e bloqueo d e l a llave 2 es a j u s t a d o de modo que tenga el m i s m o tamafo d e bloque. Se usan los s i g u i e n t e s v a l o r e s : E S = l I ----Tamano d e entrada c a l c u l a d o p a r a L l a v e 2 BS=384~-------~Tamaiio d e bloque de llave 1 (usada para l l a v e 2) FL.=1034 eTeniaño d e a r c h i v o en p a l a b r a s p o r d e f a u l t NB=3 ."-EÚmero d e s e c t o r e s n e c e s a r i o s p a r s cada bloque d e 383 palabras Sumando l o s d o s tarnaaus de a r c h i v o y adicionando d o s s e c t o r e s par informqción d e c o n t r o l y d e s c r i p c i ó n de l l a v e , e l tamaño t o t a l de archivo en s e c t o r e s e s : 516 + 186 + 2 = 704 s e c t o r e s * E1 algoritmo p a r a calcular BF puede s e r expresado mks simple s i el resultado puede s e r checado por un n b e r o par: BF= BS:-S/fi;S s i BF e s un número impar, e n t o n c e s BP=BF-I Figura fi-9, C6lcul.o d e l tsmiiGo t o t a l Be un a r c h i v o de l l a v e s c:)n dos l l a v e s Tabla B-3. Sumario de Apuntadores de R e g i s t r o L I I n i c i o de Llamada Chequeo de Bandera DNA Apuntador D/Iiegistro - - - F i n de Llamada Procedimiento Apuntador Colocación D/Registro Bandera DNA FFINDSYmY Posicionado VERDADERO FFINDN Posicionado VERDADERO - ?os i c ionado FREADB-YKEY - - VERDADERO Avanza FALSO VERDADERO -- - - FSPACE - FREMOVE - - FUl'DATE - - - ; ~~~~ - ~ 4 I FALSO VERDADERO 1 FALSO Posi&&onado VERDADERO Avanza ( v a l o r d/'llave cambiado) - Avanza VERDADERO FALSO VERDADERO Poaicionado VERDADERO FPOINT Dsicionado FREADDIR VERDADERO FALSC - FRF4AD n . Avanza FALSO Avanza F7ÑRIT3 - - FALSO ~ FALSO FREADC Avanza ~ Avanza : Mueve apuntador l ó g i c o a l s i g u i e n t e r e g i s t r o en s e c u e n c i a de l l a v e o mueve apuntador c r o n o l ó g i c o al s i g u i e n t e r e g i s t r o en s e c u e n c i a c r o n o l ó g i c a . P o s i c i onado: Coloca apuntador en r e q i s t r o e s p e c i f i c a d o en l a 1- I .-, '3 (i -% $7, Por ejemplo, s i llama a FREADEYKEY, e s t e p o s i c i o n a e l apuntador un v a l o r de l l a v e e s p e c i f i c a d o . Después de la llamada, el apuntador lógico permanece posicionado en esta l l a v e y l a bandera de no avanzar es c o l o c a d a en f a l s o , S i l a siguiente llamada es a PREAD, FSPACE O FRqADC, entonces e l apuntador e s avanzado a l a s i g u i e n t e l l a v e en s e c u e n c i a de l l a v e a n t e s de que estos procedi mientos e j e c u t e n sus funciones. A s í , después de FREADBYKEY, u llamada a FREAD l e e r í a e l s i g u i e n t e r e g i s t r o , no volvería a l e e r e l mismo scgistro, .y una llamada a PSEACE movería e l apuntador r e l a t i v o a l rrgistro siguiendo l a l e c t u r a d e l r e g i s t r o , a - 30 - program Simula-Directorio; label F INPROGRAM ; const {constantes requeridas para el manejo de Bitreel = 52; MaxLonqRecDat MaxLongKey = 41; LonqPagina = 24; Orden = 12; LonqPilaPaqina = 10; MaxAl tura = 4; icomtantes definidas del usuario3 DUPLICADAS = 1; NO-DUPLICfrDAS = o; type STRING79 STRING40 STRIN68 STRINE6 STRING3 TIPO-RESPUESTA IOVIIIENTO .permite que ex is.^ llaves dup icada5 {no permite la existencia de llaves duplicadas1 = stringi791; = stringC401; = = = = type KEYREC strinqCE1; strinqC61; stringC31; (NO-RESPUESTA, FLECHA, TECLA, RETURN); (NINGUNO, IZQUIERDO, DERECHO, ARRIW, ABAJO) ; = record DIRRWT, DIR-DES1, DIR-DES2 , DIR-DES3, DIR-DES4 end; type DIRREC : STRINGE; = record DIRKEY ARCHIW EXTENSION end; : CTRIffi40; : STRIN68; : STRIN63; {$I ACCESO.TOL1 ($1 OETENKEY.TOL) {$I ADDKEY.TOL1 {$I CCINKEY.TOL3 ($1 STRINGS.TOL> {$I INOUT.TOL> t51 HENUS.TOL3 PRc\Rc\METROS : DPATH DIR-LLAVE (in) - el camino como io digita el usuario (out) - la llave de salida ya editada; *- procedure Concatena-Llave ivar DPATH var DIR-LLAVE : CTRING79; : STRING4Ci); var TEHPPATH CTRINGI CTRINGF TEMP-KEY : CTRING79; : STRINGB; : CTRINGB; : KEY-REG; begin TEHPPATH := STRINGI :: "; STRINGF := "; DIRLLAVE := "; '; CTRINGF := ' T E W P A T H := DPATH; STRINGI := if (TEIIPPATH = "1 then (en caso de mande camina vacio, se va a la raiz) TEMPPATH := ' \ ' ; ' I ; I . with TEMP-KEY do begin DIRROOT := "; DIR-DECl := "; DIR-DES2 := "; DIR-DES3 := "; DIR-Eclr := "; DIR-ROOT := Copy (TEMPPATH, 1, 1); Delete (CTRINGI, 1, Length (DIR-ROOT)); CTRINGF := Concat (DIRROOT, STRINGI); DIRROOT := CTRINGF; CTRINGF := ' '; CTRINGI := ' '; Delete (TEMPPATH, 1, 11; DIR-DES1 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEW-PATH) - 1); Delete (CTRINGI, 1, Length(DIR-üEC1) ); CTRINGF := Concat (DIR-DESl, CTRINGI 1; DIR-DES1 := CTRINGF; >. '; CTRINGF := ' STRINGI := ' Delete (TEMPPATH, 1, P a s ( ' \ ' , TEMPPATH)); DIR-DES2 := Copy (TEHPPATH, 1, P O S ( ' \ ' , TDIPPATH) - 1); Delete (CTRINGI, 1, Length(DIR-DES2)); CTRINGF := Concat (DIR-DES2, CTRINGI 1; DIR-DES2 := STRINGF; CTRINGI := ' '; STRINGF := ' Delete (TEMPPATH, 1, Pos ( ' \ ' , TEMPPATH)); DIR-DES3 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEFIPPATH) - 1); Delete (CTRINGI, 1, Length(D1R-DEC3)); CTRINGF := Concat (DIR-DES3, STRING11 ; DIR-DES3 := CTRINGF; '; C T R I W := ' CTRINGI := ' Delete (TEMPPATH, 1, Pos ( ' \ ' , TEMPPATH)); DIR-DES4 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEIIPPATH) - 1); Delete (STRINGI, 1, Length(D1R-ES41 I ; CTRINGF := Concat (DIR-DES4, CTRINGI); DIR-DES4 := CTRINGF; CTRINGI := ' '; CTRINGF := * '; Delete (TEMPPATH, 1 , Pffi í ' i ' , TEMPPATH)); DIRLLAVE := Concat (DIRRMIT, DIR-DEC1, DIR-DES2, DIR-DES3, DIR-DES4) ; 1 . 1. end; end; PARMETROC: DI R-DAT DIR-IND n i n nn-r (in/out)- archivo de datos; (inlout) - archivo de indices; - - -I . -! -I:---i--;- -- 1 -._ 1- I 4 . .".- ,. ^ L A " I . - - --- procedure Leer-Directorio ( var DIR-DAT : FileDatos: var OIR-IND : Filelndice; var DIRPATH : CTRING79; NUHERO-ENTRADA : integer ) ; var RECORDLEC LINEG, COLUMNA, COLUMNAEXT RESPUESTA I : DIR-REC; : integer; : STRING79; : integer; begin RESPUESTA := ' ' ; LINEA := 8; COLUMNA := 4; COLUHNA-EXT := 13; I := O; with RECORDLEC do begin repeat ARCHIVO := "; EXTENSION := "; SigKey (DIR-IND, WERO-ENTRADA, DIRKEY ); Ob tenRec (DIR-DAT, "30-ENTRADA, RECORDLEC 1; (se encontraron datos en el directorial i f OK then begin 1 Si es el priaer record, nu lo imprime, de lo contrario despliega sus valores) '1 and (EXTENSION O i f ((DIR-KEY = DIRPeTH) and (ARCHIVO 0 ' begin ColocarString (ARCHIVO, LINEA, COLUilNA, 3) ; ColocarSt r ing (EXTENSION, LINEA, COLUIINA-EXT 3); LINEA := LINEA t 1; if (LINEB ) 161 then begin LINEA := 8; WLUMA := COLUMNA t 13; COLMINAEXT := COLUHNAEXT t 13; if (COLUMN4 ) 67) then begin Obtener-StringRespciesta (RESPUESTA, O, 1, 24, 35, 'Presione (ENTER) para continuar', 24, 2); LINEA := 7; C O L W A := 4; COLUMNA-EXT := 13; end; ColocarString ('ARCHIVO.EXT', LINEA - 1, C O L M , O); , ", end; I := I + 1; end; end; until (not OK); Str (I, RESPUESTA); ColocarString ('Numero de archivos en el directorio : 17, 4, 3); end; end; ' + RESPUESTA, ' ' ) I then I : F i ieDatros; : FiieIndice; procedure Deáp 1iega-Di rectorig ivar DIR-DPiT i!ar DIR-IND var DPATH var DIRLISTA RECLLAVE DI R P ATH, RESPUESTA NUMEROENTRADA I : STRINGA); : DIR-REG; : KEY-REG; , : STRING79; : integer; begin RESPUESTA := ' ' ; NUMERO-ENTRADA := O ; I:= o; with DIRLISTA do beqin ClrCcr; ConstruyePantalla (18, 80); Colocar-StringCentrado ('Desplegado de la lista del Directorio', 4 , O ) ; Concatena-Llave (DPATH, DIR-KEY ); DIRPATH := DIRKEY; BuscaKey (DIR-IND, NUMERO-ENTRADA, DIRKEY 1; ( la entrada existe 1 if OK then begin ARCHIVO := "; EXTENSION := ' ' ; ObtenRec (DIR-DAT, NUEROENTRADA, DIRLISTA) ; Colocar-String ('DIRECTORIO : 6 , 4, 0); Colocar-String (DPATH, 6 , 17, 3); ColocarString ('ARCHIVO.EXT', 7 , 5, 0); Colocar-String (ARCHIh, 1 1 , 11, 0); ColocarString (EXTENSION, 12, 1 1 , O ) ; Leer-üi rector io (DIR-DAT DIR-IND D IRPATH NUMEROENTRAMf ; end else ', , , , 1 el directorio no existe 1 begin ColocarStriq ('Directorio o canina erroneo', 13, 10, O ) ; ColocarStriq (DPATH, 10, 11, O ) ; end; RESPUESTA := ' ' ; ObtenerStringRespuesta (RESPUESTA, 1 , 1, 'Presione <ENTER> para continuar', 24, 2); ", 24, 35, end; end; procedure Cambiar-Directorio (var DIR-DAT var DIR-IND var DPATH, DDIR : FileDatos; : FileIndice; : STRIN679); vir STRINGPATH, RESPUESTA CAMBIOKEY NUEVO-DIR STRINGPAD, STRINGI, STRINGF NUMERO-ENTRADA : STRING79; : KEY-REC; : DIRREC; : STRIW; : integer; begin RESPUESTA := ' ' ; STRINGI := '; STRINGF := STRINGPATH := DPATH; ' '; STRINGPPD := 1 I . . if (Pos ( ' \ ' , DPATH1 0 11 then DPATH := Concat ( ' \ ' , DPATH); isi se esta en el archivo raiz y se quiere subir de nivel, manda error1 if (Pos DPATH 1 = 1 1 then 24, 54, Obtener-StringRespuesta (RESPUESTA, O, 1, 'Error en el camino, presione (ENTER> para continuar', 24, 2) ( I . ' ? ", else begin with NUEVO-DIR do (inicia edicion de llave para el cambio de directorio) begin with CAYBIOKEY do begin DIR-ROOT := "; DIR-DES1 := "; DIR-DES2 := DIR-DES := "; DIR-DES4 := "; DIRROOT := Copy (DPATH, 1, 1); Delete (DPATH, 1, 1); Delete (STRINGI, 1, 1); STRINGF := Concat (DIR-ROOT, STRINGI); DIR-ROOT := STRINGF; STRINGF := '; STRING1 := ' i f (Pos('\', DPATH) 0 O) then begin DPATH) - 1); DIR-DES1 := Copy (DPRTH, 1, POS Delete (DPATH, 1, Pos('\', DPATH)); end else begin DIR-DES1 := Copy (DPATH, 1, Length (DPATH)); Delete (DPATH, 1, length (DPATHI); end; Delete (STRINGI, 1, Length (DIR-DESíi); STRINGF := Concat (DIR-DES¡, STRINGI1; DIR-DES1 := STRINGF; STRINGI := ' '; STRINGF := ' '; if (Pos('\', DPRTHI 0 O) then beg 1n DIR-DES2 := Copy (DPATH, 1, Pos ( ' \ ' , DPATH) - 1); ' I ; 1 . ( ' \ I , ^<-.-.uux * . . * * 1 " * - w* "* .- " I I en? else begin I DIR-DES? := C,opy (DPATH, 1, Length (DPATH)); D e l e t e íDWTti, 1, Length (DPATH)); end : D e l e t e [STRINGI, 1, Length (DIR-DESí!)); STRINGF := Concat (DIR-DES2, CTRINGI) ; DIR-DES2 := STRINGF; STRINGI := ' '; STRINGF := ' if ( P o s ( ' \ ' , DPATY) 0 0) then beg i n DIR-DES3 := Copy (DPATH, 1, P o s DPATH) - 1); D e l e t e (DPATH, 1, Pos('\', DPATH)); end else beg 1n DIR-DES3 := Copy (DPATH, 1, Length (DPATH)); D e l e t e (DPATH, 1, Length (DPATH)); end; D e l e t e (STRINGI, 1, Length (DIR-DES3)); STRINGF := Concat (DIR-DES3, STRINGI); DIR-DES3 := STRINGF; '; STRINGF := ' ' i CTRINGI := ' if (Pos('\', DPATH) { > O) then beg 1n DIR-DES4 := Copy (DPATH, 1, POS DPATH) - 1); D e l e t e (DPATH, 1, Pos('\', DPATH)); end else begin DIR-DES4 := Copy (DPATH, 1, Length (DPATH)); D e l e t e (DPATH, 1, Length (DPATH)); end; D e l e t e (STRINGI, 1, Length (DIR-DES4)); STRINGF := Concat (DIR-DES4, STRINGI); DIR-DES4 := STRINGF; '; CTRINW := ' '; CTRINGI := ' if (DIR-DES4 = STRINGPAD) then DIR-DES4 := STRINGI; 2 . ( I \ ' , ( ' \ I , {Si se desea pasar d e un dir., h i j o a l dir., padre, se v a l i d a el camina1 :. ya que salo debe ser p o s i b l e pasar a l d i r e c t o r i o inmediato s u p e r i o r d e l (cada s u b d i r e c t o r i o , simula a l a i n s t r u c c i o n (Chdir d e l DOS! ..> ( (DIR-DES3 = STRINGPAD) and (DIR-DES4 = CTRINGI 1) then DIR-DES3 := CTRINGI else beg i n if (DIP-DES3 = STRINGPAD) then begin O b t e n e r S t r i n g R e ~ u e t a(RESPUESTA, O, 1, 24, 54, 'Error e n el camino, p r e s i o n e {ENTER) para continuar', 24, 2); DIR-ROOT := 'ERROR' ; end; end ; if ((DIR-DES2 = STRINGPAD) and (DIR-DES3 = STRING11 and (DIR-DES4 = STRINGI)) then DIR-DES2 := CTRINGI else beg 1n i f (DIR-DES2 = STRINGPAD) then begin 24, 54, Obtener-StringRespuesta (RESPUESTA, O, 1, 'Error e n el camina, p r e s i o n e {ENTER) para Continuar', 24, 2); if ", " nio onnr .- grnnnn,. * Y , 1 - , ._ .~ -- end; end ; i f ((DIR-DES1 = STRINGPAD) and (DIR-DES2 = STRINGI) and (DIR-DES3 = STRINGI) and (DIR-DES4 = STRINGI)) then DIR-DES1 := CTRINGI el e Eeg i n if (DIR-DES1 = STRINGPAD) then begin Obtener-~tring-Respuesta (RESPUESTA, O, 1, 24, 54, 'Error en el camino, presione <ENTER> para continuar', 24, 2); DIR-ROOT := 'ERROR'; end; end; ", DIR-KEY := Concat (DIRROOT, DIR-DESl, DIR-DES2, DIR-DES3, DIR-DES4) ; DPATH := "; DPATH := Concat (DPATH, DIRROOT); i f (DIR-DES1 0 STRINGI) then DPATH := Concat (DPATH, DIR-DEC1); if (DIR-DES2 0 STRINGI) then DPATH := Concat (DPATH, DIR-DEW; i f (DIR-DEW 0 STRINGI) then DPATH := Concat (DPATH, DIR-DEW); i f (DIR-DES4 O STRINGI) then DPATH := Concat (DPATH, DIR-DES4); DDIR := DIRROOT; ColocarString ( DIRKEY, 10, 10, 3); end; if (DDIR <> 'ERROR') then (Busca el directorio al cual se desea hacer el cambio1 begin BuscaKey (DIR-IND, NUMERO-ENTRADA, DIRKEY 1; ColocarString (DIRKEY, 14, 10, 01; i f OK then DPATH := DIRKEY else begin Colocar-String ('Directorio o camino errorneo', 13, 10, 0); ColocarString (DPATH, 10, 11, O); end; end ; RESPUESTA := ' ' ; ObtenerCtringRespuesta ( RESPUESTA, 1, 1, 24, 35, 'Presione (ENTER} para continuar', 24, 2); end; end ; i f (DDIR = 'ERROR') then DPATH := STRINGPATH; end; **, procedure CrearNuevo-Directorio (var DIR-DAT -7- ..ir( : FileDatos; r . . . *. - 4 var RESPUESTA, STRINGPATH, NUEVO-DIR STRINGI, NGF STRI NUEVO-RECORD NUEVA-L LAVE NUMERO-ENTRADA TEMPKEY, TEMPKEY 1 R TEMP-DI : STRING79; : CTRINGB; : DIRREC; : KEYREC; : integer; : STRING40; : STRIffiE; begin RESPUESTA := ' ' ; NUEVO-DIR := ' '; CTRINGI := ' '; STRINGF := ' NUEVO-DIR := ' ' ; CTRIWIITH := DPIITH; TEMP-KEY := "; TEMPKEY 1 := ' ' ; TEMP-DIR := "; ) or -2ngth (DPATH)= U 1) then i f ((Pos('\', DPCITH) { DPCITH := Concat ( ' \ DPATH); Obtener-String-Respuesta (NUEVO-DIR, 3, 8, 'NM1BRE : 6, 4, 'Digite el nombre del directorio, debe ser nombre valido de DE', 24, 2); Str-AMayusculas (NUEVO-DIR)j TEMP-DIR := NUEVO-DIR; with NUEVO-RECORD do I . I , ', (inicia edicion de la llave para crear el subdirectorio} begin with NUEVA-LLAVE do begin DIR-ROOT := "; DIR-DES1 := "; DIR-DES2 := "; D I R O S 3 := "; DIR-DES4 := "; DIR-KEY := "; if ((Length (DPATH) = 1) or (LengthWATHi = 8)) then begin ' i DIR-ROOT := ' \ DIR-DES1 := STRINGI; DIR-DES2 := STRINGI; DIR-DES3 := STRINGI; DIR-DES4 := STRINGI; DIR-KEY := Concat (DIRROOT, DIR-DES1, DIR-DES, DIR-DES3, DIR-DESI); end else beg 1n DIR-ROOT := Copy (DPCITH, 1, 11; Delete (STRINGI, 1, Length(DIRRO0T)1; STRINGF := Concat (DIR-ROOT, STRINGI); DIRROOT := STRINGF; CTRINGF := '; CTRINGI := ' 1 Delete (DPATH, 1, 1); DIR-DES1 := CopyíDPATH, 1, Pos('\',DPATH) - 1); Delete (STRINGI, 1, Length(DIR-DES1)); CTRINGF := ConcatiDIR-DES1, STRINGI); DIR-DES1 := STRINGF; '; STRINGF := ' i CTRINGI := ' Delete (DPIITH, 1, Pos('\', DPATH)); DIR-DES2 := Copy(DPATH, 1, P O S ( ' \ ' DPATH) - 11; Delete (STRINGI, 1, Length(DIR-DESh); STRINGF := ConcatíDIR-DES& STRINGI); DIR-DES2 := CTRINGF; CTDTtiCI a= ' '. CTRTWC n=-'* . 'i , , ' * * & . " . u ._a- I v -IIX.L...-.E Belete @PATH, 1, Pos(",', DPATHii; DIR DES3 := CopyíDPATH, 1, Píls('\',DPATH) Deléte (STRINGI, 1, Length IDIR-DES31) ; CTRINGF := Concat íDIR-DES, STRINGI); DIR-DES3 := STRINGF; STRINGI := ' '; CTRINGF := ' Delete (DPATH, 1, Pos('\', DPATH)); 1); - '; DIR-DES4 := Copy(DPCITH, 1, Pof;('\',DPBTH) - 1); Delete (STRING1, 1, Length (DIR-DEC4) ) ; STRINGF := Concat (DIR-DEC4, STRINGI); DIR-MC4 := CTRINGF; STRINGI := ' '; STRINGF := * Delete (DPCITH, 1, Pos('\', DPATH)); if (DIR-DES4 = CTRINGI) then DIR-KEY := Concat (Dill-ROOT, DIR-DE%, DIR-MS2, DIR-DES& DIR-DESI 1 . else :si l a llave fue mal creada se rnaneia bandera de error) DIRKEY := 'ERROR'; end ; if (DIR-KEY O 'ERROR' 1 then begin i f (Length (NUEVO-DIR) 0 8) then begin Delete (STRINGI, 1, Length (NUEVO-DIR)); CTRINGF := Concat (NUEVO-DIR, CTRINGI); NUEVO-DIR := STRINGF; '; STRINGI := STRINGF := ' ' 1 end; TEMPKEY := DIR-KEY; i f (DIR-DES1 = CTRINGI) then DIR-KEY := Comat (DIRROOT, NUEVO-DIR, STRINGI, STRINGI, CTRINGI) else begin if (DIR-DES = STRINGI) then DIR-KEY := Concat (DIRROOT, DIR-DECI, NUEVO-DIR, CTRINGI, STRING11 else begin if (DIR-DES3 = STRINGI) then DIR-KÉY:= Concat (DIRROOT, DIR-DE%, DIR-DES2, NUEVO-DIR, STRING11 else begin i f (DIR-DEM = CTRINGI) then DIR-KEY := Concat (DIRROOT, DIR-DES1, DIR-DES, DIR-DES:, NUEVO-D I R I ; end; end; end; TEMPJEYl := DIR-KEY; EncontrarKey (DIR-IND, NUMEP.0-ENTRCIDA, DIR-KEYI ; (Si el subdirectorio ya existe, manda mensap? de error1 if Oi: then Co1ocarStrii-q ('ERROR: Directorio duplicado else begin ARCHIVO := TEMP-DIR; EXTENSIUN := 'DIR ; QIR-KEY := TEMP-kEV; Colocar-String (TEMP-EY, IO, 10, 3); AddRec , 10, 8, 2) (DIR-DAT, NUMEPO-Et4TRADCI, NUEVORECORD); HddLey rDfR-IND, N~HERU-ENTRCID~,DIR-YEY) ; ilIRJEY := '; APCHIVO := ' ; EXTENSION := '; UIR-1 EY := "EMF-! EY 1; - - - *ira it^.iurrrld.Au'&+-I*L Ah&-%-="- Csi ei directorio no e!ii5tei se pr;i~úra r:~ai.inr .. :.e.; i f Di:: t/\Eri tpj 1q &2,CHli.,&-j :L ' s + E:(TERCI(& := . '; (iddRec íEtzR-üAT, NUPiEROENTRADA, NUEVO-RECORD); (iddKej (CX-IND, NUMERO-ENTRADA, DIR-KEY 1; em; end: ent: else Colocar-String ('Erm: No mas espacio en niveles', 10, 8, 2); RESPUESTA := ' ' ; Obtener-String-Respuesta (RESPUESTA, O, 1, ", 24, 35, 'Presione (ENTER> para continuar', 24, 2); end; end; DPATH := STRINGPATH; end; b f DESCRIPCION: Este procedimiento recorre el archivo secuencialmente, y mantiene algunos controles utiles en las rutinas que se manejan mas adelante. procedure Recorrer-Directorio ívar DIR-MT: FileDatos; var DIR-IND : FileIndice; var EXISTE : boolean; ARCH-BUSC : CTRIW; EXT-EUCC : STRING3; KEYBUSC : STRIN640; var TEMP-NUN-ENT : integer); var RECORD-DIR RESPUESTA TEMP-KEY NUMERO-ENTRADA : DIR-REG; : STRINGA; : STRIN640; : integer; begin i se supone que el archivo existe} EXISTE := true; TUIP-NUM-ENT := O; with RECORD-DIR do begin DIR-KEY := KEY-NSG; BuscaKey (DIR-IND, "!€ROENTWUHl, RECORD-DIR) ; TEWKEY := KEY-BUSC; repeat SigKey (DIR-IND, NUKRO-ENTRhDDCI, DIR-KEY 1; TEMPNUM-ENT := NUMERO-ENTRADA; ObtenRec (DIR-DbT, NUrBRO-ENTRbDA, RECORD-DIR); if OK then begin inicia la conparacion 1 if (íARCHIV0 = ARRCH-BUCC) and (EXTENSION = EXT-BUS)) then EXISTE := true else EXISTE := false; anA* - - *. - ' . * . ~ I C w ~ -"-&I I . ILLI *-.,. DESCRIPCION: Esta rutina sirvbe para salvar archivos con extension 'FIL', es decir, que no son directorios, simula a l comando (SAVE}. procedure Salvar-Archivo (var DIR-DAT : FileDatos; var DIR-IND : FileIndice; var DPATH : STRING79); var RESPUESTA NOMBRE-ARCH1VO NUEVORECORD LLAVE RECORD STRINGI, STRINGF NUMEROENTRADA EXISTE DIRLLAVE : STRIN679; : STRIN679; : DIR-REC; : KEYREC; : STRINGEI; : integer; : boolean; : STRING40; begin RESPUESTA := "; '; STRINGF := ' NOMBRE-ARCHIVO := "; STRINGI := ' Obtener-String-Respuesta (NUHBRE-ARCHIVO, 3, 8, 'NOMBRE : 6, 4, 'Digite e l nombre del archivo, debe ser un nombre valido de DOS', 24,21; Str-A-Ha yusculas (NOHERE-ARCHIVO 1; with NUEVO-RECORD do begin ConcatenaLlave (DPATH, DIRLLAVE1; DIRKEY := DIRLLAVE; 1 . ', ARCHIVO := ' , EXTENSION := ' '; BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY 1; i f OK then begin ARCHIVO := NüMüRE-ARCHIVO; EXTENSION := 'FIL' ; Recorrer-Directorio (DIR-DCIT, DIR-IND, EXISTE, ARCHIVO, EXTENSION, DIRKEY, NUIIEROENTRADA) ; i f (not EXISTE) then begin MdRec (DIR-MT, NWlEROENTRADCI, NUEVO-RECüRDi; AddKey (DIR-IND, NUMERO-ENTRAM, DIR-KEY ); Obtener-StringRespuesta (RESPUESTA, 3, 1, 24, 42, 'Archivo salvado, presione <ENTER>para continuar 24, 2); end else Obtener-StringRespuesta (RESPUESTA, 3, 1, ' 24, 42, ' Archivo ya existente, presione CENTER} para continuar', 24, 2); end else 24, 48, Obtener-StringRespuesta (RESPUESTO, 3, 1, 'ERROR: Camino errorneo, presione CENTER>para continuar 24, 2); end; ", ', *, ' I , end; ', 1 rL DESCRIPCION: Este procedimiento renombra un archivo ya exixtente enn un directorio, simula al comando (RENCIME}. procedure Renombrar-Archivo (var DIR-MT : FileDatos; var DIR-IND : FileIndice; var DPATH : STP.ING79); var RESPUESTA NOMBRE-ARCH NUEVO-NOMBRE NOMBRE-EXT RENREC REN-KEY DI R-L LAVE TEHPNMENT NUMERO-ENTRAN EXISTE , , : STRING79; : STRINGE; : CTRIffi3; : DIR-REC; : KEY-REC; : STRIffi40; : integer; : boolean; begin RESPUESTA := ' ' ; NOMBRE-ARCH := "; MEW-NOMBRE := "; NOMBREEXT := "; TEHP_NtlM-ENT := O ; Obtener-StringRespuesta (RESPUESTA, 3 , 17, 'NOIIBRE : 6, 4, 'Digite nombre del archivo y nuevo nombre, formato DOS sin extension', 24, 2); Str-AMayusculas (RESPUESTA) : NOMBRE-ARCH := Copy (RESPUESTA, 1 , POS ( ' RESPUESTA) - 1); NUEVONOMBRE := Copy (RESPUESTA, Pos í ' ' RESPUESTA) t 1 , Length (RESPUESTA)i; ', ', , RESPUESTA := ' ; DIRLLAVE := ' ' ; ConcatenaLlave (DPATH, DIR-LLAVE i; with REN-REC do begin DIR-KEY := "; DIR-KEY := DIRLLAVE; ARCHIVO := ' Y EXTENSION := ' ' ; BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY ; i f OK then begin EXTENSION := 'FIL'; ARCHIVO := NOMBRE-ARCH; Recorrer-Directorio (DIR-MT, DIR-IND, EXISTE, WCHIVO, EXTENSION, DIR-KEY, TEMP-NLMENT) ; i f (EXISTE) then begin ARCH I VO := NUEVONOMBRE ; EXTENSION := 'FIL'; NUMEROENTRADA := TEHPNM-ENT; ColocaRec (DIR-DAT, NUHERO-ENTRADA, RENREC) ; Colocar-String ('Archivo renombrado...', 10, E, 1); end else ColocaError ('ERROR: Archivo no existe, presione cualquier tecla para continuar', 24, 2); end; end; { DESCRIPCION: Este procedimiento cancela un archivo de un directorio dado por DPATH; simula el funcionamiento del comando {DEL>. procedure Borrar-Archivo (var DIR-DAT : FileDatos; var DIR-IND : FileIndice; var DPATH : STRINGA); var RESPUESTA : STRING79; : STRING8; NMBRE-ARCH RENREC : DIRREC; RENKEY : KEYREC; DIR-L LAVE : STRIN640; TEMP-NlHENT MMEROENTRADA : integer; EXISTE : boo 1ea n ; , begin RESPUESTA := ' ' ; NOMBRE-ARCH := ' ' ; TEMPNUMENT := O; Obtener-StringRespuesta (RESPUESTA, 3 , 8, "OMERE : 6, 4, 'Digite nodre del archivo a borrar, sin extension', '24, 2); Str-A-tlayusculas (RESPUESTA); NOMBRE-ARCH := RESPUESTA; RESPUESTA := ' ' ; DIRLLAVE := ' ' ; Concatena-Llave (DPATH, DIRLLAVE) ; with RENREC do begin DIRJEY := "; DIRKEY := DIRLLAW; ARCHIVO := ' '; EXTENSION := ' ; BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY 1; if OK then begin EXTENSION := 'FIL'; ARCHIVO := NOMBRE-ARCH; Recorrer-Directorio (DIR-DAT, DIR-IND, EXISTE, MCHIVO, EXTENSION, DIRKEY, TEMP-NLiMENT) ; ', if (EXISTE) then begin NUMEROENTRADA := TEIP-NMENT; CanKey (DIR-IND, NUIIERDENTRADA, DIRKEY) ; CanRec (DIR-DAT, NUMEROENTRADA) ; Colocar-String ('Archivo cancelado...', 10, 8, 1); end else ColocaError ('ERROR: Archivo no existe, presione cualquier tecla para continuar', 24, 2); end; end ; Obtener-StringRespu~ta (RESPUESTA, U, 1 , 24, 42, 'Presione <ENTER> para continuar', 24, 2); end: ", < i DESCRIPCION : Esta rutina busca un archivo en todo el arbol, y manda los caminos en los que existe el archivo procedure Buscar-Archivo (var DIR-DAT : FileDatos; var DIR-IND : FileIndice; var DPATH : STRIN679); va r RESPUESTA NMIBRE-ARCH NOMBRE-EXT BLISCAREC BUSCALLAVE I, MIMERO-ENTRAM StrI : STRING79; : STRING8; : STRING3; : DIR-REC; : KEY-REC; : integer; : STRIffi3; begin RESPUESTA := "; NMlBREARCH := "; NOHBREEXT := "; I := 0; Obtener-String-Respuesta (RESPUESTA, 3, 12, 'NMBRE : 6, 4, 'Digite e l nombre del archivo a buscar con extension, en formato DOS 24, 2); Str-A-ilayusculas (RESPUESTA); NOMBREARCH := Copy (RESPUESTA, 1, POS ( ' ' RESPUESTA 1 - 1); NOMBREEXT := Copy (RESPUESTA, Pos('.', RESPUESTA) + 1 , LengthíRESPUESTA)); ', ', ., RESPUESTA := ' ' ; with BUSCFiREC do begin LimpiaKey (DIR-IND) ; repeat SigKey (DIR-IND, NUMEROENTRCIDA, DIRKEY) ; Obterdiec (DIR-DAT, NUHERO-ENTRADA, BUSCAREC) ; i f OK then begin i f ((ARCHIVO = NOMBRE-ARCH) and (EXTENSION = NOMBREEXT) 1 then begin Colocar-String ('DIRECTORIO : 6, 4 , O); ColocarString (DIR-KEY, 6 , 17, 3); ColocarString í'MCHIVO.EXTENSIO", 7, 5, O ) ; ColocarString (ARCHIVO, 8 , 4, 3 ) ; Colocar-String (Extension, 8 , 13, 3 ) ; Obtener-String-Respuesta (RESPUESTA, 1 , l,", 24, 48, 'Presione (ENTER) para continuar Busqueda', 24, 2); Colocar-String í ' 8 , 4, O ) ; Colocar-String ( ' 8 , 13, O); I := I + 1; end; end; until (not OK); RESPUESTA := ' ' ; Str (I:& StrI); i f ( 1 0 0 ) then beg i n Obtener-String-Respuesta (RESPUESTA 1 1 , *',24, 50, 'El archivo a buscar existe ' + btri t ' veces... Presione (ENTER}', end else flhtenar S t r i n n Racntiacts IEIECDIICCTB i 1 .?&*$J+ , ', ', ', " _I 24, 2); ~ DESCRIPCION : Esta rutina cancela un directorio dado por DPATH; si y solo si este direc torio no tiene ningun archivo o subdirectorio. En caso de no estar vacio manda un mensaje de error. procedure Cancela-Director i o (var DIR-DAT : FileDatos; val DiR-IND : FileIndice; : STRING79); var DPATH var RESPUESTA NOMBRE-ARCH RENREC REN-KEY TEMPPATH TEMP-OIRLLAVE, DIR-LLAVE I, TEMP-NUMENT NUMEROENTRADA EXISTE StrI , : STRIffi79; : STRING& : DIRREC; : KEY-REC; : STRINü79; : STRINü40; : integer; : boolean; : STRIffi3; begin RESPUESTI4 := ' ' ; NOMBRE-ARCH := ' ' ; TEMPNUN-ENT := O; ObtenerStringRespuesta (RESPUESTA, 3, 8, 'NOMBRE : 6, 4, 'Diqite nombre del directorio a borrar, sin extension', 24, 2); St r-A-Mayusculas (RESPUESTA1i NOMBRE-ARCH := RESPUESTA; RESPUESTA := ' ' ; DIR-LLAVE := ' ' ; Concatena-L lave (DPATH, DIR-LLAVE1; with REN-REC do begin DIR-KEY := ' ' i D IR-KEY := D IR L LAVE ; ARCHIVO := ' '; EXTENSION := ' ' =1 BuscaKey (DIR-IND, NUHERO-ENTRADA, DIR-KEY 1; i f OK then begin EXTENSION := 'DIR'; MCHIVO := NOE1BRE-ARCH; Recorrer-Directorio (DIR-DAT, DIR-IND, EXISTE, ARCHIVO, EXTENSION, DIR-KEY, TEMP-NUMENT) ; ', i f (EXISTE) then begin RESPUESTA := NOMBRE-ARCH; TEMPPATH := Concat (DPATH, RECPUESTCI, ConcatenaLlave (TEWPATH, TEMP-DIRLLAW) ; DIR-KEY := TE&-DIRLLAW; Buscaifey (DIR-IND, NUMEROENTRADA, DIR-KEY 1; i f Ok then I \ ' ) ; ' := 0; repeat ARCHIVO := "; EXTENSION := "; SigKey (DIR-IND, NUMEROJNTRADA, DIR-KEY 1; ObtenRec (DIR-DAT, NUMERO-ENTRADA, REM-REC) ; if OK then begin if ((DIRKEV = TEMP-DIRLLAVE) and (C1RCHIVO <> ' '1 and (EXTENSION 0 ' ' i ithen I:= I t 1 ; end; until ((not OK) or (I <> O)); if í I 0 O 1 then begin Str í1:3, StrI); ColocaError ('ERROR: no se puede cancelar directorio, tiene ' t STRI t ' archivos <ENTER>', 24, 2) end else beg in DIRKEV := TEMP-DIRLLAVE; BuscaKey (DIR-IND, NUIIERO-ENTRADA, DIRKEV) ; CanKey (DIR-IND, NUMEROENTRAIM, DIRKEV) ; CanRec (DIR-DAT, NUMERO-ENTRADA) ; NUMEROENTRADA := TEHP-NUMENT; CanKey (DIR-IND, NUMERO-ENTRADA, DIR-KEY) ; CanRec (DIR-DAT, NUMEROENTRADA) ; Colocar-String ('Directorio cancelado.. 10, 8, 1); end; end; ... ', end else ColocaError ('ERROR: Directorio no existe, presione cualquier tecla para continuar', 24, 2); end; end; RESPUESTA := ' ; Obtener-String-Respuesta (RESPUESTA, O , 1, ' ' 24, 42, 'Presione <ENTER> para continuar', 24, 2); end; , c DESCRIPCION: Este programa simula el manejo de archivos de RS-DOC. Para tal efecto se utiliza una estructura de Btarbol; los comandos que realiza son: DIR : despliega el contenido de un directorio. CHDIR : cambia de directorio, de acuerdo al camino especificado por el usuario MKDIR : construye un subdirectorio. SAVE : salva un archivo en el directorio dado RENAME: renombra un archivo de un directorio DEL : borra un archivo de un directorio FIND : busca un archivo dado y despliega el camino para llegar a el. Si el archivo existe en mas de un directorio, manda todos los caminos por los que se puede llegar a e l , es decir en que directorios esta. RMDIR : cancela un directorio si este se encuentra vacio, en casa contrario, manda un mensaje de error. var RESPUESTA DIR DAT , : CTRING79; : FileDatos: I begin SECPUESTA := ' ' ; ClrScr; Const ruyePanta1l a ( 16, 58 1; Co locarstr inqCentrado í 'UNIVERSIDAD aUTONOMA HETROPOLITFiNA- IZTAPALAPA' 4, 2); Colocar-StringCentrado ('PROYECTO I y I1 7, O); ColacarStringCentrado ('"SIMULA flWJ0 DE DIRECTORIOS Y MCHIVOS MS-DOS" ' 10, 3); Colocar-StringCentrado í 'AUTORES: ROS4 ZURITA VALDOVINOS MAT: a 2 ~ 0 w 14, , o); Colocar-StringCentrado ( ' 15, U); Colocar-StringCentrado ('ABRIL 12 91', 19, 2); Obtener-StrinqRespuesta (RESPUESTA, O, 1, 24, 35, 'Presione (ENTER> para continuar', 24, 2); I n i t Indice; , *, , ', ' I , {apertura del archivo de datos y del archivo de indices) AbreArchivo (DIR-DAT, 'DIR.DAT' Sizeof (DIRREC) 1; i f OK then CIbreIndice (DIR-IND, ' D R I D X ' , MaxLongKey, DUPLICADAS); , {si los archivos no existen se pregunta a l uwsario si desea crearlos} i f not OK then begin ClrScr; ConstruyePantalla (5, 60); repeat Colocar-String ('Presione S para crear los archivos N para salir', 23, 2, O); ColocarStrinq í'S', 23, 11, 2); ColocarStrinq ('N', 23, 37, 2); Obtener-StrinqRespuesta (RESPUESTA, 1, 1, 'El archivo de datos no existe. Se crea W N ) ? 11, 15, 23, 35); i f (Length (RESPUESTA) = U) then Write (Chr (7) i else i f (not íREcPüESTAI11 i n ['St, ' s ' , '11'11) then Write (Chr(7)i; until (RESPUESTAClI i n C'S', 'N', 's', 'n'l); I ", , I N ' , i f (RESPUESTA111 i n C'S', "5'1) then begin CoiocarString ('Creando los archivos de datos y de indices', 13, 15, 2); , Construyekhivo (DIR-DAT, 'DIR.DAT' Sizeof (DIR-REC) i ; ConstruyeIndice (DIR-IND, 'DIR. IDX', MaxLongKey, WPLICADCIS); with NWVO-DIRREC do begin with NWVALLAVE do begin DIRROOT := "; DIR-DES1 := 9 DIR-DES2 := ' ? DIR-DES3 := ' '; 111678 nrUTR3 ---i .z ' DIF-QDQT := ' \ ' i 3 EIP-1 EY := Concat ( D I F R O O T , DIR-DE%, DIR-DES?, DIH-DEC4) ; end i ARCHIVO := ' 9 EXTENSION := ' '; AddRec ( DIR-DAT M E R O E N T R A D A , NUEVO-DIRREC ; Mdkey (QIR-IND, NUMERO-ENTRADA, D I R K E Y i; end [with! DIR-DESI, , end else goto FI NPROGRAHA; {el usuario desea la salida} end; with NUEVO-DIRREC da begin with NUEVA-LLCIVE do begin DIR-ROOT := ' \ DIR-DES1 := ' '.'; D I R O S 2 := ' '; DIR-DES3 := ' f DIR-DES4 := * D I R K E Y := Concat ( D I R R O O T , DIR-DES1, D I R - D E S , DIR-DES3, DIR-DES4); DDIR := D I R K E Y ; end; BuscaKey (DIR-IND, NUIIERO-ENTRCIDA, DIR-KEY ; *. if OK then begin Ob tenRec (DIR-DAT, NUMEROENTRADA, NUEVO-DIRREC) ; DIR-PATH := D I R K E Y ; end else begin Colocar-String('ENTRADCI NO E X I S T E ' + DDIR, 11, 10, O ) ; D I R P A T H := D I R K E Y ; end; end; {whit! DPATH := "; TEMPPATH := ' ' ; repeat RESPUESTA := ' ' ; COMANDO := ' ' ; if (DPATH <> " I then begin TEMPPATH := DPATH; D I R P A T H := DPATH; end; ClrScr; ConstruyePantall a (19, 80) ; ColocarString ('PATH : t D I R P A T H , 5, 4 , O); ColocarString ('NOnBRE : ' 1 6 , 4, O ) ; Colocar-String í'COllANDOC: D i r , cHdir, mKdir, sAve, Rename, dEl, Find, rMir : ColocarString í ' D ' , 24, 12, 2); ColocarStrinq ('H', 24, 18, 2); Colocar-String ('K', 24, 25, 2); Colocar-String ('A', 24, 32, 2); ColocarString ('R', 24, 37, 2); Colocar-String ('E', 24, 46, 21; Colocar-Strinq ('F', 24, SO, 2); Colocar-String í'M', 24, 57, 2); Obtener-StringRespuesta (COMFINDO, 3 , 1 , 'COMANDO : 4, 4 , 24, 64); -e, is M- ..__.. i-irrrunwnn\,\ ", ', - ', 24, 2, O); m-r s.." , --+ * A * - -.----- -- -_ --"-.- if !C@MBNDO <,>; 'S') then begin Obtener-StringRespuesta (DPATH, 3, 40, 'PATH : ', 5, 4, C t r-B-i'íayuscul as (DPATH1; end; DDIR := DPATH; if (COMANDO = "1 then COflANDO := 'X ' ; case COMCINDO of 'Ill: begin Despliega-Directorio (DIR-DAT, DIR-IND, DPATH); end; 'H': begin Cambiar-Di rector io (DIR-DAT , DIR-IND , DPATH , DDIR ) ; end; 'K': begin CrearNuevo-D i rectorio (DIR-DAT, DIR-IND , DPATH i ; end; 'A': SalvarArchivo (DIR-DAT, DIR-IND, DPATH); 'R ' : Renombrar-Arch ivo (DIR-DAT, DIR-IND, DPATH1; 'E': Borrar-Archivo (DIR-DAT, DIR-IND, DPATH); 'F' : Buscar-Archiva (DIR-DAT, DIR-IND, DPATH); Y ' : Cancela-Directorio (DIR-DAT, DIR-IND, DPATH); end; until (COMCINW = 'S'i; CierraArchivo (DIR-DAT); CierraIndice (DIR-INDi ; FINPROGRW: C1rScr ; Colocar-String ('gracias end. ... hasta la vista', 12, 40, 7); ", 24, 6 4 ) ; >I--------------------------------------------------------- { 1 PRINCIPIiA CICCECO.TOL ____-----__I----- {---------------------------------------------------------------------------- (*$A+,IR-* , I type TaStr64 = strinql641; FileDatos = record case Integer of O : íF : file; Primerlibre, Numerali bre, Intl, Int2, : Inteqer); NurnRec 1 : íFil2 : arrayEU..121 of Byte; TaNombre : arrayt1..641 of Char); end; TaKeyStr = str i nqC HaxLonqKey1; TaItem = record DataRef,PaginaRef : Integer; Key : TaKeyStr; end; TaPagina = record ItemsEnPagina : O. .LonqPaqina; : Integer; RefPaqinaAnt : arraytl..LonqPaginal of TaItm; Itwrray end; TaPaqinaPtr = 'TaPaqina; TaCecBusqueda = record Paq i naRef I tem4rrIná ice : I nteqer; end; TaPath = arrayll..HaxAltural of TaSecBusqueda; FileIndice = record DataF : FileDator;; : Boolean; CiDuplKeyn : Integer; KeyL,RR,PP : TaPath; Path end; FileIndicePtr = 'FileIndice; TaStackRec = record Pagina : TaPagina; IndiceFPt r : FileIndicePtr; Pag inaRef : Inteqer; k tuali zado : Boolean; end; TaCtackRecPtr = 'TaCtackRec; TaPaginaStack = arrayll..LongPiiaPaginaI of TaCtackRec; TaPaqinaflap = arrayll..LongPilaPaqinal of Integer; TaRecordBuffer = record case Integer of O : (Pagina : TaStackRec); 1 : íR : array~l..MaxlonqRecDatl of Byte); 2 : (1 : Integer); end; , vor 10status : Integer; OK : Boolean; TaRecBuf : TaRecordBuffer; TaPaginaStk : TaPaginaStack; I n .. -. . 'L 1 3 1 procedure TaChecalOívar DatF : FileDatos; R : Integer); vir I : Integer; begin if IOstatus 0 O then with DatF do begin Wri teln; Writeln(’acceu, I/O error ‘,IOstatus); Writei’kchivo: ’ ) ; I := 1; while OrdíTaNoffibreCIli 0 O do begin Write(TaNombreCI1); I := Succ(1); end; Writeln(’ Record ‘,R); Writeln(’Programa abortado’); Halt; end; end; procedure #tenRec(var DatF R var Buffer begin Ceek(DatF.F,R) ; IOstatus := IOresult; TaCheca IO (DatF,R); BlockRead (DatF .F ,Euf fer ,1 ) ; IOstatus := IOresult; TaCheca IO (DatF,R) ; end; : FileDatos; : Integer; 1; procedure ColocaRec (var DatF: FileDatos; R : Integer; var Buffer 1; begin Seek (DatF F ,R); ICktatus := IOresult; TaChecaIO (DatF,R); BlockWrite(DatF,F,Euffer, 1); IOstatus := IOrewlt; TaChecaIO(DatF,R) ; end; . procedure ConstruyeArchivo(var DatF : Fileüatos; FNombre : TaStr64; LongRec : Integer); begin Assign (DatF F, FNombre 1; IOstatus := IOresiilt; TaChecaIO(DatF, O); Rewrite (DatF .F ,LongRec ; IOstatus := IOresuit; if IOstatus = BF1 then OK := false else . begin TaChecaIOíDatF ,O); DatF.PrimerLibre := -1; DatF.NuineroLibre := O; DatF.int1 := 0; DatF.Int2 := O; Move (DatF Pr imerL I bre, TaRecBuf y E 1; . L.lii.l ”- -*. <”. ---. . . ~ . ~ i ” I-_- ” > . * ~ proceuure kreArchivo(var DatF : FileDatos; FNombre : TaCtr64; LongRec : Integer); begin Assign (DatF F ,FNombre 1; IOstatus := IOresult; TaCheca IO (DatF ,O ; Reset !Da tF .F, LongRec ; IOstatus := IOresult; if IOstatus = 1 then OK := false else begin TaChecaIO (DatF,O) ; Ob tenRec (DatF ,O, TaRecEluf 1; Move íTaRecBuf ,DatF .PrimerL ibre,ü 1; DatF.NumRec := Fi1eSizeíDatF.F); OK := true; end; end; . procedure Cierrakhivoívar DatF : FileDatos); begin DatF.Int2 := DatF.NumRec; Move (DatF .Pr imerL ibre,TaRecBuf ,B ; ColocaRec (DatF,O,TaRecBufI ; Close íDatF.F 1; IOstatus := IOresult; TaChecaIO (DatF,O) ; end; procedure NuevoRec (var DatF : FileDatos; var R : Integer i ; begin if DatF.PrimerLibre = -1 then begin R := DatF.NumRec; DatF.NumRec := Succ (DatF.NumReci end else begin R := DatF.PrimerLibre; ObtenRec íDatF,R,TaRecBuf 1; DatF.PrimerLibre := TaRecBuf .I; DatF.NumeroLibre := DatF.NumeroLibre - 1; end; end; procedure dddRec(var DatF : FileDatos; var R : Integer; 1; var Buffer begin NuevoRec(DatF,R); Co 1ocaRec (DatF ,R ,Buf fer ) ; end; : FileDatos; : Integer); procedure CanRecívar DatF R begin TaRecBuf .I := DatF.PrimerLibre; .7 1 ?, ,r. I r n r " 7. *: r)atF.Priiner!ibre := R; CatF.NumeroLibre := DatF.NumeroLibre + 1; end; ,:function LongFile(var DatF : FileDatw) : Integer; begin LongFile := DatF.NumRec; end; function RecsUsados(var DatF : FileDatosi : Integer; begin RecsUsados := DatF.NumRec - DatF.NuiaeroLibre - 1; end; 1 procedure Init Indice; var I : Integer; begin for I := i to LonqPiiaPaqina do begin TaPaginaCtkC 11.IndiceFPtr := ni 1; TaPaginaCtkCI1 .Actualizado := false; TaPgMapCIl := I ; end; end; procedure TaEmpacar ívar Pagina : TaPagina; KeyL : Integer); var I : Integer; P : arrayCO..MaxIntl of Byte absolute Pagina; begin if KeyL .O MaxLongKey then for I := 1 to LongPagina do Move~Pagina.It~ArrayCIl,P~~I- 1) * (KeyL t 5) end i t 31,KeyL t 5 ) ; procedure TaDeSmpacar(var Pagina : TaPagina; WeyL : Integer); var I : Integer; P : arrayCO..MaxIntl of Byte absolute Pagina; begin i f KeyL 0 MaxLongKey then for I := LongPagina downto 1do Move(PC[I - 1) * (KeyL t 5 ) t 31,Paqina.IteaiClrraytII,KeyL + 5 ) ; end; procedure Construye1ndice(var IdxF FNombre LonqKey, C : Fi lelndice; : TaCtr64; : Integer); var K : Integer; begin K := (LonqKey t Ji*LongPagina t 3 ; ConstruyeAchivo(IdxF.DataF,FNoinbre,K) ; 1dxF.CiDuplKeys := C 0 O; 1dxF.KeyL := LongKey; 1dxF.RR := O; 1dxF.PP := O; end; : Filelndice; pracedure AbreIndicetvar IdxF FNombre : TaCtrb4; , .*_ L * l -11 'e. ___lll. ' _ _ "m?l'3, _ - _.. , 9 r : Integer); var K : Integer; begin K := (LongKey t 51 * LonqPagina t 3; AbreArchivoí IdxF.DataF,FNombre,K); 1dxF.CiDuplKeys := S <'. (5; IdxF.KeyL := LongKey; 1dxF.RR := 1dxF.Da taF. Int1; 1dxF.PP := O; end; 2 procedure Cierraíndiceívar IdxF : FileIndice); var I : Integer; begin for I := 1to LonqPilaPagina do with TaPaginaCtkCII do if IndiceFPtr = ClddriIdxFl then begin IndiceFPtr := nil; if Actualizado then begin TaEmpacar íPaqina ,IdxF KeyL 1; ColocaRecí IdxF.DataF,Pag i naRef ,Pagina); Actualizado := false; end; end; IdxF.DataF.Int1 := 1dxF.W; CierraArchivo(1dxF.DataF) ; end; . procedure TaUltimfí : Integer); var J , K : Integer; begin J := 1; while (TaPgMapCJl O I) and íJ J := J t 1; for K := J to < LongPilaPagina) do - LongPilaPagina - 1 do TaPgMapCKl := TaPgMapEK t 11; TaPgMapCLongPilaPaginal := I ; end; procedure TaObtenerPagina(var IdxF : FileIndice; R : Integer; var PgPtr : TaPaginaPtr); var I : Integer; Encontro : Boolean; begin I := 13; repeat I := I t 1; with TaPaginaCtkCIl do Encontro := (IndiceFPtr = Addr(1dxFi) and (PaginaRef = R); until Encontro or (I = LongPilaPagina); if not Encontro then begin I := TaPgMapC11; with TaPaginaCtkLIl do begin if Actualizado then begin T . T , _____ fn... I-. 1 i c d _. ---- I - . - I - 1' . ColocaRec í IndiceFPt r * .Oa taF ,Pa5 inaF.ef,Pagina ) ; end: ObtenRec í IdxF.DataF ,R ,Pagina 1; TaDesempacar(Pagina,1dxF.KeyL) ; IndiceFPtr := Addr(IdxF1; PaginaRef := R; Actualizado := false; end; end; TaUlt imo(1); PgP t r := Addr (TaPagi naStkC I 1; end; procedure TaNuevaPaqina(var IdxF : FileIndice; var R : Integer; var PgPtr : TaPaqinaPtr); var I: Integer; begin I := TaPqMap[ll; with TaPaginaCtkCII do begin i f Actualizado then begin TaEmpacar(Paqina IndiceFPt r .KeyL 1; Co locaRec( IndiceFPt r I . DataF ,Paq inaRef,Pagina 1; end; NuevoRec (IdxF.DataF,R) ; IndiceFPtr := Addr(1dxF); PaqinaRef := R; Actualizada := false; end; TaUlt iaoi1i ; PqPtr := Addr (TaPaqinaCtk[II); end; I , procedure TaClctualizaPagina(PgPtr : TaPaqinaPtr); var P : TaCtackRecPtr absolute PqPtr; begin P^.Fictualizado := true; end; procedure TaRegresaPaginaivar PgPtr : TaPaginaPtr); var P : TaCtackRecPtr absolute PgPtr; begin with PA do begin CanRec ( IndiceFPtr A DataF,PaqinaRef 1; IndiceFPtr := nil; Actualizado := false; end; end; procedure TaXKey (var K; KeyL : Integer); var Key : TaKeyStr absolute K; begin i f Ord(KeyC01) > KeyL then KeyCOl := Chr(KeyLi; end; function TaCompKeys(var Ki, KZ; 3:lp : Boolean 1 : Integer; var Keyl : TaKeyCtr absolute #1; Key2 : TaKeyCtr absolute K2; begin i f Keyl = Key2 then i f Dup then TaCompKeys := DR1 - DR2 else TaCompKeys := O else if Key1 > Keyl then TaCoRipKeys := 1 else TaCompKeys := - 1; end; procedure LimpiaKey(var IdxF : FileIndice); begin 1dxF.PP := O; end; procedure AddKey(var IdxF : Fileindice; var ProcDatRef : Integer; var ProcKey 1; va r PKey : TaKeyCtr absolute ProcKey; PrPgRef1 , , PrPgRef2, : Integer; C,I,K,L PasoArriba : Boolean; PaginaPtrl, PaginaPtr2 : TaPaginaPtr; Proclteml, ProcItem2 : TaItem; procedure Busca (PrPgRef1 : Integer); var R : Integer; procedure Inserta; begin TaObtenerPagina(IdxF,PrPgRef1,PaginaPtrl); with PaginaPtrlA do begin if ItmsEnPagina { LonqPagina then begin ItemsEnPagina := ItemsEnPagina + 1; for I := ItefasEnPagina downto R + 2 do ItemArray[II := IteaCIrrayEI - 11; ItemArrayCR t 11 := ProcIteml; Pasdrriba := false; end else begin TaNuevaPaqina ( IdxF,PrPgRef2,Pag inaPtr2) ; if R <= Orden then begin if R = Orden then ProcItem2 := ProcIteml else begin ProcItem2 := ItemArrayCOrdenl; for I := Orden downto R t 2 do ItemArrayEIl := ItemArrayCI - 11; ItemArrayER t 11 := ProcIteml; end; for I := 1 to Orden do PaginaPtrY. IteiRClrrayCI1 := ItemArrayCI end else begin R := R - Orden; ProcItem2 := ItemArrayCOrden t 11; t Orden]; JaqinaP:r2'.!temArrayCIl := ItemArraylI t Orden + 11; PaginaPtr2^.!t~mArrayiRl := ProcIteml; for I := Ft + 1 to Ordm do Pa-inaPtr2".ItemcirrayCIl := ItemArrayCI t Orden]; end ; ItemsEnPagina := Orden; PaginaPtrL".ItemsEnPagina := Orden; PaginaPtr2". RefPaginaAnt := ProcItem2.PaginaRef; ProcItem2,PaginaRef := PrPgRef2; ProcIteml := ProcItem2; TaActua 1 izapagina(PaginaPtr2); end; end; TaActua1 izapagina (Pa9inaPtrl ) ; end; begin if PrPgRefl = O then begin PasoClrriba := true; with ProcIteml do begin Key := PKey; DataRef := ProcDatRef; PaginaRef := O; end; end else begin TaObtenerPagina( IdxF ,PrPqRef1,Paginaptr11; with PaginaPtrlA do begin L := 1; R := ItemsEnPagina; repeat K := íL t R ) div 2; C := TaCompKeys(PKey, ItemArrayCKl.Key, ProcDatRef, I temArrayCK1.DataRef, 1dxF.CiDuplKeys ); if C <= O then R := K if C >= - 1; O then L := K t 1; until R { L; if L - R > 1 then begin OK := false; Pasdrriba := false; end else begin if R = O then Busca (RefPaginaAnt) else BuscaiItenArrayCRl.PaginaRef); if PasoCIrriba then Inserta; end; end; end; end; beg in with IdxF do L--<- , !, a ' X Key (Prey e j r L !; Ok := true; Busca (RR); i f PasoArriba then begin PrPgRefl := RR; TaNuevaPagina( IdxF ,RR,Pag inaPtr11; with PaginaPtrl^ do beg i n ItemsEnPagina := 1; RefPaginaAnt := PrPgRefl; ItemArray[ll := Prod teml; end; TaActualizapagina(PaginaPtrl ; end; PP := o; end; end; I \ (*$A+, R- W3* 1 procedure CigKey(var IdxF : FileIndice; var PracDatRef : Integer; var PracKey 1; var PKey : TaKeyCtr absolute Procliey; : Integer; PagPtr : TaPaginaPtr; begin with IdxF do begin i f PP = O then R R := RR else with PathCPPI da begin TaObtenerPagina( IdxF,PaginaRef ,PagP tr 1; R := PagPtr" .ItemArrayCIteiaArrIndicel .PaginaRef ; end; while R O O do begin PP := PP + 1; with PathCPPl do begin PaginaRef := R; ItemArrIndice := O; end; TaOb tenerPagina í IdxF,R,PagP tr 1; R := PagPtr".RefPaginaAnt; end ; if PP C> O then begin while (PP > 11 and (PathCPP I,It d r r Indice = PagPtr *, ItemsEnPagina ) da begin PP := PP - 1; TaObtenerPagina í IdxF,Pa th [PPI .Pag inaRef PagPtr 1; end; i f PathtPP1.ItemArrIndice C PaqPtr* .ItemsEnPagina then with PathCPPl da begin ItemArrIndice := ItemfirrIndice t 1; with PagPtr^. I t e d r r a y í I t ~ r r I m l i c e ldo begin PKey := Key; PracDatRef := DataRef; end; end else PP := O; end; OK := PP C} 0; end; end; , : Fileindice; procedure PrevKey(var IdxF var PracDatRef : Integer; var ProcKey ); var DL n T-i'-. C4- -h--lsn+- (2n-1 - 1 ~ . L_ Ily--LI I*xL uu-I--L. -- -- ~~-~~~ qT-- - : Integer; PayPtr : TaPayinaPtr; beg i n with IdxF do begin i f PP = O then R := RR el5.e idith PathCPP1 do begin TaObtenerPag ina( IdxF,PaqinaRef ,PaqPtr ; ItemArrIndice := Itemíirrindice - 1 ; i f ItemArrIndice = 0 then R := PaqPtr'.RefPaginaAnt else R := PagPtr",ItemArrayCItentCIrrIndicel.PaqinaRef; end; while R 0 O do begin TaObtenerPaqina( IdxF,R,PaqP tr ; PP := PP + 1; with PathCPPl do begin PaqinaRef := R; I teniArrInd ice := PagPtr I temsEnPaqina ; end; with PaqPtrA do R := 1ternArraylItemsEnPaginal.PaqinaRef; end; i f PP 0 O then begin while (PP > 1) and (Path[PPI.ItemflrrIndice = 0) do begin PP := PP 1; TaObtenerPaqi na ( IdxF,Path CPP 1.Paq inaRef,PagPtr ; end; i f PathCPPl.1temArrIndice > O then with PagPtr".ItemArrayCPathCPPl. ItemArrInáiceldo begin PKey := Key; ProcDatRef := DataRef; end else PP := O; end; := PP 0 o; end; end; F. - w. : FileIndice; procedure TaEncontrarKey(var IdxF var ProcDatRef : Integer; var PrwKey )i var PKey : TaKeyStr absolute ProcKey; PrPgRef, C,K,L,R : Integer; RKey : TaKeyStr; PaqPtr : TaPaqinaPtr; begin with IdxF do begin TaXKey (PKey,Keyl) ; OK := false; PP := o; PrPqRef := RR; while íPrPgRef <> 0) and not OK do begin __ -- +,---w--".-,~---.--.,"" .--- <-C.-* .--- PathiPP1.PaqinaRef := PrPgRef; TaObtenerPayiina[ IdxF,PrPqRef ,PagPtr 1; with PaqPtrA do begin L := 1; R := IteisEnPagina; repeat K := í L + R1 div 2; C := TaCompKeysíPKey, I temArrayCK1.Key, O, 1temArrayCKl.DataRef CiDuplKeys 1; i f C (= O then R := K - 1; i f C )= O then L := K + 1; until R < L; i f L - R > 1then begin ProcDatRef := 1tenArrayCKl.DataRef; R := K; OK := true; end; i f R = O then PrPgRef := RefPag inaAnt else PrPqRef := Ite~rrayCR1,PaginaRef; end; Path[PPl.ItemArrIndice := R; end; i f not OK and íPP > O) then begin while (PP > 1) and íPathlPP1,IteniCirrIndice = 0) do PP := PP - 1; i f Path[PPl.ItemArrindice = O then PP := O; end; end; end; , : FileIndice; procedure EncontrarKey (var IdxF var ProcDatRef : Integer; var PrwKey 1; var PKey : TaKeyCtr absolute ProcKey; TempKey : TaKeyStr; begin TaEncontrarKey( IdxF,ProcDa tRef PKey 1; i f not OK and IdxFSiDuplKeys then begin TempKey := PKey; CigKey íIdxF,ProcDatRef ,PKeyi ; OK := OK and íPKey = TempKeyl; end; end; , procedure BuscaKey(var IdxF : FileIndice; var ProcDatRef : Integer; var ProcKeyi; var PKey ; TaKeyStr absolute ProcKey; be in qaEncontrarKey íIdxF,ProcDatRef ,PKey) ; i f not DK then ; CigKey (IdxF,ProcDatRef ,PKey i ? . V I .