end of the function PC_Directive_undef ============================================================================ Parameter: - Returns: - Changes Globals: - ============================================================================
| 1199 | // Changes Globals: - |
| 1200 | //============================================================================ |
| 1201 | int PC_Directive_define(source_t *source) |
| 1202 | { |
| 1203 | token_t token, *t, *last; |
| 1204 | define_t *define; |
| 1205 | |
| 1206 | if (source->skip > 0) return qtrue; |
| 1207 | // |
| 1208 | if (!PC_ReadLine(source, &token)) |
| 1209 | { |
| 1210 | SourceError(source, "#define without name"); |
| 1211 | return qfalse; |
| 1212 | } //end if |
| 1213 | if (token.type != TT_NAME) |
| 1214 | { |
| 1215 | PC_UnreadSourceToken(source, &token); |
| 1216 | SourceError(source, "expected name after #define, found %s", token.string); |
| 1217 | return qfalse; |
| 1218 | } //end if |
| 1219 | //check if the define already exists |
| 1220 | #if DEFINEHASHING |
| 1221 | define = PC_FindHashedDefine(source->definehash, token.string); |
| 1222 | #else |
| 1223 | define = PC_FindDefine(source->defines, token.string); |
| 1224 | #endif //DEFINEHASHING |
| 1225 | if (define) |
| 1226 | { |
| 1227 | if (define->flags & DEFINE_FIXED) |
| 1228 | { |
| 1229 | SourceError(source, "can't redefine %s", token.string); |
| 1230 | return qfalse; |
| 1231 | } //end if |
| 1232 | SourceWarning(source, "redefinition of %s", token.string); |
| 1233 | //unread the define name before executing the #undef directive |
| 1234 | PC_UnreadSourceToken(source, &token); |
| 1235 | if (!PC_Directive_undef(source)) return qfalse; |
| 1236 | //if the define was not removed (define->flags & DEFINE_FIXED) |
| 1237 | #if DEFINEHASHING |
| 1238 | define = PC_FindHashedDefine(source->definehash, token.string); |
| 1239 | #else |
| 1240 | define = PC_FindDefine(source->defines, token.string); |
| 1241 | #endif //DEFINEHASHING |
| 1242 | } //end if |
| 1243 | //allocate define |
| 1244 | define = (define_t *) GetMemory(sizeof(define_t)); |
| 1245 | Com_Memset(define, 0, sizeof(define_t)); |
| 1246 | define->name = (char *) GetMemory(strlen(token.string) + 1); |
| 1247 | strcpy(define->name, token.string); |
| 1248 | //add the define to the source |
| 1249 | #if DEFINEHASHING |
| 1250 | PC_AddDefineToHash(define, source->definehash); |
| 1251 | #else //DEFINEHASHING |
| 1252 | define->next = source->defines; |
| 1253 | source->defines = define; |
| 1254 | #endif //DEFINEHASHING |
| 1255 | //if nothing is defined, just return |
| 1256 | if (!PC_ReadLine(source, &token)) return qtrue; |
| 1257 | //if it is a define with parameters |
| 1258 | if (!PC_WhiteSpaceBeforeToken(&token) && !strcmp(token.string, "(")) |
no test coverage detected