-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunciones.c
188 lines (156 loc) · 4.92 KB
/
funciones.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include "funciones.h"
#include "sub.h"
//aca creo la estructura que va a tener todos lso subtitulos
//IDEA hacer punteros a funciones a esta funcion para reutilizar codigo
struct arreglo_sub * abrir(void * s,FILE * entrada){ //tengo que pasar la entrada por referencia????
struct arreglo_sub * sub;
entrada = fopen ((char *)s,"r+");
if(entrada == NULL){
fprintf(stderr,"No se pudo abrir el archivo %s.\n",(char *)s);
}
sub = inicializar(entrada);
fclose(entrada);
return sub;
}
void salir(void * s,FILE ** salida){
printf("El archivo de salida va a ser: %s",(char *) s);
getchar();
*salida = fopen ((char *)s,"a");
if(*salida == NULL){
fprintf(stderr,"No se pudo abrir el archivo %s.\n",(char *)s);
}
}
void modificar_salida(FILE ** salida,struct arreglo_sub * arr_sub){
crear_salida(arr_sub,salida);
fclose(*salida);
}
struct arreglo_sub * borrar_indice(void * args,struct arreglo_sub * arr_sub){
int indice = (int *) args;
int i = 1;
while(i <= arr_sub->ocupado){
if(arr_sub->a[i].indice == indice){
break;
}
i++;
}
if(i >= arr_sub->ocupado && indice != arr_sub->a[i].indice){
printf("No se encontro el indice a borrar.");
}
else{
for (;i<arr_sub->ocupado;i++){
arr_sub->a[i + 1].indice = i + 1;
arr_sub->a[i] = arr_sub->a[i + 1];
}
arr_sub->ocupado = arr_sub->ocupado ;
//free(arr_sub->a[arr_sub->ocupado]);
}
for(int i = 0; i <= arr_sub->ocupado; i++){
printf("Indice:%d \n Texto: %s \n",arr_sub->a[i].indice,arr_sub->a[i].texto);
}
return arr_sub;
}
struct arreglo_sub * insertar(void *args, struct arreglo_sub * arreglo){
struct sub *dato = (struct sub *) args;
int j;
if(arreglo->ocupado == arreglo->tamanio){
arreglo->a = (struct sub *)realloc(arreglo->a, arreglo->tamanio * sizeof(struct sub) + 1 * sizeof(struct sub));
}
if(dato->fin < arreglo->a[0].inicio){
j = 0;
}
else{
j = 1;
while(j < arreglo->ocupado && dato->inicio > arreglo->a[j].fin){
j++;
}
}
if(j < arreglo->ocupado){
for(int i = arreglo->ocupado; i >= j ; i--){
arreglo->a[i].indice = arreglo->a[i].indice + 1;
arreglo->a[i + 1] = arreglo->a[i];
}
dato->texto = realloc(dato->texto,strlen(dato->texto) + sizeof(char));
strcat(dato->texto,'\n');
}
dato->indice = j + 1;
arreglo->a[j] = *dato;
printf("Indice:%d \n Texto: %s \n",arreglo->a[j].indice,arreglo->a[j].texto);
arreglo->ocupado += 1;
free(dato);
return arreglo;
}
void validar(struct arreglo_sub * arr_sub){
if ((arr_sub->a[0].indice) != 1){
error(1, "El primer indice no es 1.");
}
printf("%d\n",minimo_duracion_sub(90,10));
//se trabaja con un sub
for(int i = 0; i < arr_sub->ocupado; i++){
int total_carac = procesar_texto (arr_sub->a[i].texto, arr_sub->a[i].indice);
if(minimo_duracion_sub(arr_sub->a[i].inicio,arr_sub->a[i].fin) == 1){
error(arr_sub->a[i].indice,"El subtitulo dura menos de 1 seg.");
}
if(maximo_duracion_sub(arr_sub->a[i].inicio,arr_sub->a[i].fin)){
error(arr_sub->a[i].indice,"El subtitulo dura mas de 7 seg.");
}
if(chars_por_seg(total_carac,arr_sub->a[i].inicio,arr_sub->a[i].fin)){
error(arr_sub->a[i].indice,"El subtitulo tiene demasiados caracteres por segundo.");
}
if(i != arr_sub->ocupado - 1){
if((arr_sub->a[i].indice+1) != arr_sub->a[i+1].indice){
error(arr_sub->a[i].indice,"Los indices no son consecutivos ordenados.");
}
if(solapados_sub(arr_sub->a[i].fin, arr_sub->a[i+1].inicio) == 1){
error(arr_sub->a[i].indice,"El subtitulo esta solapado con el siguiente.");
} else {
if (separacion_sub(arr_sub->a[i].fin, arr_sub->a[i].inicio)) {
error(arr_sub->a[i].indice,"Hay menos de 75 ms. entre el subtitulo y el siguiente.");
}
}
}
}
}
void process_operation(struct arreglo_opciones *optargs) {
FILE * entrada = NULL, * salida = NULL;
struct arreglo_sub * arr_sub;
for(int i = 0; i <= optargs->ocupado ;i++){
printf("Entrada nro: %d",i);
getchar();
switch (optargs->opciones[i].opcion) {
case IN:
printf("Abriendo archivo...\n");
arr_sub = abrir(optargs->opciones[i].args,entrada);
continue;
case OUT:
printf("Abriendo archivo de salida...\n");
salir(optargs->opciones[i].args,&salida);
continue;
case BORRAR:
if(salida != NULL){
printf("Borrando...\n");
arr_sub = borrar_indice(optargs->opciones[i].args,arr_sub);
}
else{
printf("No se puede borrar, no hay archivo de salida.\n El argumento -o es obligatorio cuando hay opciones que modifican el archivo de entrada.");
}
continue;
case INSERTAR:
if(salida != NULL){
printf("Insertando...\n");
arr_sub = insertar(optargs->opciones[i].args,arr_sub);
}
else{
printf("No se puede Insertar, no hay archivo de salida.\n El argumento -o es obligatorio cuando hay opciones que modifican el archivo de entrada.");
}
continue;
case VALIDAR:
printf("Validando...\n");
validar(arr_sub);
continue;
}
} if(salida != NULL){
modificar_salida(&salida,arr_sub);
}
free(arr_sub->a);
free(arr_sub);
}