Remove static label from game functions
[kraptor.git] / src / datafind.c
blobc5fa192278ab8863db6a95593e1a04a72800f874
1 // --------------------------------------------------------
2 // datafind.c
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!!!
11 // COOL!
12 // --------------------------------------------------------
14 #ifndef _KRONO_DATAFIND_C
15 #define _KRONO_DATAFIND_C
17 #include <allegro.h>
18 #include "datafind.h"
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)
29 char name[512];
30 char name2[512];
31 int recurse = FALSE;
32 int pos, c;
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
41 pos = 0;
43 while ((c = ugetxc(&objectname)) != 0) {
44 if ((c == '#') || (c == '/') || (c == OTHER_PATH_SEPARATOR)) {
45 recurse = TRUE;
46 break;
48 pos += usetc(name+pos, c);
51 usetc(name+pos, 0);
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) );
59 ustrupr(name2);
61 if (ustrstr( name2 , name ) == NULL) {
62 if (recurse) {
63 if (dat[pos].type == DAT_FILE)
64 return fuzzy_find_datafile_object(dat[pos].dat, objectname);
65 else
66 return NULL;
69 else
70 return (DATAFILE*)dat+pos; // lo encontro
73 // el objeto no esta... shit!
74 return NULL;
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)
84 char name[512];
85 int recurse = FALSE;
86 int pos, c;
88 // obtener el nombre de archivo
89 pos = 0;
91 while ((c = ugetxc(&objectname)) != 0) {
92 if ((c == '#') || (c == '/') || (c == OTHER_PATH_SEPARATOR)) {
93 recurse = TRUE;
94 break;
96 pos += usetc(name+pos, c);
99 usetc(name+pos, 0);
101 // buscar el objeto
102 for (pos=0; dat[pos].type != DAT_END; pos++) {
103 if (ustricmp(name, get_datafile_property(dat+pos, DAT_NAME)) == 0) {
104 if (recurse) {
105 if (dat[pos].type == DAT_FILE)
106 return find_datafile_object_type(dat[pos].dat, objectname, type_required);
107 else
108 return NULL;
110 else
111 if (dat[pos].type == type_required) return (DATAFILE*)dat+pos; // lo encontro
115 // no esta, shit...
116 return NULL;
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)
131 char name[512];
132 char name2[512];
133 int recurse = FALSE;
134 int pos, c;
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
143 pos = 0;
145 while ((c = ugetxc(&objectname)) != 0) {
146 if ((c == '#') || (c == '/') || (c == OTHER_PATH_SEPARATOR)) {
147 recurse = TRUE;
148 break;
150 pos += usetc(name+pos, c);
153 usetc(name+pos, 0);
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) );
163 ustrupr(name2);
165 if (ustrstr( name2 , name ) == NULL) {
166 if (recurse) {
167 if (dat[pos].type == DAT_FILE)
168 return fuzzy_find_datafile_object_type(dat[pos].dat, objectname, type_required);
169 else
170 return NULL;
173 else
174 if (dat[pos].type == type_required ) return (DATAFILE*)dat+pos; // lo encontro
177 // el objeto no esta... shit!
178 return NULL;
182 #endif