Mercurial > hg > dmlib
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 |