File: parse.diff

package info (click to toggle)
picp 0.4d-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 272 kB
  • ctags: 444
  • sloc: ansic: 4,614; makefile: 63
file content (103 lines) | stat: -rw-r--r-- 2,735 bytes parent folder | download
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 */
 }