PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/disassembler/MIFReader.cpp

http://hera-mcst.googlecode.com/
C++ | 136 lines | 121 code | 8 blank | 7 comment | 101 complexity | bdb01069cbd9f6ff6ea1d0f58caceb30 MD5 | raw file
  1. #include "MIFReader.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string.h>
  5. #include <strings.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #define SIZE_STRING 1024
  9. #define ERROR_IN_LINE { cout << "Unable to read mif headers: line " << numberline << " col " << i+1 << endl; return 1; }
  10. using namespace std;
  11. MIFReader::MIFReader(unsigned short int *memory, unsigned int *Size_Program)
  12. :_memory (memory), _Size_Program (Size_Program){};
  13. bool MIFReader::read (ELF_Input* file){
  14. int DEPTH, WIDTH, ADDRESS_RADIX, DATA_RADIX;
  15. char line[SIZE_STRING];
  16. char *end;
  17. int flag = 0;
  18. int i;
  19. unsigned int temporary;
  20. int len;
  21. int numberline = 0;
  22. while( flag < 6 ){
  23. if(!file->getline(line, 1024, '\n')) ERROR_IN_LINE
  24. numberline++;
  25. len = strlen(line);
  26. if(len == 0) continue;
  27. for(i = 0; (flag > 3) && (i < len) && (line[i] != '\0') && ( line[i]!='-' || line[i+1]!='-') ; i++){
  28. if( (flag == 5) && !memcmp(&line[i], "BEGIN", 5)){
  29. //cout << "BEGIN" << endl;
  30. if(i+5 <= len) i+=4; else ERROR_IN_LINE
  31. flag++;
  32. continue;
  33. }
  34. else if( (flag == 4) && !memcmp(&line[i], "CONTENT", 7)){
  35. //cout << "CONTENT" << endl;
  36. if(i+7 <= len) i+=6; else ERROR_IN_LINE
  37. flag++;
  38. continue;
  39. }
  40. else if(!isspace(line[i])) ERROR_IN_LINE
  41. }
  42. for(i = 0; (flag < 4) && (i < len) && (line[i] != '\0') && ( line[i]!='-' || line[i+1]!='-') ; i++){
  43. if(!memcmp(&line[i], "DEPTH", 5)){
  44. if(i+5 <= len) i+=5; else ERROR_IN_LINE
  45. while(isspace(line[i])) i++;
  46. if(line[i] == '=') DEPTH = strtol(&line[i+1], &end, 10); else ERROR_IN_LINE
  47. i += (end-&line[i])/sizeof(char);
  48. //cout << "DEPTH = " << DEPTH << endl;
  49. while(isspace(line[i])) i++;
  50. if(line[i] != ';') ERROR_IN_LINE
  51. flag++;
  52. continue;
  53. }
  54. else if(!memcmp(&line[i], "WIDTH", 5)){
  55. if(i+5 <= len) i+=5; else ERROR_IN_LINE
  56. while(isspace(line[i])) i++;
  57. if(line[i] == '=') WIDTH = strtol(&line[i+1], &end, 10); else ERROR_IN_LINE
  58. i += (end-&line[i])/sizeof(char);
  59. //cout << "WIDTH = " << WIDTH << endl;
  60. while(isspace(line[i])) i++;
  61. if(line[i] != ';') ERROR_IN_LINE
  62. flag++;
  63. continue;
  64. }
  65. else if(!memcmp(&line[i], "ADDRESS_RADIX", 13)){
  66. if(i+13 <= len) i+=13; else ERROR_IN_LINE
  67. while(isspace(line[i])) i++;
  68. if(line[i] == '=') i++; else ERROR_IN_LINE
  69. while(isspace(line[i])) i++;
  70. if(!memcmp(&line[i], "BIN", 3)) ADDRESS_RADIX = 2;
  71. else if(!memcmp(&line[i], "OCT", 3)) ADDRESS_RADIX = 8;
  72. else if(!memcmp(&line[i], "DEC", 3)) ADDRESS_RADIX = 10;
  73. else if(!memcmp(&line[i], "HEX", 3)) ADDRESS_RADIX = 16;
  74. else ERROR_IN_LINE
  75. i+=3;
  76. //cout << "ADDRESS_RADIX = " << ADDRESS_RADIX << endl;
  77. while(isspace(line[i])) i++;
  78. if(line[i] != ';') ERROR_IN_LINE
  79. flag++;
  80. continue;
  81. }
  82. else if(!memcmp(&line[i], "DATA_RADIX", 10)){
  83. if(i+10 <= len) i+=10; else ERROR_IN_LINE
  84. while(isspace(line[i])) i++;
  85. if(line[i] == '=') i++; else ERROR_IN_LINE
  86. while(isspace(line[i])) i++;
  87. if(!memcmp(&line[i], "BIN", 3)) DATA_RADIX = 2;
  88. else if(!memcmp(&line[i], "OCT", 3)) DATA_RADIX = 8;
  89. else if(!memcmp(&line[i], "DEC", 3)) DATA_RADIX = 10;
  90. else if(!memcmp(&line[i], "HEX", 3)) DATA_RADIX = 16;
  91. else ERROR_IN_LINE
  92. i+=3;
  93. //cout << "DATA_RADIX = " << DATA_RADIX << endl;
  94. while(isspace(line[i])) i++;
  95. if(line[i] != ';') ERROR_IN_LINE
  96. flag++;
  97. continue;
  98. }
  99. else if(!isspace(line[i])) ERROR_IN_LINE
  100. }
  101. }
  102. if(flag < 6){ cout << "Unable to read mif headers: not enough parameters or incorrect sequence" << endl; return 1; }
  103. while( flag == 6 ){
  104. if(!file->getline(line, 1024, '\n')) ERROR_IN_LINE
  105. numberline++;
  106. len = strlen(line);
  107. if(len == 0) continue;
  108. for(i = 0; (i < len) && (line[i] != '\0') && ( line[i]!='-' || line[i+1]!='-') ; i++){
  109. if(!memcmp(line, "END", 3)){*_Size_Program = temporary+1; /*cout << "END" << endl;*/ flag = 0; break; }
  110. else if(isxdigit(line[i])){
  111. temporary = strtol(&line[i], &end, ADDRESS_RADIX);
  112. i += (end-&line[i])/sizeof(char);
  113. while(isspace(line[i])) i++;
  114. if(line[i] != ':') ERROR_IN_LINE
  115. do i++; while(isspace(line[i]));
  116. if(isxdigit(line[i])) _memory[temporary] = strtol(&line[i], &end, DATA_RADIX);
  117. i += (end-&line[i])/sizeof(char);
  118. while(isspace(line[i])) i++;
  119. if(line[i] != ';') ERROR_IN_LINE
  120. //cout << hex << temporary << '\t' << cmd << endl;
  121. continue;
  122. }
  123. else if(!isspace(line[i])) ERROR_IN_LINE
  124. }
  125. }
  126. flag = 0;
  127. return 0;
  128. }