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