1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
--- parse.c.orig Fri Apr 14 11:19:34 2000
+++ parse.c Fri Sep 1 16:48:44 2000
@@ -140,28 +140,35 @@
// set up to interpret the line as an intel hex record
// DEBUG should verify the checksum here
-//
-static bool GetIntelRecord(FILE *theFile)
+// Return true if done, false if good data, and -1 if record should be skipped
+static int GetIntelRecord(FILE *theFile)
{
- bool done = false;
- switch(atoh(lineBuffer[7],lineBuffer[8]))
+ int rtype = atoh(lineBuffer[7],lineBuffer[8]);
+ switch (rtype)
{
case DATARECORD: // don't know how to cope with anything but 16-bit addresses for now
byteIdx = 9; // the ninth character is the high nibble of the first data byte
byteCount = atoh(lineBuffer[1],lineBuffer[2]);
byteAddress = atoh(lineBuffer[3],lineBuffer[4])*256 + atoh(lineBuffer[5],lineBuffer[6]);
- break;
+ return false;
case ENDRECORD:
- break;
+ return true;
- case SEGADDRESS:
case EXTADDRESS:
+ if (('0' != lineBuffer[3]) || ('0' != lineBuffer[4]) ||
+ ('0' != lineBuffer[5]) || ('0' != lineBuffer[6]) ||
+ ('0' != lineBuffer[9]) || ('0' != lineBuffer[10]) ||
+ ('0' != lineBuffer[11]) || ('0' != lineBuffer[12])) {
+ fprintf (stderr, "Error! Non 0 Extended address\n");
+ }
+ return -1;
+
+ case SEGADDRESS:
default:
- done = true;
- break;
+ fprintf (stderr, "Unrecognized record type 0x%x\n", rtype);
+ return -1;
}
- return(!done);
}
@@ -232,30 +239,43 @@
bool done = false;
bool overflow = false; // set true when oversized line is read
- if( GetLine(theFile, lineBuffer, MAX_LINE_LEN,&done,&overflow) )
+ while ( GetLine(theFile, lineBuffer, MAX_LINE_LEN,&done,&overflow) )
{
- if(overflow)
+ int recReturn;
+ if (done)
{
- fprintf(stderr,"Line too long, truncation occurred\n");
+ return false; /* end of file */
}
- if(!done)
- {
+
if(lineBuffer[0] == INTEL_CHAR)
{
- done = !GetIntelRecord(theFile);
+ recReturn = GetIntelRecord(theFile);
}
else if(lineBuffer[0] == MOT_CHAR)
{
- done = !GetMotRecord(theFile);
+ recReturn = GetMotRecord(theFile);
}
- else
- {
+ else {
fprintf(stderr,"Unrecognized record format: '%c'\n",lineBuffer[0]);
- done = true;
+ return false; /* bail out */
}
+
+ if (recReturn > 0)
+ {
+ return false; /* end of file */
}
+ if (recReturn < 0)
+ {
+ continue; /* non data record, skip it */
+ }
+ return true; /* got data, done */
+ }
+ if(overflow)
+ {
+ fprintf(stderr,"Error! Line too long, truncation occurred\n");
+ return false; /* have to bail at this point */
}
- return(!done); // return true if okay
+ return false; /* GetLine out of data */
}
|