comparison tools/objlink.c @ 958:985225a93aeb

Add error code parameter to dmError() and dmErrorVA().
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 27 Feb 2015 03:58:25 +0200
parents fc272f5f2d15
children 848a88ce7a57
comparison
equal deleted inserted replaced
957:b66653c9acb3 958:985225a93aeb
205 */ 205 */
206 void reserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType) 206 void reserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType)
207 { 207 {
208 if (startAddr > endAddr) 208 if (startAddr > endAddr)
209 { 209 {
210 dmError("ERROR! Block '%s' has startAddr=$%.4x > endAddr=$%.4x!\n", 210 dmErrorMsg("ERROR! Block '%s' has startAddr=$%.4x > endAddr=$%.4x!\n",
211 blockName, startAddr, endAddr); 211 blockName, startAddr, endAddr);
212 exit(4); 212 exit(4);
213 } 213 }
214 214
215 if (nmemBlocks < MAX_FILENAMES) 215 if (nmemBlocks < MAX_FILENAMES)
220 memBlocks[nmemBlocks].type = blockType; 220 memBlocks[nmemBlocks].type = blockType;
221 nmemBlocks++; 221 nmemBlocks++;
222 } 222 }
223 else 223 else
224 { 224 {
225 dmError("Maximum number of memBlock definitions (%d) exceeded!\n", 225 dmErrorMsg("Maximum number of memBlock definitions (%d) exceeded!\n",
226 MAX_FILENAMES); 226 MAX_FILENAMES);
227 exit(4); 227 exit(4);
228 } 228 }
229 } 229 }
230 230
243 243
244 // Define reserved section 244 // Define reserved section
245 // Create a copy of the argument 245 // Create a copy of the argument
246 if ((str = dm_strdup(arg)) == NULL) 246 if ((str = dm_strdup(arg)) == NULL)
247 { 247 {
248 dmError("Could not allocate temporary string!\n"); 248 dmErrorMsg("Could not allocate temporary string!\n");
249 exit(128); 249 exit(128);
250 } 250 }
251 251
252 // Get start address 252 // Get start address
253 if ((sep = strchr(str, '-')) == NULL && 253 if ((sep = strchr(str, '-')) == NULL &&
254 (sep = strchr(str, ':')) == NULL) 254 (sep = strchr(str, ':')) == NULL)
255 { 255 {
256 dmError("Section definition '%s' invalid.\n", arg); 256 dmErrorMsg("Section definition '%s' invalid.\n", arg);
257 goto error; 257 goto error;
258 } 258 }
259 sectMode = *sep; 259 sectMode = *sep;
260 *sep = 0; 260 *sep = 0;
261 261
262 // Get value 262 // Get value
263 if (!dmGetIntVal(str, sectStart)) 263 if (!dmGetIntVal(str, sectStart))
264 { 264 {
265 dmError("Section start address '%s' in '%s' invalid.\n", str, arg); 265 dmErrorMsg("Section start address '%s' in '%s' invalid.\n", str, arg);
266 goto error; 266 goto error;
267 } 267 }
268 268
269 // Check for name 269 // Check for name
270 namesep = strchr(sep + 1, ','); 270 namesep = strchr(sep + 1, ',');
272 { 272 {
273 *namesep = 0; 273 *namesep = 0;
274 namesep++; 274 namesep++;
275 if (*namesep == 0) 275 if (*namesep == 0)
276 { 276 {
277 dmError("Section definition '%s' name is empty. Either specify name or leave it out.\n", 277 dmErrorMsg("Section definition '%s' name is empty. Either specify name or leave it out.\n",
278 arg); 278 arg);
279 goto error; 279 goto error;
280 } 280 }
281 *sectName = dm_strdup(namesep); 281 *sectName = dm_strdup(namesep);
282 } 282 }
283 else 283 else
284 if (namesep != NULL) 284 if (namesep != NULL)
285 { 285 {
286 dmError("Section definition does not allow a name, syntax error in '%s' at '%s'.\n", 286 dmErrorMsg("Section definition does not allow a name, syntax error in '%s' at '%s'.\n",
287 arg, namesep); 287 arg, namesep);
288 goto error; 288 goto error;
289 } 289 }
290 290
291 // Get end address or length 291 // Get end address or length
292 if (!dmGetIntVal(sep + 1, &tmpi)) 292 if (!dmGetIntVal(sep + 1, &tmpi))
293 { 293 {
294 dmError("Section %s '%s' in '%s' invalid.\n", 294 dmErrorMsg("Section %s '%s' in '%s' invalid.\n",
295 sectMode == '-' ? "end address" : "length", 295 sectMode == '-' ? "end address" : "length",
296 sep + 1, arg); 296 sep + 1, arg);
297 goto error; 297 goto error;
298 } 298 }
299 299
303 } 303 }
304 else 304 else
305 { 305 {
306 if (tmpi < *sectStart) 306 if (tmpi < *sectStart)
307 { 307 {
308 dmError("Section start address > end address in '%s'.\n", 308 dmErrorMsg("Section start address > end address in '%s'.\n",
309 arg); 309 arg);
310 goto error; 310 goto error;
311 } 311 }
312 *sectEnd = tmpi; 312 *sectEnd = tmpi;
313 } 313 }
330 if ((sep = strrchr(arg, ':')) != NULL) 330 if ((sep = strrchr(arg, ':')) != NULL)
331 { 331 {
332 *sep = 0; 332 *sep = 0;
333 if (!dmGetIntVal(sep + 1, &tmpi)) 333 if (!dmGetIntVal(sep + 1, &tmpi))
334 { 334 {
335 dmError("Invalid %s address '%s' specified for '%s'.\n", 335 dmErrorMsg("Invalid %s address '%s' specified for '%s'.\n",
336 desc, sep + 1, arg); 336 desc, sep + 1, arg);
337 return FALSE; 337 return FALSE;
338 } 338 }
339 hasAddr = TRUE; 339 hasAddr = TRUE;
340 } 340 }
341 else 341 else
342 if (requireAddr) 342 if (requireAddr)
343 { 343 {
344 dmError("No %s loading address specified for '%s'.\n", desc, arg); 344 dmErrorMsg("No %s loading address specified for '%s'.\n", desc, arg);
345 return FALSE; 345 return FALSE;
346 } 346 }
347 347
348 srcFiles[nsrcFiles].filename = arg; 348 srcFiles[nsrcFiles].filename = arg;
349 srcFiles[nsrcFiles].type = hasAddr ? type1 : type2; 349 srcFiles[nsrcFiles].type = hasAddr ? type1 : type2;
382 break; 382 break;
383 383
384 case 6: 384 case 6:
385 // Allow overlapping segments 385 // Allow overlapping segments
386 optAllowOverlap = TRUE; 386 optAllowOverlap = TRUE;
387 dmError("Warning, allowing overlapping data.\n"); 387 dmErrorMsg("Warning, allowing overlapping data.\n");
388 break; 388 break;
389 389
390 case 7: 390 case 7:
391 // Set memory model 391 // Set memory model
392 optMemModel = atoi(optArg); 392 optMemModel = atoi(optArg);
393 if (optMemModel < 0 || optMemModel >= nmemoryModels) 393 if (optMemModel < 0 || optMemModel >= nmemoryModels)
394 { 394 {
395 dmError("Invalid memory model number %i!\n", optMemModel); 395 dmErrorMsg("Invalid memory model number %i!\n", optMemModel);
396 return FALSE; 396 return FALSE;
397 } 397 }
398 break; 398 break;
399 399
400 case 8: 400 case 8:
415 case 'd': 415 case 'd':
416 optLinkFileFormat = FMT_DECIMAL; 416 optLinkFileFormat = FMT_DECIMAL;
417 break; 417 break;
418 418
419 default: 419 default:
420 dmError("Invalid/unknown linker file format '%s'!\n", 420 dmErrorMsg("Invalid/unknown linker file format '%s'!\n",
421 optArg); 421 optArg);
422 return FALSE; 422 return FALSE;
423 } 423 }
424 break; 424 break;
425 425
433 { 433 {
434 case 'b': optInitValueType = 1; break; 434 case 'b': optInitValueType = 1; break;
435 case 'w': optInitValueType = 2; break; 435 case 'w': optInitValueType = 2; break;
436 case 'd': optInitValueType = 4; break; 436 case 'd': optInitValueType = 4; break;
437 default: 437 default:
438 dmError("Invalid init value type '%c' specified for '%s'.\n", 438 dmErrorMsg("Invalid init value type '%c' specified for '%s'.\n",
439 p[1], optArg); 439 p[1], optArg);
440 return FALSE; 440 return FALSE;
441 } 441 }
442 } 442 }
443 if (!dmGetIntVal(optArg, &tmpi)) 443 if (!dmGetIntVal(optArg, &tmpi))
444 { 444 {
445 dmError("Invalid initvalue '%s'.\n", optArg); 445 dmErrorMsg("Invalid initvalue '%s'.\n", optArg);
446 return FALSE; 446 return FALSE;
447 } 447 }
448 optInitValue = tmpi; 448 optInitValue = tmpi;
449 break; 449 break;
450 450
489 optLoadAddress = LA_NONE; 489 optLoadAddress = LA_NONE;
490 else 490 else
491 { 491 {
492 if (!dmGetIntVal(optArg, &tmpi)) 492 if (!dmGetIntVal(optArg, &tmpi))
493 { 493 {
494 dmError("Invalid loading address '%s'.\n", optArg); 494 dmErrorMsg("Invalid loading address '%s'.\n", optArg);
495 return FALSE; 495 return FALSE;
496 } 496 }
497 if (tmpi >= 64*1024) 497 if (tmpi >= 64*1024)
498 { 498 {
499 dmError("Invalid or insane loading address %d/$%x!\n", 499 dmErrorMsg("Invalid or insane loading address %d/$%x!\n",
500 tmpi); 500 tmpi);
501 return FALSE; 501 return FALSE;
502 } 502 }
503 optLoadAddress = tmpi; 503 optLoadAddress = tmpi;
504 } 504 }
505 break; 505 break;
506 506
507 default: 507 default:
508 dmError("Unknown argument '%s'.\n", currArg); 508 dmErrorMsg("Unknown argument '%s'.\n", currArg);
509 return FALSE; 509 return FALSE;
510 } 510 }
511 511
512 return TRUE; 512 return TRUE;
513 } 513 }
520 Uint16 tmpAddr; 520 Uint16 tmpAddr;
521 521
522 // Open the input file 522 // Open the input file
523 if ((f = fopen(filename, "rb")) == NULL) 523 if ((f = fopen(filename, "rb")) == NULL)
524 { 524 {
525 dmError("Error opening input file '%s' (%s).\n", 525 dmErrorMsg("Error opening input file '%s' (%s).\n",
526 filename, strerror(errno)); 526 filename, strerror(errno));
527 return 1; 527 return 1;
528 } 528 }
529 529
530 // Get filesize 530 // Get filesize
531 if ((dataSize = dmGetFileSize(f) - 2) < 0) 531 if ((dataSize = dmGetFileSize(f) - 2) < 0)
532 { 532 {
533 dmError("Error getting file size for '%s'.\n", filename); 533 dmErrorMsg("Error getting file size for '%s'.\n", filename);
534 return 6; 534 return 6;
535 } 535 }
536 536
537 // Get loading address 537 // Get loading address
538 if (!dm_fread_le16(f, &tmpAddr)) 538 if (!dm_fread_le16(f, &tmpAddr))
539 { 539 {
540 dmError("Error reading input file '%s' (%s).\n", 540 dmErrorMsg("Error reading input file '%s' (%s).\n",
541 filename, strerror(errno)); 541 filename, strerror(errno));
542 return 2; 542 return 2;
543 } 543 }
544 544
545 // Show information 545 // Show information
578 int dataSize, endAddr; 578 int dataSize, endAddr;
579 579
580 // Open the input file 580 // Open the input file
581 if ((f = fopen(filename, "rb")) == NULL) 581 if ((f = fopen(filename, "rb")) == NULL)
582 { 582 {
583 dmError("Error opening input file '%s' (%s).\n", 583 dmErrorMsg("Error opening input file '%s' (%s).\n",
584 filename, strerror(errno)); 584 filename, strerror(errno));
585 return 1; 585 return 1;
586 } 586 }
587 587
588 // Get filesize 588 // Get filesize
589 if ((dataSize = dmGetFileSize(f)) < 0) 589 if ((dataSize = dmGetFileSize(f)) < 0)
590 { 590 {
591 dmError("Error getting file size for '%s'.\n", filename); 591 dmErrorMsg("Error getting file size for '%s'.\n", filename);
592 return 6; 592 return 6;
593 } 593 }
594 594
595 // Show information 595 // Show information
596 endAddr = destAddr + dataSize - 1; 596 endAddr = destAddr + dataSize - 1;
629 629
630 // Create label name from filename 630 // Create label name from filename
631 tmpStr = dm_strdup(blockName); 631 tmpStr = dm_strdup(blockName);
632 if (tmpStr == NULL) 632 if (tmpStr == NULL)
633 { 633 {
634 dmError("Could not allocate memory for string '%s'!\n", 634 dmErrorMsg("Could not allocate memory for string '%s'!\n",
635 blockName); 635 blockName);
636 return -1; 636 return -1;
637 } 637 }
638 638
639 if ((t = strrchr(tmpStr, '/'))) 639 if ((t = strrchr(tmpStr, '/')))
773 argHandleOpt, NULL, OPTH_BAILOUT)) 773 argHandleOpt, NULL, OPTH_BAILOUT))
774 exit(1); 774 exit(1);
775 775
776 if (nsrcFiles < 1) 776 if (nsrcFiles < 1)
777 { 777 {
778 dmError("Nothing to do. (try --help)\n"); 778 dmErrorMsg("Nothing to do. (try --help)\n");
779 exit(0); 779 exit(0);
780 } 780 }
781 781
782 // Allocate memory 782 // Allocate memory
783 memModel = &memoryModels[optMemModel]; 783 memModel = &memoryModels[optMemModel];
785 optMemModel, memModel->name, memModel->size); 785 optMemModel, memModel->name, memModel->size);
786 786
787 memory = (Uint8 *) dmMalloc(memModel->size + 32); 787 memory = (Uint8 *) dmMalloc(memModel->size + 32);
788 if (memory == NULL) 788 if (memory == NULL)
789 { 789 {
790 dmError("Could not allocate memory.\n"); 790 dmErrorMsg("Could not allocate memory.\n");
791 exit(2); 791 exit(2);
792 } 792 }
793 793
794 // Initialize memory 794 // Initialize memory
795 dmMsg(1, "Initializing memory with "); 795 dmMsg(1, "Initializing memory with ");
870 } 870 }
871 } 871 }
872 872
873 if (!optAllowOverlap && hasOverlaps) 873 if (!optAllowOverlap && hasOverlaps)
874 { 874 {
875 dmError("Error occured, overlaps not allowed.\n"); 875 dmErrorMsg("Error occured, overlaps not allowed.\n");
876 exit(5); 876 exit(5);
877 } 877 }
878 878
879 // Find out start and end-addresses 879 // Find out start and end-addresses
880 startAddr = memModel->size; 880 startAddr = memModel->size;
894 } 894 }
895 } 895 }
896 896
897 if (startAddr >= memModel->size || endAddr < startAddr) 897 if (startAddr >= memModel->size || endAddr < startAddr)
898 { 898 {
899 dmError("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n", startAddr, endAddr); 899 dmErrorMsg("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n", startAddr, endAddr);
900 exit(8); 900 exit(8);
901 } 901 }
902 902
903 // Output linkfile 903 // Output linkfile
904 if (optLinkFileName) 904 if (optLinkFileName)
905 { 905 {
906 dmMsg(1, "Writing linkfile to '%s'\n", optLinkFileName); 906 dmMsg(1, "Writing linkfile to '%s'\n", optLinkFileName);
907 if ((dfile = fopen(optLinkFileName, "wb")) == NULL) 907 if ((dfile = fopen(optLinkFileName, "wb")) == NULL)
908 { 908 {
909 dmError("Error creating file '%s' (%s).\n", optLinkFileName, strerror(errno)); 909 dmErrorMsg("Error creating file '%s' (%s).\n", optLinkFileName, strerror(errno));
910 exit(1); 910 exit(1);
911 } 911 }
912 912
913 switch (optLinkFileFormat) 913 switch (optLinkFileFormat)
914 { 914 {
953 dfile = stdout; 953 dfile = stdout;
954 dmPrint(1, "...\n"); 954 dmPrint(1, "...\n");
955 } 955 }
956 else if ((dfile = fopen(optDestName, "wb")) == NULL) 956 else if ((dfile = fopen(optDestName, "wb")) == NULL)
957 { 957 {
958 dmError("Error creating output file '%s' (%s).\n", optDestName, strerror(errno)); 958 dmErrorMsg("Error creating output file '%s' (%s).\n", optDestName, strerror(errno));
959 exit(1); 959 exit(1);
960 } 960 }
961 else 961 else
962 dmPrint(1, "to '%s'\n", optDestName); 962 dmPrint(1, "to '%s'\n", optDestName);
963 963
979 } 979 }
980 980
981 // Save the data 981 // Save the data
982 if (fwrite(&memory[startAddr], dataSize, 1, dfile) < 1) 982 if (fwrite(&memory[startAddr], dataSize, 1, dfile) < 1)
983 { 983 {
984 dmError("Error writing to file (%s)\n", strerror(errno)); 984 dmErrorMsg("Error writing to file (%s)\n", strerror(errno));
985 } 985 }
986 986
987 fclose(dfile); 987 fclose(dfile);
988 988
989 // Describe 989 // Describe