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 {