Mercurial > hg > dmlib
comparison tools/fanalyze.c @ 2228:02d17784fdef
Variables -> struct cleanup.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 14 Jun 2019 18:33:10 +0300 |
parents | 837c79747ea4 |
children | 72e15cc14927 |
comparison
equal
deleted
inserted
replaced
2227:5046458d6c34 | 2228:02d17784fdef |
---|---|
227 | 227 |
228 int argParseGrepValue(const char *arg, const int mode) | 228 int argParseGrepValue(const char *arg, const int mode) |
229 { | 229 { |
230 const char *specsep = strchr(arg, ':'); | 230 const char *specsep = strchr(arg, ':'); |
231 char *vspec, *vstr, *vsep; | 231 char *vspec, *vstr, *vsep; |
232 int vdisp = DMGS_HEX, vtype = -1, ret = DMERR_OK, nvalues; | 232 DMGrepValue val; |
233 int ret = DMERR_OK; | |
233 BOOL more; | 234 BOOL more; |
234 Uint32 vvalues[SET_MAX_GREPLIST]; | 235 |
235 BOOL vwildcards[SET_MAX_GREPLIST]; | 236 memset(&val, 0, sizeof(val)); |
236 | |
237 memset(vwildcards, 0, sizeof(vwildcards)); | |
238 | 237 |
239 if (setMode != FA_ANALYZE && setMode != mode) | 238 if (setMode != FA_ANALYZE && setMode != mode) |
240 { | 239 { |
241 dmErrorMsg("Options specifying multiple operating modes can't be used.\n"); | 240 dmErrorMsg("Options specifying multiple operating modes can't be used.\n"); |
242 return DMERR_INVALID_ARGS; | 241 return DMERR_INVALID_ARGS; |
275 } | 274 } |
276 | 275 |
277 // Get value bit size | 276 // Get value bit size |
278 if (strncmp(vtmp, "8", 1) == 0) | 277 if (strncmp(vtmp, "8", 1) == 0) |
279 { | 278 { |
280 vtype = DMGV_UINT8; | 279 val.type = DMGV_UINT8; |
281 vtmp += 1; | 280 vtmp += 1; |
282 } | 281 } |
283 else | 282 else |
284 if (strncmp(vtmp, "16", 2) == 0) | 283 if (strncmp(vtmp, "16", 2) == 0) |
285 { | 284 { |
286 vtype = vendianess ? DMGV_UINT16_LE : DMGV_UINT16_BE; | 285 val.type = vendianess ? DMGV_UINT16_LE : DMGV_UINT16_BE; |
287 vtmp += 2; | 286 vtmp += 2; |
288 } | 287 } |
289 else | 288 else |
290 if (strncmp(vtmp, "32", 2) == 0) | 289 if (strncmp(vtmp, "32", 2) == 0) |
291 { | 290 { |
292 vtype = vendianess ? DMGV_UINT32_LE : DMGV_UINT32_BE; | 291 val.type = vendianess ? DMGV_UINT32_LE : DMGV_UINT32_BE; |
293 vtmp += 2; | 292 vtmp += 2; |
294 } | 293 } |
295 else | 294 else |
296 { | 295 { |
297 ret = dmError(DMERR_INVALID_ARGS, | 296 ret = dmError(DMERR_INVALID_ARGS, |
301 } | 300 } |
302 | 301 |
303 switch (tolower(*vtmp)) | 302 switch (tolower(*vtmp)) |
304 { | 303 { |
305 case 'd': | 304 case 'd': |
306 vdisp = DMGS_DEC; | 305 val.disp = DMGS_DEC; |
307 break; | 306 break; |
308 | 307 |
309 case 'x': case 'h': | 308 case 'x': case 'h': |
310 vdisp = DMGS_HEX; | 309 val.disp = DMGS_HEX; |
311 break; | 310 break; |
312 | 311 |
313 case 0: | 312 case 0: |
314 break; | 313 break; |
315 | 314 |
321 } | 320 } |
322 } | 321 } |
323 | 322 |
324 // Get list of values | 323 // Get list of values |
325 char *vtmp = vstr; | 324 char *vtmp = vstr; |
326 nvalues = 0; | |
327 do | 325 do |
328 { | 326 { |
329 if (nvalues >= SET_MAX_GREPLIST) | 327 if (val.nvalues >= SET_MAX_GREPLIST) |
330 { | 328 { |
331 ret = dmError(DMERR_BOUNDS, | 329 ret = dmError(DMERR_BOUNDS, |
332 "Too many greplist values specified '%s'.\n", | 330 "Too many greplist values specified '%s'.\n", |
333 vstr); | 331 vstr); |
334 goto out; | 332 goto out; |
342 else | 340 else |
343 more = FALSE; | 341 more = FALSE; |
344 | 342 |
345 if (vtmp[0] == '#' || vtmp[0] == '?') | 343 if (vtmp[0] == '#' || vtmp[0] == '?') |
346 { | 344 { |
347 vwildcards[nvalues] = TRUE; | 345 val.vwildcards[val.nvalues] = TRUE; |
348 if (mode == FA_OFFSET) | 346 if (mode == FA_OFFSET) |
349 { | 347 { |
350 ret = dmError(DMERR_INVALID_ARGS, | 348 ret = dmError(DMERR_INVALID_ARGS, |
351 "Offset mode does not allow wildcard values.\n"); | 349 "Offset mode does not allow wildcard values.\n"); |
352 goto out; | 350 goto out; |
353 } | 351 } |
354 } | 352 } |
355 else | 353 else |
356 if (!dmGetIntVal(vtmp, &vvalues[nvalues], NULL)) | 354 if (!dmGetIntVal(vtmp, &val.values[val.nvalues], NULL)) |
357 { | 355 { |
358 ret = dmError(DMERR_INVALID_ARGS, | 356 ret = dmError(DMERR_INVALID_ARGS, |
359 "Not a valid integer value '%s'.\n", | 357 "Not a valid integer value '%s'.\n", |
360 vtmp); | 358 vtmp); |
361 goto out; | 359 goto out; |
362 } | 360 } |
363 | 361 |
364 nvalues++; | 362 val.nvalues++; |
365 | 363 |
366 if (more) | 364 if (more) |
367 vtmp = vsep + 1; | 365 vtmp = vsep + 1; |
368 } while (more); | 366 } while (more); |
369 | 367 |
370 if (vwildcards[0]) | 368 if (val.vwildcards[0]) |
371 { | 369 { |
372 ret = dmError(DMERR_INVALID_ARGS, | 370 ret = dmError(DMERR_INVALID_ARGS, |
373 "First grep value can not be a wildcard.\n"); | 371 "First grep value can not be a wildcard.\n"); |
374 goto out; | 372 goto out; |
375 } | 373 } |
376 | 374 |
377 if (mode == FA_GREP) | 375 if (mode == FA_GREP) |
378 { | 376 { |
379 // Check if we need to guess size | 377 // Check if we need to guess size |
380 if (vtype < 0) | 378 if (val.type < 0) |
381 { | 379 { |
382 for (int n = DMGV_last; n >= 0; n--) | 380 for (int n = DMGV_last; n >= 0; n--) |
383 { | 381 { |
384 const DMGrepType *def = &dmGrepTypes[n]; | 382 const DMGrepType *def = &dmGrepTypes[n]; |
385 if (vvalues[0] <= def->nmax) | 383 if (val.values[0] <= def->nmax) |
386 vtype = n; | 384 val.type = n; |
387 } | 385 } |
388 } | 386 } |
389 | 387 |
390 if (vtype < 0) | 388 if (val.type < 0) |
391 { | 389 { |
392 ret = dmError(DMERR_INVALID_ARGS, | 390 ret = dmError(DMERR_INVALID_ARGS, |
393 "Could not guess value type for '%s'.\n", | 391 "Could not guess value type for '%s'.\n", |
394 arg); | 392 arg); |
395 goto out; | 393 goto out; |
396 } | 394 } |
397 | 395 |
398 // Check range | 396 // Check range |
399 for (int n = 0; n < nvalues; n++) | 397 for (int n = 0; n < val.nvalues; n++) |
400 if (!vwildcards[n] && vvalues[n] > dmGrepTypes[vtype].nmax) | 398 if (!val.vwildcards[n] && val.values[n] > dmGrepTypes[val.type].nmax) |
401 { | 399 { |
402 ret = dmError(DMERR_INVALID_ARGS, | 400 ret = dmError(DMERR_INVALID_ARGS, |
403 "Integer value %d <= %d <= %d out of range for type %s.\n", | 401 "Integer value %d <= %d <= %d out of range for type %s.\n", |
404 vvalues[n], 0, dmGrepTypes[vtype].nmax, dmGrepTypes[vtype].name); | 402 val.values[n], 0, dmGrepTypes[val.type].nmax, |
403 dmGrepTypes[val.type].name); | |
405 | 404 |
406 goto out; | 405 goto out; |
407 } | 406 } |
408 } | 407 } |
409 else | 408 else |
410 if (mode == FA_OFFSET) | 409 if (mode == FA_OFFSET) |
411 { | 410 { |
412 if (vtype < 0) | 411 if (val.type < 0) |
413 vtype = DMGV_UINT8; | 412 val.type = DMGV_UINT8; |
414 } | 413 } |
415 | 414 |
416 if (nsetGrepValues < SET_MAX_VALUES) | 415 if (nsetGrepValues < SET_MAX_VALUES) |
417 { | 416 { |
418 DMGrepValue *node = &setGrepValues[nsetGrepValues++]; | 417 DMGrepValue *node = &setGrepValues[nsetGrepValues++]; |
419 | 418 memcpy(node, &val, sizeof(val)); |
420 node->type = vtype; | |
421 node->disp = vdisp; | |
422 node->nvalues = nvalues; | |
423 memcpy(node->values, vvalues, sizeof(vvalues[0]) * nvalues); | |
424 memcpy(node->vwildcards, vwildcards, sizeof(vwildcards[0]) * nvalues); | |
425 | 419 |
426 dmMsg(1, "Grep %ss : ", | 420 dmMsg(1, "Grep %ss : ", |
427 dmGrepTypes[vtype].name); | 421 dmGrepTypes[val.type].name); |
428 | 422 |
429 dmPrintGrepValueList(node, FALSE, NULL, 0); | 423 dmPrintGrepValueList(node, FALSE, NULL, 0); |
430 } | 424 } |
431 else | 425 else |
432 { | 426 { |