/[gxemul]/upstream/0.3.6.2/experiments/sgiprom_to_bin.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /upstream/0.3.6.2/experiments/sgiprom_to_bin.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19 - (hide annotations)
Mon Oct 8 16:19:16 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 4188 byte(s)
0.3.6.2
1 dpavlin 2 /*
2     * Copyright (C) 2004-2005 Anders Gavare. All rights reserved.
3     *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are met:
6     *
7     * 1. Redistributions of source code must retain the above copyright
8     * notice, this list of conditions and the following disclaimer.
9     * 2. Redistributions in binary form must reproduce the above copyright
10     * notice, this list of conditions and the following disclaimer in the
11     * documentation and/or other materials provided with the distribution.
12     * 3. The name of the author may not be used to endorse or promote products
13     * derived from this software without specific prior written permission.
14     *
15     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25     * SUCH DAMAGE.
26     *
27     *
28     * $Id: sgiprom_to_bin.c,v 1.5 2005/02/21 07:18:10 debug Exp $
29     *
30     * sgiprom_to_bin.c
31     *
32     * This program takes a textfile containing a SGI PROM memory dump of
33     * the following format:
34     *
35     * >> dump -b 0xBFC00000:0xBFCF0000
36     * 0xbfc00000: b f0 0 f0 0 0 0 0
37     * 0xbfc00008: b f0 1 f6 0 0 0 0
38     * SAME
39     * 0xbfc00200: b f0 3 c9 0 0 0 0
40     * 0xbfc00208: b f0 1 f6 0 0 0 0
41     * SAME
42     * 0xbfc00280: b f0 3 cb 0 0 0 0
43     * ..
44     *
45     * and turns it into a binary image. Input is read from stdin.
46     */
47    
48     #include <sys/types.h>
49     #include <stdio.h>
50     #include <stdlib.h>
51     #include <string.h>
52    
53    
54     #define MAX 200
55    
56    
57     int main(int argc, char *argv[])
58     {
59     FILE *f;
60     unsigned char previous_line[8];
61     int same_flag = 0;
62     off_t same_start_offset = 0;
63    
64     if (argc < 2) {
65     fprintf(stderr, "usage: %s output_filename\n", argv[0]);
66     fprintf(stderr, "input is read from stdin\n");
67     exit(1);
68     }
69    
70     f = fopen(argv[1], "w");
71    
72     while (!feof(stdin)) {
73     char s[MAX];
74     s[0] = 0;
75     fgets(s, sizeof(s), stdin);
76    
77     while (s[0] == '\r') {
78     memcpy(s, s+1, sizeof(s)-1);
79     s[MAX-1] = '\0';
80     }
81    
82     /* 0xbfc00460: 24 5 0 10 0 5 28 c2 */
83     if (s[0] == '0' && s[10]==':') {
84     unsigned long x;
85     int i;
86    
87     x = strtol(s, NULL, 0);
88     if (x < 0xbfc00000) {
89     printf("x = 0x%08lx, less than 0xbfc00000. "
90     "aborting\n", (long)x);
91     exit(1);
92     }
93     x -= 0xbfc00000;
94    
95     if (same_flag) {
96     /*
97     * We should fill from same_start_offset to
98     * just before x, using previous_line data.
99     */
100     off_t ofs;
101     printf("same_flag set, filling until just "
102     "before 0x%08lx\n", (long)x);
103     fseek(f, same_start_offset, SEEK_SET);
104     for (ofs = same_start_offset; ofs < x;
105     ofs += 8) {
106     fwrite(previous_line, 1,
107     sizeof(previous_line), f);
108     }
109     same_flag = 0;
110     }
111    
112     printf("x = 0x%08lx\n", (long)x);
113    
114     fseek(f, x, SEEK_SET);
115    
116     for (i=0; i<strlen(s); i++)
117     if (s[i]==' ')
118     s[i]='0';
119     for (i=0; i<8; i++) {
120     int ofs = i*5 + 14;
121     int d1, d2;
122     d1 = s[ofs];
123     d2 = s[ofs+1];
124     if (d1 >= '0' && d1<='9')
125     d1 -= '0';
126     else
127     d1 = d1 - 'a' + 10;
128     if (d2 >= '0' && d2<='9')
129     d2 -= '0';
130     else
131     d2 = d2 - 'a' + 10;
132     d1 = d1*16 + d2;
133    
134     printf(" %02x", d1);
135     fprintf(f, "%c", d1);
136    
137     previous_line[i] = d1;
138     }
139     printf("\n");
140     }
141    
142     /* "SAME": */
143     if (s[0] == 'S' && s[1] == 'A') {
144     /*
145     * This should produce "same" output until the
146     * next normal "0xbfc.." line.
147     */
148     same_flag = 1;
149     same_start_offset = ftell(f);
150     }
151     }
152    
153     fclose(f);
154    
155     return 0;
156     }
157    

  ViewVC Help
Powered by ViewVC 1.1.26