Annotation of rpm2html/compressor.c, revision 1.5
1.1 veillard 1: /*
2: * Compressor.c : read an input file and store it compressed in
3: * a C source file containing a char array containing
4: * the compressed file.
5: *
1.5 ! veillard 6: * See Copyright for the status of this software.
1.1 veillard 7: *
1.5 ! veillard 8: * $Id: compressor.c,v 1.4 1998/05/25 04:41:47 veillard Exp $
1.1 veillard 9: */
10:
11: #include <stdio.h>
12: #include <stdarg.h>
13: #include <stdlib.h>
14: #include <string.h>
15: #include <sys/types.h>
16: #include <sys/stat.h>
17: #include <unistd.h>
18: #include <fcntl.h>
19: #include <zlib.h>
20:
21: #define MAX_PATH_LENGHT 512
22:
1.3 veillard 23: char *data_name;
1.1 veillard 24: char *data_file = NULL;
25: int main_argc;
26: char **main_argv;
27: char pwd[MAX_PATH_LENGHT];
28:
29: void create_gz_source(char *filename) {
30: char outputfile[MAX_PATH_LENGHT];
31: Bytef *input;
32: int size;
33: Bytef *output;
1.2 veillard 34: uLongf outsize;
1.1 veillard 35: int res;
36: struct stat st;
37: int fd;
38: FILE *result;
39: int i;
40:
41: /*
42: * open and read the input file in a buffer.
43: */
44: fd = open(filename, O_RDONLY);
45: if (fd < 0) {
46: perror("mkdep: open");
47: return;
48: }
49: fstat(fd, &st);
50: size = st.st_size;
51: input = malloc(size);
52: if (input == NULL) {
53: perror("malloc failed");
54: exit(1);
55: }
56: res = read(fd, input, size);
57: if (res < size) {
58: perror("read didn't complete");
59: exit(1);
60: }
61: close(fd);
62:
63: /*
64: * allocate an output buffer for the compressed result.
65: */
66: outsize = size + (size / 8) + 12;
67: output = malloc(outsize);
68: if (output == NULL) {
69: perror("malloc failed");
70: exit(1);
71: }
72:
73: /*
74: * compress the whole stuff in one pass.
75: */
76: if (compress(output, (uLongf *) &outsize, input, size) != Z_OK) {
77: fprintf(stderr, "compress failed\n");
78: exit(1);
79: }
80:
81: /*
82: * save the whole stuff as a C source file.
83: */
84: if (data_file == NULL) {
85: sprintf(outputfile, "%s.h", filename);
86: data_file = &outputfile[0];
87: }
88: result = fopen(data_file, "w");
89: if (result == NULL) {
90: fprintf(stderr, "fopen(%s)", data_file);
91: perror("failed");
92: exit(1);
93: }
94: fprintf(result, "/* output from compressor, need #include <zlib.h>\" */\n");
95: fprintf(result, "#define %s_size %d\n", data_name, size);
1.4 veillard 96: fprintf(result, "unsigned char %s[%d] = {", data_name, (int) outsize);
1.1 veillard 97: for (i = 0;i < (outsize - 1);i++) {
98: if (!(i % 15)) fprintf(result, "\n");
99: fprintf(result, "0x%02x,", output[i]);
100: }
101: fprintf(result, "0x%02x\n};\n\n", output[outsize - 1]);
102: fprintf(result, "char *read_%s(void) {\n", data_name);
103: fprintf(result, " uLongf size = %d;\n", size + 20);
104: fprintf(result, " Bytef *buffer = malloc(%d);\n\n", size + 20);
105: fprintf(result, " if (buffer == NULL) return(NULL);\n");
106: fprintf(result, " if (uncompress(buffer, &size, %s, %d) != Z_OK) {\n",
1.4 veillard 107: data_name, (int) outsize);
1.1 veillard 108: fprintf(result, " fprintf(stderr, \"uncompress failed\");\n");
109: fprintf(result, " free(buffer);\n");
110: fprintf(result, " return(NULL);\n");
111: fprintf(result, " }\n");
112: fprintf(result, " if (size != %d) {\n", size);
113: fprintf(result, " fprintf(stderr, \"uncompress failed\");\n");
114: fprintf(result, " free(buffer);\n");
115: fprintf(result, " return(NULL);\n");
116: fprintf(result, " }\n");
117: fprintf(result, " buffer[%d] = '\\0';\n", size);
118: fprintf(result, " return(buffer);\n}\n");
119:
120: fclose(result);
121: }
122:
123: void message(char *fmt, ...)
124: {
125: va_list ap;
126:
127: va_start(ap, fmt);
128: vfprintf(stderr, fmt, ap);
129: va_end(ap);
130: }
131:
1.3 veillard 132: char *get_data_name(char *filename) {
133: char *res;
134: char *cur;
135:
136: res = (char *) malloc((strlen(filename) + 20) * sizeof(char));
137: sprintf(res, "data_buffer_%s", filename);
138: cur = res;
139: while (*cur != '\0') {
140: if (*cur == '.') *cur = '_';
141: else if (*cur == ' ') *cur = '_';
142: else if (*cur == '/') *cur = '_';
143: else if (*cur == '\t') *cur = '_';
144: cur++;
145: }
146: return(res);
147: }
1.1 veillard 148:
149: int main(int argc, char **argv)
150: {
1.3 veillard 151: char fullname[MAX_PATH_LENGHT];
1.1 veillard 152:
153: main_argc = argc;
154: main_argv = argv;
155: getcwd(pwd, sizeof(pwd));
156:
157: while (--argc > 0) {
158: char *name = *++argv;
159:
160: if (name[0] == '-') {
161: switch (name[1]) {
162: case 'n':
163: data_name = *++argv;
164: argc--;
165: continue;
166: case 'o':
167: data_file = *++argv;
168: argc--;
169: continue;
170:
171: default:
172: /*
173: * NOTE : dump_h has to be modified accordingly
174: * if new options are added !
175: */
176: fprintf(stderr,"%s [options] includes ...\n",
177: argv[0]);
178: fprintf(stderr,"Options :\n");
179: fprintf(stderr,"\t-n data_name\n");
180: fprintf(stderr,"\t-o file_name\n");
181: exit(1);
182: }
183: continue;
184: }
185: if (name[0] != '/') {
1.3 veillard 186: strcpy(fullname, pwd);
187: strcat(fullname, "/");
188: strcat(fullname, name);
189: } else {
190: strcpy(fullname, name);
1.1 veillard 191: }
192:
193: /*
1.3 veillard 194: * do the work !
1.1 veillard 195: */
1.3 veillard 196: data_name = get_data_name(name);
197: create_gz_source(fullname);
1.1 veillard 198:
199: }
200: return 0;
201: }
202:
Webmaster