1 /* ------- */
2 /* najio.c */
3 /* ------- */
4
5 /* naji input/output functions */
6 /* used by najitool and libnaji */
7
8 /* this .c file is a part */
9 /* of libnaji version 0.6.4 */
10
11 /* libnaji is based on */
12 /* the original najitool */
13
14 /* both najitool and libnaji */
15 /* are public domain and are */
16 /* made by the same author */
17 /* please read license.txt */
18
19 /* made by NECDET COKYAZICI */
20
21 #include "libnaji.h"
22
23 FILE *naji_input;
24 FILE *naji_input2;
25
26 FILE *naji_output;
27 FILE *naji_output2;
28
29 FILE *naji_edit;
30
naji_filesize(FILE * file)31 long naji_filesize(FILE *file)
32 {
33 long savepos=0;
34 long size=0;
35
36 savepos = ftell(file);
37
38 fseek(file, 0 , SEEK_END);
39 size = ftell(file);
40
41 fseek(file, savepos, SEEK_SET);
42
43 return size;
44 }
45
46
47 /* you might want to make your own najin and najout functions */
48 /* depending on what you need, for example it will probably */
49 /* be better to change these functions for your GUI programs */
50
najin(char * namein)51 void najin(char *namein)
52 {
53 int a;
54
55 naji_input = fopen(namein, "rb");
56
57 if (naji_input == NULL)
58 {
59 fprintf(stderr, "\n\nError, cannot open input file: %s", namein);
60 perror(" "); fprintf(stderr, "\n\n");
61 exit(2);
62 }
63
64
65 a = fgetc(naji_input);
66
67 if (a == EOF)
68 {
69 fprintf(stderr, "\n\nError, empty file.\n\n");
70 exit(1);
71 }
72 else
73 {
74 najinclose();
75
76 naji_input = fopen(namein, "rb");
77
78 if (naji_input == NULL)
79 {
80 fprintf(stderr, "\n\nError, cannot open input file: %s", namein);
81 perror(" "); fprintf(stderr, "\n\n");
82 exit(2);
83 }
84
85 }
86
87
88
89
90 }
91
92
najintext(char * namein)93 void najintext(char *namein)
94 {
95 int a;
96
97 naji_input = fopen(namein, "rt");
98
99 if (naji_input == NULL)
100 {
101 fprintf(stderr, "\n\nError, cannot open input file: %s", namein);
102 perror(" "); fprintf(stderr, "\n\n");
103 exit(2);
104 }
105
106
107 a = fgetc(naji_input);
108 if (a == EOF)
109 {
110 fprintf(stderr, "\n\nError, empty file.\n\n");
111 exit(1);
112 }
113 else
114 {
115 najinclose();
116
117 naji_input = fopen(namein, "rb");
118
119 if (naji_input == NULL)
120 {
121 fprintf(stderr, "\n\nError, cannot open input file: %s", namein);
122 perror(" "); fprintf(stderr, "\n\n");
123 exit(2);
124 }
125
126 }
127
128
129
130
131 }
132
133
134
135
najed(char * named)136 void najed(char *named)
137 {
138 naji_edit = fopen(named, "r+b");
139
140 if (naji_edit == NULL)
141 {
142 fprintf(stderr, "\n\nError, cannot open edit file: %s", named);
143 perror(" "); fprintf(stderr, "\n\n");
144 exit(6);
145 }
146
147 }
148
149
najin2(char * namein2)150 void najin2(char *namein2)
151 {
152 int a;
153
154 naji_input2 = fopen(namein2, "rb");
155
156 if (naji_input2 == NULL)
157 {
158 fprintf(stderr, "\n\nError, cannot open second input file: %s", namein2);
159 perror(" "); fprintf(stderr, "\n\n");
160 exit(2);
161 }
162
163
164 a = fgetc(naji_input2);
165 if (a == EOF)
166 {
167 fprintf(stderr, "\n\nError, empty file.\n\n");
168 exit(1);
169 }
170 else
171 {
172 najinclose();
173
174 naji_input2 = fopen(namein2, "rb");
175
176 if (naji_input2 == NULL)
177 {
178 fprintf(stderr, "\n\nError, cannot open second input file: %s", namein2);
179 perror(" "); fprintf(stderr, "\n\n");
180 exit(2);
181 }
182
183 }
184
185
186
187
188 }
189
190
191
najout(char * nameout)192 void najout(char *nameout)
193 {
194 int choice;
195 char buffer[1050];
196
197 naji_output = fopen(nameout, "rb");
198
199
200 if (naji_output != NULL)
201 {
202 fprintf(stderr, "\n\nError, output file already exists: %s\n\n", nameout);
203
204 while (1)
205 {
206
207 fprintf(stderr, "[Q]uit - [R]ename - [O]verwrite ?\n\n");
208 choice = fgetc(stdin);
209
210 if (choice == 'q' || choice == 'Q')
211 {
212 fclose(naji_output);
213 exit(3);
214 }
215
216
217 else if (choice == 'r' || choice == 'R')
218 {
219
220 fprintf(stderr, "\nType new name for output file: ");
221
222 fgetc(stdin);
223 safegets(buffer, 1024);
224
225 fclose(naji_output);
226
227 if (rename(nameout, buffer) != 0)
228 {
229 perror("\n\nError renaming output file");
230 fclose(naji_output);
231 exit(3);
232 }
233
234 else break;
235
236 }
237
238 else if (choice == 'o' || choice == 'O')
239 {
240 fclose(naji_output);
241 break;
242 }
243
244 else continue;
245
246 }
247
248
249 }
250
251 naji_output = fopen(nameout, "wb");
252 if (naji_output == NULL)
253 {
254 fprintf(stderr, "\n\nError, cannot open output file: %s", nameout);
255 perror(" "); fprintf(stderr, "\n\n");
256 exit(4);
257 }
258
259 }
260
261
262
najout2(char * nameout2)263 void najout2(char *nameout2)
264 {
265 int choice;
266 char buffer[1050];
267
268 naji_output2 = fopen(nameout2, "rb");
269
270 if (naji_output2 != NULL)
271 {
272 fprintf(stderr, "\n\nError, second output file already exists: %s\n\n",
273 nameout2);
274
275 while (1)
276 {
277
278 fprintf(stderr, "[Q]uit - [R]ename - [O]verwrite ?\n\n");
279 choice = fgetc(stdin);
280
281 if (choice == 'q' || choice == 'Q')
282 {
283 fclose(naji_output2);
284 exit(3);
285 }
286
287
288 else if (choice == 'r' || choice == 'R')
289 {
290
291 fprintf(stderr, "\nType new name for second output file: ");
292
293 fgetc(stdin);
294 safegets(buffer, 1024);
295
296 fclose(naji_output2);
297
298 if (rename(nameout2, buffer) != 0)
299 {
300 perror("\n\nError renaming second output file");
301 fclose(naji_output2);
302 exit(3);
303 }
304
305 else break;
306
307 }
308
309 else if (choice == 'o' || choice == 'O')
310 {
311 fclose(naji_output2);
312 break;
313 }
314
315 else continue;
316
317 }
318
319 }
320
321 naji_output2 = fopen(nameout2, "wb");
322 if (naji_output2 == NULL)
323 {
324 fprintf(stderr, "\n\nError, cannot open output file: %s", nameout2);
325 perror(" "); fprintf(stderr, "\n\n");
326 exit(4);
327 }
328
329 }
330
najinsize(void)331 long najinsize(void) { return naji_filesize(naji_input); }
najin2size(void)332 long najin2size(void) { return naji_filesize(naji_input2); }
najoutsize(void)333 long najoutsize(void) { return naji_filesize(naji_output); }
najout2size(void)334 long najout2size(void) { return naji_filesize(naji_output2); }
najedsize(void)335 long najedsize(void) { return naji_filesize(naji_edit); }
336
najinclose(void)337 void najinclose(void) { fclose(naji_input); }
najin2close(void)338 void najin2close(void) { fclose(naji_input2); }
najoutclose(void)339 void najoutclose(void) { fclose(naji_output); }
najout2close(void)340 void najout2close(void) { fclose(naji_output2); }
najedclose(void)341 void najedclose(void) { fclose(naji_edit); }
342
copyfile(char * namein,char * nameout)343 void copyfile(char *namein, char *nameout)
344 {
345 int a=0;
346
347 najin(namein);
348 najout(nameout);
349
350 loop
351 {
352 a = fgetc(naji_input);
353 if (a == EOF) endloop;
354 fputc(a, naji_output);
355 }
356
357 najinclose();
358 najoutclose();
359 }
360
361
362 /* todo: allow it to copy unlimited
363 number of files file not opening them
364 all at the same time, open them one by one */
365
366 /* append files */
367
368 /*
369 void apfiles(...)
370 {
371 }
372 */
373
374
375 /* copies while flipping the bits of each byte, for example
376
377 11110000 becomes
378 00001111
379
380 and
381
382 01010101 becomes
383 10101010 etc
384 */
385
flipcopy(char * namein,char * nameout)386 void flipcopy(char *namein, char *nameout)
387 {
388 int a=0;
389
390 najin(namein);
391 najout(nameout);
392
393 loop
394 {
395 a = fgetc(naji_input);
396 if (a == EOF) endloop;
397 fputc((~a), naji_output);
398 }
399
400 najinclose();
401 najoutclose();
402 }
403
404
405 /*
406 void copyrep(unsigned long int howmany)
407 {
408 unsigned long int i=0;
409 int a=0;
410
411 howmany++;
412
413 for (i=0; i < howmany; i++)
414 {
415 loop
416 {
417 a = fgetc(naji_input);
418 if (a == EOF) endloop;
419 fputc(a, naji_output);
420 }
421 }
422
423 }
424 */
425
426
safegets(char * buf,int size)427 void safegets(char *buf, int size)
428 {
429 int a;
430 int i=0;
431
432 while(1)
433 {
434
435 a = fgetc(stdin);
436
437 if (i == size)
438 {
439 buf[size] = '\0';
440 if ( (a == '\n') || (a == '\r') ) return;
441 }
442
443 if (i < size)
444 {
445
446 if ( (a == '\n') || (a == '\r') )
447 {
448 buf[i]='\0';
449
450 return;
451 }
452
453 if ( (a > 31) && (a < 127) )
454 {
455 buf[i]=a;
456 i++;
457 }
458
459 }
460
461 }
462
463 }
464
465
nextpage(void)466 void nextpage(void)
467 {
468 printf("\n- Press ENTER for the next page...\n");
469 getchar();
470 }
471
472
473 /* finds the longest line in a text file and returns the result */
474
longl(char * namein)475 unsigned long longl(char *namein)
476 {
477 int a;
478
479 unsigned long length = 0;
480 unsigned long longest = 0;
481
482 najin(namein);
483
484 while (1)
485 {
486
487 a = getc(naji_input);
488
489 if (a == EOF)
490 break;
491
492 if (a == '\n')
493 {
494 if (length > longest)
495 longest = length;
496
497 length=0;
498 }
499 else length++;
500
501 }
502
503 najinclose();
504
505 return longest;
506 }
507
508
longline(char * namein)509 void longline(char *namein)
510 {
511 printf("\n\nLongest line is: %lu\n\n", longl(namein));
512 }
513
514
515 /* counts how many lines there are in a text file and returns the result */
516
howl(char * namein)517 unsigned long howl(char *namein)
518 {
519 int a;
520
521 unsigned long lines = 0;
522
523 najin(namein);
524
525 while (1)
526 {
527
528 a = getc(naji_input);
529
530 if (a == EOF)
531 break;
532
533 if (a == '\n')
534 lines++;
535
536 }
537
538 najinclose();
539
540 return lines;
541 }
542
543
howline(char * namein)544 void howline(char *namein)
545 {
546 printf("\n\nTotal number of lines is: %lu\n\n", howl(namein));
547 }
548
549
naji_lines_alloc(unsigned long howmany,unsigned long howlong)550 char **naji_lines_alloc(unsigned long howmany, unsigned long howlong)
551 {
552 char **buffer = NULL;
553 unsigned long i;
554
555 buffer = (char **) malloc(howmany * sizeof(char *));
556
557 exitnull(buffer);
558
559 for (i=0; i<howmany; i++)
560 {
561 buffer[i] = (char *) malloc(howlong * sizeof(char) + 3);
562 exitnull(buffer[i]);
563 }
564
565 return buffer;
566 }
567
568
naji_lines_free(char ** buffer,unsigned long howmany)569 void naji_lines_free(char **buffer, unsigned long howmany)
570 {
571 unsigned long i;
572
573 for (i=0; i<howmany; i++)
574 free(buffer[i]);
575
576 free(buffer);
577
578 buffer = NULL;
579 }
580
581
naji_lines_load(char * namein,char ** buffer,unsigned long howmany,unsigned long howlong)582 void naji_lines_load(char *namein, char **buffer, unsigned long howmany, unsigned long howlong)
583 {
584 int a;
585 unsigned long i = 0;
586 unsigned long c = 0;
587
588 najintext(namein);
589
590 while (1)
591 {
592 a = fgetc(naji_input);
593
594 if (a == EOF)
595 {
596 buffer[i][c] = '\0';
597 break;
598 }
599
600 else if (a == '\n')
601 {
602 buffer[i][c] = '\n';
603 c++;
604
605 buffer[i][c] = '\0';
606 c++;
607
608 i++;
609
610 c = 0;
611
612 if (i >= howmany)
613 break;
614 }
615
616 else if (a == '\r')
617 ;
618
619 else
620 {
621 buffer[i][c] = a;
622 c++;
623
624 if (c == howlong)
625 {
626 buffer[i][c] = '\0';
627 break;
628 }
629
630
631 }
632
633 }
634
635
636 najinclose();
637
638 }
639
640
naji_lines_backwards_print(char ** buffer,unsigned long howmany)641 void naji_lines_backwards_print(char **buffer, unsigned long howmany)
642 {
643 signed long backwards_howmany = 0;
644 signed long backwards_i = 0;
645
646 backwards_howmany = (signed long) howmany;
647
648 backwards_howmany--;
649
650 if (strlen(buffer[backwards_howmany]) > 0)
651 if (strchr(buffer[backwards_howmany], '\n') == NULL)
652 {
653 printf("%s\n", buffer[backwards_howmany]);
654 backwards_howmany--;
655 }
656
657 for (backwards_i = backwards_howmany; backwards_i >= 0; backwards_i--)
658 printf("%s", buffer[backwards_i]);
659
660 }
661
662
naji_lines_print(char ** buffer,unsigned long howmany)663 void naji_lines_print(char **buffer, unsigned long howmany)
664 {
665 unsigned long i;
666
667 for (i=0; i<howmany; i++)
668 printf("%s", buffer[i]);
669
670 }
671
672
lineback(char * namein)673 void lineback(char *namein)
674 {
675 char **buffer = NULL;
676 unsigned long howmany;
677 unsigned long howlong;
678
679 howmany = howl(namein);
680 howlong = longl(namein);
681
682 howlong += 3;
683 howmany ++;
684
685 buffer = naji_lines_alloc(howmany, howlong);
686
687 naji_lines_load(namein, buffer, howmany, howlong);
688
689 naji_lines_backwards_print(buffer, howmany);
690
691 naji_lines_free(buffer, howmany);
692 }
693
694
695
return_random(int max)696 int return_random(int max)
697 {
698 int random_number;
699 int limit;
700
701 limit = RAND_MAX - RAND_MAX % max;
702 do random_number = rand(); while (random_number >= limit);
703
704 return random_number % max;
705 }
706
707
shuffle_int_array(int * array,int size)708 void shuffle_int_array(int *array, int size)
709 {
710 int a;
711 int b;
712 int c;
713
714 size--;
715
716 srand(time(NULL));
717
718 for (a=size; a>0; a--)
719 {
720 b = return_random(a + 1);
721 c = array[b];
722 array[b] = array[a];
723 array[a] = c;
724 }
725
726 }
727
728
naji_lines_random_print(char ** buffer,int howmany)729 void naji_lines_random_print(char **buffer, int howmany)
730 {
731 unsigned long i = 0;
732 int *vektor = NULL;
733
734 vektor = (int *) malloc(howmany * sizeof (int));
735 exitnull(vektor)
736
737 for (i=0; i<howmany; i++)
738 vektor[i] = i;
739
740 shuffle_int_array(vektor, howmany);
741
742 for (i=0; i<howmany; i++)
743 printf("%s", buffer[vektor[i]]);
744
745 free(vektor);
746 vektor = NULL;
747 }
748
749
rndlines(char * namein)750 void rndlines(char *namein)
751 {
752 char **buffer = NULL;
753 unsigned long howmany;
754 unsigned long howlong;
755
756 howmany = howl(namein);
757 howlong = longl(namein);
758
759 howlong += 3;
760 howmany ++;
761
762 buffer = naji_lines_alloc(howmany, howlong);
763
764 naji_lines_load(namein, buffer, howmany, howlong);
765
766 naji_lines_random_print(buffer, howmany);
767
768 naji_lines_free(buffer, howmany);
769 }
770
771
najifgets(char * buf,int size,FILE * input)772 void najifgets(char *buf, int size, FILE *input)
773 {
774 int a;
775 int i=0;
776
777 while(1)
778 {
779
780 a = fgetc(naji_input);
781
782 if (a == EOF)
783 {
784 buf[i] = '\0';
785 return;
786 }
787
788 if (i == size)
789 {
790 buf[i+1] = '\0';
791 return;
792 }
793
794 if (a == '\n')
795 {
796 buf[i] = '\n';
797 buf[i+1] = '\0';
798 return;
799 }
800 else
801 {
802 buf[i] = a;
803 buf[i+1] = '\0';
804 }
805
806 i++;
807
808 }
809
810 }
811