1 // --------------------------------------------------------
3 // Funciones de busqueda avanzada de objetos dentro de un archivo DAT
4 // --------------------------------------------------------
5 // Copyright (c) 2002, Kronoman
6 // Escrito por Kronoman - Republica Argentina
7 // En memoria de mi querido padre
8 // --------------------------------------------------------
9 // Funcion para buscar un objeto en un datafile.
10 // Busca primero el verdadero, si no existe, busca por aproximacion!!!
12 // --------------------------------------------------------
14 #ifndef _KRONO_DATAFIND_C
15 #define _KRONO_DATAFIND_C
20 // --------------------------------------------------------
21 // fuzzy_find_datafile_object
22 // Busca un objeto por nombre aproximado en un archivo DAT
23 // basado en el codigo de allegro en el archivo datafile.c
24 // IGNORA MAYUSCULAS/MINUSCULAS
25 // IGNORA TIPO DE OBJETO (puede devolver cualquier tipo)
26 // --------------------------------------------------------
27 DATAFILE
*fuzzy_find_datafile_object(AL_CONST DATAFILE
*dat
, AL_CONST
char *objectname
)
35 // primero ver si hay un archivo con el mismo nombre en la manera estandard
36 // DATAFILE *tmp = find_datafile_object(dat, objectname); // debug
37 // if (tmp != NULL) return tmp;
40 // sacar el nombre de archivo
43 while ((c
= ugetxc(&objectname
)) != 0) {
44 if ((c
== '#') || (c
== '/') || (c
== OTHER_PATH_SEPARATOR
)) {
48 pos
+= usetc(name
+pos
, c
);
53 ustrupr(name
); // pasar a mayusculas
55 // buscar el objeto pedido (busca nombre aproximado)
56 for (pos
=0; dat
[pos
].type
!= DAT_END
; pos
++) {
57 // obtener nombre y pasarlo a mayusculas
58 ustrcpy(name2
, get_datafile_property(dat
+pos
, DAT_NAME
) );
61 if (ustrstr( name2
, name
) == NULL
) {
63 if (dat
[pos
].type
== DAT_FILE
)
64 return fuzzy_find_datafile_object(dat
[pos
].dat
, objectname
);
70 return (DATAFILE
*)dat
+pos
; // lo encontro
73 // el objeto no esta... shit!
77 // --------------------------------------------------------
78 // find_datafile_object_type
79 // busca un objeto en un datafile del tipo requerido
80 // en type_required pasar el tipo, ejemplo: DAT_BITMAP
81 // --------------------------------------------------------
82 DATAFILE
*find_datafile_object_type(AL_CONST DATAFILE
*dat
, AL_CONST
char *objectname
, int type_required
)
88 // obtener el nombre de archivo
91 while ((c
= ugetxc(&objectname
)) != 0) {
92 if ((c
== '#') || (c
== '/') || (c
== OTHER_PATH_SEPARATOR
)) {
96 pos
+= usetc(name
+pos
, c
);
102 for (pos
=0; dat
[pos
].type
!= DAT_END
; pos
++) {
103 if (ustricmp(name
, get_datafile_property(dat
+pos
, DAT_NAME
)) == 0) {
105 if (dat
[pos
].type
== DAT_FILE
)
106 return find_datafile_object_type(dat
[pos
].dat
, objectname
, type_required
);
111 if (dat
[pos
].type
== type_required
) return (DATAFILE
*)dat
+pos
; // lo encontro
121 // --------------------------------------------------------
122 // fuzzy_find_datafile_object_type
123 // Busca un objeto por nombre aproximado en un archivo DAT
124 // basado en el codigo de allegro en el archivo datafile.c
125 // IGNORA MAYUSCULAS/MINUSCULAS
126 // NO IGNORA TIPO DE OBJETO
127 // Pasar en type_required el tipo de objeto; ej: DAT_BITMAP
128 // --------------------------------------------------------
129 DATAFILE
*fuzzy_find_datafile_object_type(AL_CONST DATAFILE
*dat
, AL_CONST
char *objectname
, int type_required
)
137 // primero ver si hay un archivo con el mismo nombre en la manera estandard
138 // DATAFILE *tmp = find_datafile_object_type(dat, objectname, type_required);
139 // if (tmp != NULL) return tmp;
142 // sacar el nombre de archivo
145 while ((c
= ugetxc(&objectname
)) != 0) {
146 if ((c
== '#') || (c
== '/') || (c
== OTHER_PATH_SEPARATOR
)) {
150 pos
+= usetc(name
+pos
, c
);
155 ustrupr(name
); // pasar a mayusculas
157 // buscar el objeto pedido (busca nombre aproximado)
158 // se fija si el objeto coincide con el tipo requerido
160 for (pos
=0; dat
[pos
].type
!= DAT_END
; pos
++) {
161 // obtener nombre y pasarlo a mayusculas
162 ustrcpy(name2
, get_datafile_property(dat
+pos
, DAT_NAME
) );
165 if (ustrstr( name2
, name
) == NULL
) {
167 if (dat
[pos
].type
== DAT_FILE
)
168 return fuzzy_find_datafile_object_type(dat
[pos
].dat
, objectname
, type_required
);
174 if (dat
[pos
].type
== type_required
) return (DATAFILE
*)dat
+pos
; // lo encontro
177 // el objeto no esta... shit!