]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/jacu.c
pongo un char* en lugar de un int, no se quien lo cambio... en todo caso cambienlo...
[z.facultad/75.06/jacu.git] / src / jacu.c
1
2 #include "statichuff/statichuff.h"
3 #include "blocksorting/bs.h"
4 #include "mtf/mtf.h"
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <unistd.h>
8
9 int main(int argc, char* argv[])
10 {       
11         int cflag = 0;
12         int dflag = 0;
13         int tflag = 0;
14         int pflag = 0;
15         long int volumesize = 0;
16         size_t pagesize = 32768; /* 32KB */
17         int ch;
18         t_BlockSort *bs;
19                         
20         while ((ch = getopt(argc, argv, "cdt:p:")) != -1) { 
21                  
22                 switch (ch) { 
23                         case 'c': cflag = 1; 
24                                           break;
25
26                         case 'd': dflag = 1; 
27                                           break; 
28
29                         case 't': tflag = 1; 
30                                           volumesize = atol(optarg);
31                                           break; 
32
33                         case 'p': pflag = 1; 
34                                           pagesize = atoi(optarg);
35                                           break; 
36
37                         default: fprintf(stderr, "Usage: %s [-cdpt] sourcefile targetfile\n", argv[0]); 
38                                          return(2);
39                 }
40         }
41                 
42         if ( (argc == 1) || (cflag & dflag) || !(cflag | dflag) || ((argc - optind) < 2) ) {
43                 fprintf(stderr, "Usage: %s [-cdt] sourcefile targetfile\n", argv[0]); 
44                 return (3);
45         }
46         if ((tflag) && (volumesize <= 0l)) {
47                 fprintf(stderr,"Error: The volume size must be a non-zero value\n");
48                 return (4);
49         }
50         if ((pflag) && (pagesize <= 1u)) {
51                 fprintf(stderr,"Error: El tamaño de página debe ser mayor a 1 byte.\n");
52                 return (5);
53         }
54                 
55         if (cflag == 1) {
56                 /* Comprimo */
57                 /* No me gusta el tmpfile ... es para probar como anda todo junto */
58                 FILE *fp, *fp_out;
59                 unsigned long int i, j, total, k;
60                 int *mtf;
61                 char *salida, *data, c;
62                 data = malloc(sizeof(char)*pagesize);
63                 salida = malloc(sizeof(char)*(pagesize));
64                 bs = bs_create(pagesize);
65                 fp = fopen(argv[optind], "rb");
66                 fp_out = fopen("tmp.comp", "wb");
67                 c = fgetc(fp);
68                 total = 0;
69                 while (!feof(fp)) {
70                         i = 0;
71                         while ((!feof(fp)) && (i < pagesize)) {
72                                 data[i++] = c;
73                                 c = fgetc(fp);
74                                 total++;
75                         }
76                         /* Hago el BS */
77                         bs_solve(data, salida, bs, &k, i);
78                         /* Le aplico el MTF */
79                         mtf = jacu_mtf(salida, i);
80                         for(j=0; j<i; j++)
81                                 fputc(mtf[j], fp_out);
82                 }
83                 fclose(fp);
84                 fclose(fp_out);
85                 bs_destroy(bs);
86                 i = shuff_encode_file("tmp.comp",argv[optind+1],volumesize);
87                 /* borro el temporal */
88                 unlink("tmp.comp");
89                 return i;
90         }
91         
92         if (dflag == 1) { 
93                 /* Descomprimo */
94                 return shuff_decode_file(argv[optind],argv[optind+1]);
95         }
96                 
97         return 0;
98 }