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