1 #ifdef include
2 extern int fprintf();
3 extern int fread();
4 extern int fwrite();
5 extern int fscanf();
6 extern void fclose();
7 extern int fgetc();
8 extern int fputc();
9 extern int printf();
10 #endif
11
12 #define RLK (1L << 0)
13 #define MYGETPUT (1L << 1)
14 #define FSCANFPRINTF (1L << 2)
15 #define FREADFWRITE (1L << 3)
16
17 #define Fgetint(i,s,t) for((i)=0,t=3;t>=0;t--) (i)+=(fgetc(s)<<(t*8))
18 #define Fputint(i,s,t) for(t=3;t>=0;t--) fputc((char)(((i)>>(t*8))&255),s)
19
20 /* Loads a run-length encoded file and returns it in a char buffer */
load(FILE * from,int * x,int * y,long flags)21 char *load(FILE *from,int *x,int *y,long flags)
22 {
23 int t,tot;
24 unsigned char number;
25 char *buffer,code;
26
27 if (flags&MYGETPUT)
28 {
29 Fgetint(*x,from,t);
30 Fgetint(*y,from,t);
31 }
32
33 if (flags&FSCANFPRINTF) fscanf(from,"%d %d",x,y);
34
35 if (flags&FREADFWRITE)
36 {
37 fread((char *)x,sizeof(*x),1,from);
38 fread((char *)y,sizeof(*x),1,from);
39 }
40
41 buffer=(char *)malloc((*x)*(*y));
42 t=0;
43 tot=(*x)*(*y);
44
45 if (!(flags&RLK))
46 {
47 fread(buffer,sizeof(char),tot,from);
48 return(buffer);
49 }
50
51 do
52 {
53 fread((char *)&number,sizeof(number),1,from);
54 fread((char *)&code,sizeof(code),1,from);
55 for(;(number);number--) buffer[t++]=code;
56 if(t<tot)
57 {
58 fread((char *)&number,sizeof(number),1,from);
59 fread((char *)&buffer[t],sizeof(*buffer),(int)number,from);
60 t+=(int)number;
61 }
62 }
63 while(tot>t);
64 if (tot!=t) fprintf(stderr,"Feil i innput from fil\n");
65 fclose(from);
66 return(buffer);
67 }
68
save(FILE * to,char * buffer,int x,int y,long flags)69 void save(FILE *to,char *buffer,int x,int y,long flags)
70 {
71 int t,tot,max=255;
72 unsigned char number;
73 char code;
74
75 if (flags&MYGETPUT)
76 {
77 Fputint(x,to,t);
78 Fputint(y,to,t);
79 }
80
81 if (flags&FSCANFPRINTF) fprintf(to,"%d %d",x,y);
82
83 if (flags&FREADFWRITE)
84 {
85 fwrite((char *)&x,sizeof(x),1,to);
86 fwrite((char *)&y,sizeof(y),1,to);
87 }
88
89 t=0;
90 tot=x*y;
91
92 if (!(flags&RLK)) fwrite(buffer,sizeof(char),tot,to);
93 else do
94 {
95 number=0;
96 if (t+max>tot) max=tot-t;
97 code=buffer[t];
98 do
99 number+=1;
100 while((buffer[t+(int)number]==code)&&(number<max));
101 fwrite((char *)&number,sizeof(number),1,to);
102 fwrite((char *)&code,sizeof(code),1,to);
103 t+=(int)number;
104
105 if (t<tot)
106 {
107 number=0;
108 if (t+max>tot) max=tot-t;
109 do
110 number+=1;
111 while(buffer[t+(int)number-1]!=buffer[t+(int)number] && number!=255);
112 fwrite((char *)&number,sizeof(number),1,to);
113 fwrite((char *)&buffer[t],sizeof(*buffer),number,to);
114 t+=(int)number;
115 }
116 }
117 while(t<tot);
118 }
119