PageRenderTime 60ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/locadora_em_c/movie.c

http://ruby-pro.googlecode.com/
C | 642 lines | 524 code | 83 blank | 35 comment | 95 complexity | 8933e493102b918dd0ad6aeae3de0f11 MD5 | raw file
  1. /*
  2. * File: movie.c
  3. *
  4. * Created on 5 de Maio de 2010, 16:22
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <regex.h>
  9. #include <string.h>
  10. #include "exceptions.h"
  11. #include "status.h"
  12. #include "movie.h"
  13. #include "strings.h"
  14. #include "validations.h"
  15. #include "location.h"
  16. #include "dvd.h"
  17. #include "item.h"
  18. /*
  19. * Movie module
  20. */
  21. int check_by_id_movie(char *input) {
  22. int id;
  23. do {
  24. printf("Qual ID? ");
  25. read_string(input);
  26. } while (!validate_id(input));
  27. id = atoi(input);
  28. // Verificar se o ID existe
  29. if (id > 0 && movie_index_exist(id)) {
  30. return id;
  31. } else {
  32. printf(ID_NOT_FOUND_ERROR, __FILE__, "filme");
  33. return NON_EXIST;
  34. }
  35. }
  36. Movie * movie_malloc() {
  37. Movie *movie = malloc(sizeof (Movie));
  38. if (!movie) {
  39. printf(ALLOC_ERROR, __FILE__);
  40. exit(1);
  41. }
  42. movie_initialize(movie);
  43. return movie;
  44. }
  45. void movie_initialize(Movie * movie) {
  46. movie->id = NON_EXIST;
  47. strcpy(movie->title, "");
  48. strcpy(movie->genere, "");
  49. movie->lenght = 0;
  50. }
  51. Movie * search_movie_by_id(int id) {
  52. FILE *file_stream = NULL;
  53. Movie *movie;
  54. file_stream = fopen(MOVIES_FILEPATH, "rb");
  55. if (!file_stream) {
  56. printf(READ_OPEN_ERROR, __FILE__, MOVIES_FILEPATH);
  57. exit(1);
  58. }
  59. movie = movie_malloc();
  60. fread(movie, sizeof (Movie), 1, file_stream);
  61. while (!feof(file_stream)) {
  62. if (movie->id == id) {
  63. fclose(file_stream);
  64. return movie;
  65. }
  66. fread(movie, sizeof (Movie), 1, file_stream);
  67. }
  68. fclose(file_stream);
  69. movie->id = NON_EXIST;
  70. return movie;
  71. }
  72. Movie * search_movie_by_title(char *name) {
  73. FILE *file_stream = NULL;
  74. Movie *movie;
  75. file_stream = fopen(MOVIES_FILEPATH, "rb");
  76. if (!file_stream) {
  77. printf(READ_OPEN_ERROR, __FILE__, MOVIES_FILEPATH);
  78. exit(1);
  79. }
  80. movie = movie_malloc();
  81. fread(movie, sizeof (Movie), 1, file_stream);
  82. while (!feof(file_stream)) {
  83. if (!strcasecmp(name, movie->title)) {
  84. fclose(file_stream);
  85. return movie;
  86. }
  87. fread(movie, sizeof (Movie), 1, file_stream);
  88. }
  89. /*
  90. * Nгo achou pelo nome exato, entгo tentaremos uma aproximaзгo com
  91. * expressгo regular
  92. */
  93. regex_t reg;
  94. if (regcomp(&reg, name, REG_EXTENDED | REG_NOSUB | REG_ICASE)) {
  95. fprintf(stderr, "%s: ERRO na compilacao da expressao regular.\n", __FILE__);
  96. fclose(file_stream);
  97. movie->id = NON_EXIST;
  98. return movie;
  99. }
  100. fseek(file_stream, 0, SEEK_SET);
  101. fread(movie, sizeof (Movie), 1, file_stream);
  102. while (!feof(file_stream)) {
  103. if (!(regexec(&reg, movie->title, 0, (regmatch_t *) NULL, 0))) {
  104. fclose(file_stream);
  105. return movie;
  106. }
  107. fread(movie, sizeof (Movie), 1, file_stream);
  108. }
  109. fclose(file_stream);
  110. movie->id = NON_EXIST;
  111. return movie;
  112. }
  113. int movies_file_is_empty() {
  114. FILE *file_stream = NULL;
  115. file_stream = fopen(MOVIES_FILEPATH, "rb");
  116. if (file_stream) {
  117. fclose(file_stream);
  118. return FALSE;
  119. } else {
  120. return TRUE;
  121. }
  122. }
  123. int movie_index_exist(int index) {
  124. Movie *movie;
  125. movie = movie_malloc();
  126. movie = search_movie_by_id(index);
  127. if (movie->id == NON_EXIST) {
  128. free(movie);
  129. return FALSE;
  130. }
  131. free(movie);
  132. return TRUE;
  133. }
  134. int movie_first_index_avaliable() {
  135. FILE *file_stream = NULL;
  136. int old_id = NON_EXIST, new_id = NON_EXIST;
  137. file_stream = fopen(MOVIES_ID_FILEPATH, "rb+");
  138. if (file_stream) {
  139. fread(&old_id, sizeof (old_id), 1, file_stream);
  140. rewind(file_stream);
  141. new_id = old_id + 1;
  142. fwrite(&new_id, sizeof (new_id), 1, file_stream);
  143. fclose(file_stream);
  144. return old_id;
  145. } else {
  146. printf("Aviso: arquivo \"%s\" foi criado agora.\n", MOVIES_ID_FILEPATH);
  147. /* Nгo conseguiu abrir um arquivo existente, entгo, criarб. */
  148. file_stream = fopen(MOVIES_ID_FILEPATH, "wb+");
  149. if (file_stream) {
  150. new_id = 2;
  151. fwrite(&new_id, sizeof (new_id), 1, file_stream);
  152. fclose(file_stream);
  153. return 1;
  154. } else {
  155. printf(CREATE_FILE_ERROR, __FILE__, MOVIES_ID_FILEPATH);
  156. exit(1);
  157. }
  158. }
  159. }
  160. int insert_movie(Movie * movie) {
  161. FILE *file_stream = NULL;
  162. movie->id = movie_first_index_avaliable();
  163. file_stream = fopen(MOVIES_FILEPATH, "rb+");
  164. if (file_stream) {
  165. fseek(file_stream, 0, SEEK_END);
  166. if (!fwrite(movie, sizeof (Movie), 1, file_stream)) {
  167. printf(WRITE_FILE_ERROR, __FILE__, MOVIES_FILEPATH);
  168. fclose(file_stream);
  169. return FALSE;
  170. }
  171. fclose(file_stream);
  172. } else {
  173. printf("Aviso: arquivo \"%s\" foi criado agora.\n", MOVIES_FILEPATH);
  174. /* Nгo conseguiu abrir um arquivo existente, entгo, criarб. */
  175. file_stream = fopen(MOVIES_FILEPATH, "wb+");
  176. if (file_stream) {
  177. if (!fwrite(movie, sizeof (Movie), 1, file_stream)) {
  178. printf(WRITE_FILE_ERROR, __FILE__, MOVIES_FILEPATH);
  179. fclose(file_stream);
  180. return FALSE;
  181. }
  182. fclose(file_stream);
  183. } else {
  184. printf(CREATE_FILE_ERROR, __FILE__, MOVIES_FILEPATH);
  185. return FALSE;
  186. }
  187. }
  188. return TRUE;
  189. }
  190. int update_movie(Movie *movie) {
  191. FILE *file_stream = NULL;
  192. Movie *aux;
  193. file_stream = fopen(MOVIES_FILEPATH, "rb+");
  194. if (!file_stream) {
  195. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_FILEPATH);
  196. return FALSE;
  197. }
  198. aux = movie_malloc();
  199. // Procurar o registro a ser alterado no arquivo
  200. fread(aux, sizeof (Movie), 1, file_stream);
  201. while (!feof(file_stream)) {
  202. if (aux->id == movie->id) {
  203. fseek(file_stream, -(sizeof (Movie)), SEEK_CUR);
  204. if (!fwrite(movie, sizeof (Movie), 1, file_stream)) {
  205. printf(WRITE_FILE_ERROR, __FILE__, MOVIES_FILEPATH);
  206. fclose(file_stream);
  207. free(aux);
  208. return FALSE;
  209. }
  210. fclose(file_stream);
  211. free(aux);
  212. return TRUE;
  213. }
  214. fread(aux, sizeof (Movie), 1, file_stream);
  215. }
  216. // Se chegar atй aqui й porque nгo encontrou nada
  217. fclose(file_stream);
  218. free(aux);
  219. return FALSE;
  220. }
  221. int erase_movie(Movie *movie) {
  222. FILE *file_stream = NULL, *file_stream_tmp = NULL;
  223. Movie *aux;
  224. file_stream = fopen(MOVIES_FILEPATH, "rb+");
  225. if (!file_stream) {
  226. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_FILEPATH);
  227. return FALSE;
  228. }
  229. file_stream_tmp = fopen(MOVIES_TMP_FILEPATH, "wb");
  230. if (!file_stream_tmp) {
  231. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_TMP_FILEPATH);
  232. return FALSE;
  233. }
  234. aux = movie_malloc();
  235. fread(aux, sizeof (Movie), 1, file_stream);
  236. while (!feof(file_stream)) {
  237. if (aux->id != movie->id) {
  238. fwrite(aux, sizeof (Movie), 1, file_stream_tmp);
  239. }
  240. fread(aux, sizeof (Movie), 1, file_stream);
  241. }
  242. free(aux);
  243. fclose(file_stream);
  244. fclose(file_stream_tmp);
  245. if (remove(MOVIES_FILEPATH)) {
  246. return FALSE;
  247. }
  248. if (rename(MOVIES_TMP_FILEPATH, MOVIES_FILEPATH)) {
  249. return FALSE;
  250. }
  251. // Verificar se o arquivo ficou com 0 bytes
  252. file_stream = fopen(MOVIES_FILEPATH, "rb");
  253. if (!file_stream) {
  254. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_FILEPATH);
  255. return FALSE;
  256. }
  257. fseek(file_stream, 0, SEEK_END);
  258. // Se o arquivo tiver 0 bytes, serб removido.
  259. if (!ftell(file_stream)) {
  260. remove(MOVIES_FILEPATH);
  261. }
  262. return TRUE;
  263. }
  264. void copy_movie(Movie * dest, Movie * src) {
  265. dest->id = src->id;
  266. dest->lenght = src->lenght;
  267. strcpy(dest->title, src->title);
  268. strcpy(dest->genere, src->genere);
  269. }
  270. int get_size_movies() {
  271. FILE *file_stream = NULL;
  272. file_stream = fopen(MOVIES_FILEPATH, "rb");
  273. if (!file_stream) {
  274. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_FILEPATH);
  275. return FALSE;
  276. }
  277. fseek(file_stream, 0, SEEK_END);
  278. return ftell(file_stream) / sizeof (Movie);
  279. }
  280. Movie * movie_file_to_a() {
  281. FILE * file_stream = NULL;
  282. Movie *vetor;
  283. int i, size;
  284. /* Antes de tudo, precisamos testar se hб algum filme no arquivo */
  285. if (movies_file_is_empty()) {
  286. printf(EMPTY_ERROR, __FILE__, "filme");
  287. return FALSE;
  288. }
  289. file_stream = fopen(MOVIES_FILEPATH, "rb");
  290. if (!file_stream) {
  291. printf(FILE_NOT_FOUND_ERROR, __FILE__, MOVIES_FILEPATH);
  292. return FALSE;
  293. }
  294. size = get_size_movies();
  295. if (!size) {
  296. printf("%s: Nao foi possivel obter a quantidade de filmes.\n", __FILE__);
  297. return FALSE;
  298. }
  299. vetor = malloc(size * sizeof (Movie));
  300. if (!vetor) {
  301. printf(ALLOC_ERROR, __FILE__);
  302. return FALSE;
  303. }
  304. for (i = 0; i < size; i++) {
  305. fread(vetor + i, sizeof (Movie), 1, file_stream);
  306. }
  307. fclose(file_stream);
  308. return vetor;
  309. }
  310. Movie * sort_movie_by_title() {
  311. Movie *aux, *vetor;
  312. int size, i, j;
  313. aux = movie_malloc();
  314. vetor = movie_file_to_a();
  315. size = get_size_movies();
  316. for (i = 0; i < size; i++) {
  317. for (j = i + 1; j < size; j++) {
  318. if (strcmp((vetor + i)->title, (vetor + j)->title) > 0) {
  319. copy_movie(aux, vetor + j);
  320. copy_movie(vetor + j, vetor + i);
  321. copy_movie(vetor + i, aux);
  322. }
  323. }
  324. }
  325. free(aux);
  326. return vetor;
  327. }
  328. void puts_movie_row_list() {
  329. printf("------ ID | Titulo | Genero | Duracao em minutos ------\n");
  330. }
  331. void puts_movie(Movie * movie) {
  332. printf("%d ", movie->id);
  333. printf("%s \t %s \t ", movie->title, movie->genere);
  334. printf("%d\n", movie->lenght);
  335. }
  336. void puts_movie_by_id(int id_movie) {
  337. Movie *movie;
  338. movie = movie_malloc();
  339. movie->id = id_movie;
  340. puts_movie(movie);
  341. free(movie);
  342. }
  343. void puts_movie_title_by_dvd_id(int id_dvd) {
  344. DVD *dvd;
  345. Movie *movie;
  346. dvd = search_dvd_by_id(id_dvd);
  347. movie = search_movie_by_id(dvd->id_movie);
  348. printf("%s", movie->title);
  349. free(dvd);
  350. free(movie);
  351. }
  352. void puts_all_movies() {
  353. FILE *file_stream = NULL;
  354. Movie *movie;
  355. file_stream = fopen(MOVIES_FILEPATH, "rb");
  356. if (!file_stream) {
  357. printf(EMPTY_ERROR, __FILE__, "filme");
  358. return;
  359. }
  360. movie = movie_malloc();
  361. printf("\n=======\nLISTA DE TODOS OS FILMES: \n\n");
  362. puts_movie_row_list();
  363. fread(movie, sizeof (Movie), 1, file_stream);
  364. while (!feof(file_stream)) {
  365. puts_movie(movie);
  366. fread(movie, sizeof (Movie), 1, file_stream);
  367. }
  368. printf("\n=======\n");
  369. fclose(file_stream);
  370. free(movie);
  371. }
  372. void form_movie(Movie *movie, char *input) {
  373. printf("Titulo: ");
  374. read_string(movie->title);
  375. printf("Genero: ");
  376. read_string(movie->genere);
  377. input = input_malloc();
  378. do {
  379. printf("Duracao em minutos: ");
  380. read_string(input);
  381. } while (!validate_number_int(input));
  382. movie->lenght = atoi(input);
  383. }
  384. void form_movie_sort() {
  385. int i, size;
  386. Movie *vetor;
  387. // Antes de tudo, precisamos testar se hб algum filme no arquivo
  388. if (movies_file_is_empty()) {
  389. printf(EMPTY_ERROR, __FILE__, "filme");
  390. return;
  391. }
  392. vetor = sort_movie_by_title();
  393. size = get_size_movies();
  394. if (!vetor) {
  395. printf("%s: Nao foi possivel ordenar corretamente!\n", __FILE__);
  396. return;
  397. }
  398. printf("\n=======\nLISTA DE TODOS OS FILMES ORDENADOS POR TITULO: \n\n");
  399. puts_movie_row_list();
  400. for (i = 0; i < size; i++) {
  401. puts_movie(vetor + i);
  402. }
  403. printf("\n=======\n");
  404. free(vetor);
  405. }
  406. void form_movie_insert(char *input) {
  407. Movie *movie;
  408. movie = movie_malloc();
  409. printf("\n=======\nINSERINDO FILME: \n\n");
  410. form_movie(movie, input);
  411. // Tem certeza?
  412. if (!be_sure(input)) {
  413. printf("Abortando modificacao de filme.\n\n");
  414. free(movie);
  415. return;
  416. }
  417. if (insert_movie(movie)) {
  418. printf("Filme inserido com sucesso.\n");
  419. } else {
  420. printf("Filme nao foi inserido corretamente!\n");
  421. }
  422. printf("\n=======\n");
  423. free(movie);
  424. }
  425. void form_movie_update(char *input) {
  426. Movie *movie;
  427. // Antes de tudo, precisamos testar se hб algum filme no arquivo
  428. if (movies_file_is_empty()) {
  429. printf(EMPTY_ERROR, __FILE__, "filme");
  430. return;
  431. }
  432. printf("\n=======\nMODIFICANDO FILME: \n\n");
  433. movie = form_movie_select(input);
  434. // Se nгo encontrou, mostra mensagem e sai.
  435. if (movie->id == NON_EXIST) {
  436. printf(ID_NOT_FOUND_ERROR, __FILE__, "filme");
  437. free(movie);
  438. return;
  439. }
  440. // Mostra o resultado da pesquisa feita pelo usuбrio.
  441. puts_movie_row_list();
  442. puts_movie(movie);
  443. // Tem certeza?
  444. if (!be_sure(input)) {
  445. printf("Abortando modificacao de filme.\n\n");
  446. free(movie);
  447. return;
  448. }
  449. // Formulбrio de ediзгo de campos.
  450. form_movie(movie, input);
  451. // Tem certeza?
  452. if (!be_sure(input)) {
  453. printf("Abortando modificacao de filme.\n\n");
  454. free(movie);
  455. return;
  456. }
  457. // Atualizaзгo confirmada!
  458. if (update_movie(movie)) {
  459. printf("Filme atualizado com sucesso.\n");
  460. } else {
  461. printf("Filme nao foi atualizado corretamente!\n");
  462. }
  463. printf("\n=======\n");
  464. free(movie);
  465. }
  466. void form_movie_erase(char *input) {
  467. Movie *movie;
  468. // Antes de tudo, precisamos testar se hб algum filme no arquivo
  469. if (movies_file_is_empty()) {
  470. printf(EMPTY_ERROR, __FILE__, "filme");
  471. return;
  472. }
  473. printf("\n=======\nREMOVENDO FILME: \n\n");
  474. movie = form_movie_select(input);
  475. // Se nгo encontrou, mostra mensagem e sai.
  476. if (movie->id == NON_EXIST) {
  477. printf(ID_NOT_FOUND_ERROR, __FILE__, "filme");
  478. free(movie);
  479. return;
  480. }
  481. puts_movie_row_list();
  482. puts_movie(movie);
  483. // Tem certeza?
  484. if (!be_sure(input)) {
  485. printf("Abortando remocao de filme.\n\n");
  486. free(movie);
  487. return;
  488. }
  489. // Remoзгo confirmada!
  490. if (erase_movie(movie)) {
  491. printf("Filme removido com sucesso.\n");
  492. } else {
  493. printf("Filme nao foi removido corretamente!\n");
  494. }
  495. printf("\n=======\n");
  496. free(movie);
  497. }
  498. Movie * form_movie_select(char *input) {
  499. Movie *movie;
  500. int id;
  501. movie = movie_malloc();
  502. do {
  503. printf("Digite [1] para pesquisar por ID ou [2] para pesquisar por titulo: ");
  504. read_string(input);
  505. switch (*input) {
  506. case '1':
  507. id = check_by_id_movie(input);
  508. if (id == NON_EXIST) {
  509. movie->id = NON_EXIST;
  510. return movie;
  511. }
  512. movie = search_movie_by_id(id);
  513. *input = '1';
  514. break;
  515. case '2':
  516. if (!check_by_name(input)) {
  517. movie->id = NON_EXIST;
  518. return movie;
  519. }
  520. movie = search_movie_by_title(input);
  521. if (movie->id == NON_EXIST) {
  522. printf(NAME_NOT_FOUND_ERROR, __FILE__, "filme");
  523. return movie;
  524. }
  525. *input = '2';
  526. break;
  527. default:
  528. printf("Opcao invalida!\n");
  529. }
  530. // Caso nгo ache, retorna com ID = NON_EXIST
  531. if (movie->id == NON_EXIST) {
  532. if (*input == '1')
  533. printf(ID_NOT_FOUND_ERROR, __FILE__, "DVD");
  534. else if (*input == '2')
  535. printf(NAME_NOT_FOUND_ERROR, __FILE__, "DVD");
  536. movie->id = NON_EXIST;
  537. return movie;
  538. }
  539. } while (*input != '1' && *input != '2');
  540. return movie;
  541. }
  542. void form_movie_search(char *input) {
  543. Movie *movie;
  544. // Antes de tudo, precisamos testar se hб algum filme no arquivo
  545. if (movies_file_is_empty()) {
  546. printf(EMPTY_ERROR, __FILE__, "filme");
  547. return;
  548. }
  549. printf("\n=======\nPESQUISANDO FILME: \n\n");
  550. movie = form_movie_select(input);
  551. if (movie->id == NON_EXIST) {
  552. printf("%s: Nada encontrado.\n", __FILE__);
  553. } else {
  554. puts_movie_row_list();
  555. puts_movie(movie);
  556. }
  557. printf("\n=======\n");
  558. free(movie);
  559. }