├── README.md
├── main.c
└── makefile
/README.md:
--------------------------------------------------------------------------------
1 | # pixt
2 |
3 | A stripped down cli text editor that features a directory navigator for quicker traversal.
4 |
5 |

6 |
7 | ## Feature Request
8 |
9 | If you want a new feature please open a issue on this repository.
10 |
11 | ## Hot Keys
12 |
13 | ### Browser Mode
14 |
15 | Ctrl-N : Creates an empty file in the current directory and enteres editing mode.
16 |
17 | ESC->Enter : Quit.
18 |
19 | ##
20 |
21 | Use the arrow keys to navigate your directories.
22 |
23 | When a file is selected and you hit the right arrow -- a preview of the file will appear.
24 |
25 | After previewing the file -- hit enter to edit the file.
26 |
27 | 
28 |
29 | ### Editor Mode
30 |
31 | Ctrl-O : Enter Save Prompt.
32 |
33 | Ctrl-X : Exit editor (return to Browser Mode).
34 |
35 | Ctrl-Y : Page Up.
36 |
37 | Ctrl-V : Page Down.
38 |
39 | ESC->Enter : Quit.
40 |
--------------------------------------------------------------------------------
/main.c:
--------------------------------------------------------------------------------
1 | //
2 | // main.c
3 | //
4 | //
5 | // Created by fairy-slipper on 1/13/18.
6 | //
7 |
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 | #include
16 | #include
17 | #include
18 | #include
19 |
20 | #define INIT 1
21 | #define UPDATE 2
22 |
23 | #define ANSI_COLOR_NORMAL "\x1B[0m"
24 | #define ANSI_COLOR_RED "\x1B[31m"
25 | #define ANSI_COLOR_GREEN "\x1B[32m"
26 | #define ANSI_COLOR_YELLOW "\x1B[33m"
27 | #define ANSI_COLOR_BLUE "\x1B[34m"
28 | #define ANSI_COLOR_PURPLE "\x1B[35m"
29 | #define ANSI_COLOR_CYAN "\x1B[36m"
30 | #define ANSI_COLOR_WHITE "\x1B[37m"
31 |
32 | #define ANSI_BLINK "\x1b[5m"
33 | #define ANSI_HIDE_CURSOR "\e[?25l"
34 | #define ANSI_SHOW_CURSOR "\e[?25h"
35 |
36 | const int MAX_CONSOLE_TEXT = 10000;
37 | static int FILE_SIZE = 1000;
38 |
39 | static volatile int appRunning = 1;
40 | static struct winsize winsize;
41 | static int cooked = 0;
42 | static int editing = 0;
43 | static int savePrompt = 0;
44 | static int readyToRender = 1;
45 |
46 | static char enteredChar = 0;
47 | static char *consoleText;
48 | static int cursorPosition = 2;
49 |
50 | static int editingCursorPositionX = 1;
51 | static int editingCursorPositionY = 1;
52 |
53 | static FILE *fp = NULL;
54 | static int fpOffset = 0;
55 | static FILE *fpClone = NULL;
56 |
57 | static char *newFileString;
58 | static int newFileStrOffset = -1;
59 | static int editingPageOffset;
60 | static int currEditingPageOffset = 0;
61 |
62 | struct dirent *pDirent;
63 | struct dirent *selectedDirent;
64 | static DIR *pDir;
65 | static char cwd[PATH_MAX];
66 | static char *currCloneFilePath;
67 | static int directoryWidth = 0;
68 | static int directoryHeight = 0;
69 | static int contentCount;
70 | static int numOfPagesNav = 0;
71 | static int currPage = 0;
72 |
73 | void appendChars(char subject[], const char insert[], int pos) {
74 | if(strlen(insert)+strlen(subject) > FILE_SIZE) {
75 | FILE_SIZE *= 2;
76 | newFileString = (char *)realloc(newFileString, FILE_SIZE);
77 | }
78 | char buf[FILE_SIZE];
79 | memset(buf, '\0', FILE_SIZE);
80 | strncpy(buf, subject, pos);
81 | int len = strlen(buf);
82 | strcpy(buf+len, insert);
83 | len += strlen(insert);
84 | strcpy(buf+len, subject+pos);
85 | strcpy(subject, buf);
86 | }
87 |
88 | void removeChar(char subject[], int pos) {
89 | memmove(&subject[pos], &subject[pos + 1], strlen(subject) - pos);
90 | }
91 |
92 | void analyzeDirectory() {
93 | rewinddir(pDir);
94 | directoryWidth = 0;
95 | directoryHeight = 0;
96 | while((pDirent = readdir(pDir)) != NULL) {
97 | if(directoryWidth < strlen(pDirent->d_name)) {
98 | directoryWidth = strlen(pDirent->d_name);
99 | }
100 | ++directoryHeight;
101 | }
102 | --directoryHeight;
103 | rewinddir(pDir);
104 |
105 | numOfPagesNav = (directoryHeight/winsize.ws_row) + 1;
106 | }
107 |
108 | void processVal(char val, int *idx) {
109 | int endIdx = *idx - 1;
110 | while(newFileString[endIdx] != '\n' && newFileString[endIdx] != ' ' && newFileString[endIdx] != '(' && newFileString[endIdx] != ')' && newFileString[endIdx] != ';' && newFileString[endIdx] != '\0') {
111 | endIdx++;
112 | }
113 |
114 | if(*idx - 1 == endIdx) {
115 | printf("%c", val);
116 | return;
117 | }
118 |
119 | char word[endIdx - *idx + 2];
120 | memset(word, '\0', sizeof(word));
121 | strncpy(word, &newFileString[*idx - 1], endIdx - *idx + 1);
122 | if(strcmp(word, "int") == 0) {
123 | printf("%sint%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
124 | (*idx) += 2;
125 | } else if(strcmp(word, "char") == 0) {
126 | printf("%schar%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
127 | (*idx) += 3;
128 | } else if(strcmp(word, "if") == 0) {
129 | printf("%sif%s", ANSI_COLOR_PURPLE, ANSI_COLOR_NORMAL);
130 | (*idx) += 1;
131 | } else if(strcmp(word, "else") == 0) {
132 | printf("%selse%s", ANSI_COLOR_PURPLE, ANSI_COLOR_NORMAL);
133 | (*idx) += 3;
134 | } else if(strcmp(word, "switch") == 0) {
135 | printf("%sswitch%s", ANSI_COLOR_PURPLE, ANSI_COLOR_NORMAL);
136 | (*idx) += 5;
137 | } else if(strcmp(word, "while") == 0) {
138 | printf("%swhile%s", ANSI_COLOR_PURPLE, ANSI_COLOR_NORMAL);
139 | (*idx) += 4;
140 | } else if(strcmp(word, "long") == 0) {
141 | printf("%slong%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
142 | (*idx) += 3;
143 | } else if(strcmp(word, "short") == 0) {
144 | printf("%sshort%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
145 | (*idx) += 4;
146 | } else if(strcmp(word, "float") == 0) {
147 | printf("%sfloat%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
148 | (*idx) += 4;
149 | } else if(strcmp(word, "double") == 0) {
150 | printf("%sdouble%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
151 | (*idx) += 5;
152 | } else if(strcmp(word, "struct") == 0) {
153 | printf("%sstruct%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
154 | (*idx) += 5;
155 | } else if(strcmp(word, "enum") == 0) {
156 | printf("%senum%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
157 | (*idx) += 3;
158 | } else if(strcmp(word, "return") == 0) {
159 | printf("%sreturn%s", ANSI_COLOR_YELLOW, ANSI_COLOR_NORMAL);
160 | (*idx) += 5;
161 | } else {
162 |
163 | int notNumber = 0;
164 | for(int i=0; i= currPage * winsize.ws_row) {
216 | break;
217 | }
218 | ++pageOffset;
219 | }
220 |
221 | int rowOffset = 0;
222 | if(cooked) {
223 | rowOffset = 2;
224 | }
225 |
226 | if(!editing) {
227 | int newLineFlag = 0;
228 | for(int h=0; hd_name);
235 | }
236 | int nonPrintable = 0;
237 | int tabOccured = 0;
238 | if(newLineFlag > 0) {--newLineFlag;}
239 | for(int w=0; w%s", ANSI_COLOR_GREEN, ANSI_COLOR_NORMAL);
243 | selectedDirent = pDirent;
244 | } else {
245 | printf(" ");
246 | }
247 | } else {
248 | if(pDirent != NULL && contentLen > w - 1 && pDirent->d_name[w - 1] != '\n' && pDirent->d_name[w - 1] != '\r') {
249 | printf("%c", pDirent->d_name[w - 1]);
250 | } else if(directoryWidth + 2 == w) {
251 | printf("|");
252 | } else if(directoryWidth + 3 == w) {
253 | printf(" ");
254 | } else if(fp != NULL && w > directoryWidth + 3) {
255 | int val;
256 | fpOffset = ftell(fp);
257 | if(tabOccured || newLineFlag) {
258 | printf(" ");
259 | } else if(!nonPrintable) {
260 | val = fgetc(fp);
261 | if((31 < val && val < 127) || val == 9) {
262 | if(val == 9) {
263 | tabOccured = 4;
264 | printf(" ");
265 | } else {
266 | printf("%c", val);
267 | }
268 | } else {
269 | nonPrintable = 1;
270 | printf(" ");
271 | }
272 | } else {
273 | printf(" ");
274 | val = fgetc(fp);
275 | if(val == '\n') {
276 | newLineFlag = 2;
277 | } else if((31 < val && val < 127) || val == 9) {
278 | fseek(fp, -1, SEEK_CUR);
279 | }
280 | }
281 | } else {
282 | printf(" ");
283 | }
284 | if(tabOccured > 0) { --tabOccured;}
285 | }
286 | }
287 | }
288 | if(cooked) {
289 | printf("\n");
290 | }
291 | } else {
292 | int *i = (int *)malloc(sizeof(int));
293 | *i = editingPageOffset;
294 | for(int h=0; h 0) { --tabOccured;}
320 | }
321 | }
322 | free(i);
323 | }
324 | rewind(stdout);
325 | printf("%s", ANSI_SHOW_CURSOR);
326 | readyToRender = 1;
327 | }
328 |
329 | void downArrow(int enteredValue) {
330 | if(!editing) {
331 | if(fp != NULL) {
332 | fclose(fp);
333 | }
334 | ++cursorPosition;
335 | if(cursorPosition > contentCount - 1) {
336 | cursorPosition = 0;
337 | ++currPage;
338 | if(currPage > numOfPagesNav - 1) {
339 | currPage = 0;
340 | }
341 | }
342 | refreshDisplay(UPDATE);
343 | printf("%s", ANSI_HIDE_CURSOR);
344 | } else {
345 | int i = 0;
346 | int flagWasNegative = 0;
347 | if(newFileStrOffset == -1 || newFileString[newFileStrOffset] == 10) {
348 | ++newFileStrOffset;
349 | flagWasNegative = 1;
350 | }
351 |
352 | while(newFileString[newFileStrOffset] != '\n' && newFileString[newFileStrOffset] != '\0') {
353 | if (i > winsize.ws_col) {
354 | ++editingCursorPositionY;
355 | if(flagWasNegative) {
356 | --newFileStrOffset;
357 | }
358 | --newFileStrOffset;
359 | if(editingCursorPositionY > winsize.ws_row) {
360 | ++newFileStrOffset;
361 | --editingCursorPositionY;
362 | i = 0;
363 | while(newFileString[editingPageOffset] != '\n' && newFileString[editingPageOffset] != '\0' && i < winsize.ws_col) {
364 | ++editingPageOffset;
365 | ++i;
366 | }
367 | ++editingPageOffset;
368 | refreshDisplay(UPDATE);
369 | }
370 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
371 | return;
372 | }
373 | ++i;
374 | ++newFileStrOffset;
375 | }
376 |
377 | if(newFileString[newFileStrOffset] == '\0') {
378 | newFileStrOffset -= i;
379 | return;
380 | }
381 |
382 | if(newFileString[newFileStrOffset] == '\n') {
383 | ++newFileStrOffset;
384 | }
385 |
386 | if(i + editingCursorPositionX > winsize.ws_col) {
387 | editingCursorPositionX = ((i+editingCursorPositionX) % winsize.ws_col) - 1;
388 | ++editingCursorPositionY;
389 | newFileStrOffset-=2;
390 | } else {
391 | i = 1;
392 | int j = 0;
393 | while(i < editingCursorPositionX && newFileString[newFileStrOffset] != '\0' && newFileString[newFileStrOffset] != '\n') {
394 | ++i;
395 | ++j;
396 | ++newFileStrOffset;
397 | }
398 | --newFileStrOffset;
399 | ++editingCursorPositionY;
400 | editingCursorPositionX = i;
401 | }
402 | if(editingCursorPositionY > winsize.ws_row) {
403 | --editingCursorPositionY;
404 | int q = 0;
405 | int p = 0;
406 | while(newFileString[editingPageOffset+q] != '\n' && newFileString[editingPageOffset+q] != '\0') {
407 | if (q >= winsize.ws_col - 1) {
408 | break;
409 | }
410 | ++q;
411 | ++p;
412 | }
413 | editingPageOffset += (p+1);
414 | refreshDisplay(UPDATE);
415 | }
416 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
417 | }
418 | }
419 |
420 | void upArrow(int enteredValue) {
421 | if(!editing) {
422 | if(fp != NULL) {
423 | fclose(fp);
424 | }
425 | --cursorPosition;
426 | if(cursorPosition < 0) {
427 | cursorPosition = winsize.ws_row - 1;
428 | --currPage;
429 | if(currPage < 0) {
430 | currPage = numOfPagesNav - 1;
431 | if(currPage != 0) {
432 | cursorPosition = (directoryHeight - 1)%winsize.ws_row;
433 | }
434 | }
435 | }
436 | refreshDisplay(UPDATE);
437 | printf("%s", ANSI_HIDE_CURSOR);
438 | } else {
439 | int i = 0;
440 | while(newFileStrOffset > -1 && newFileString[newFileStrOffset] != 10) {
441 | if (i >= winsize.ws_col - 1) {
442 | --newFileStrOffset;
443 | --editingCursorPositionY;
444 | if(editingCursorPositionY <= 0) {
445 | ++editingCursorPositionY;
446 | int j = 0;
447 | i = 1;
448 | while(editingPageOffset - i > -1 && newFileString[editingPageOffset-i] != 10) {
449 | ++j;
450 | ++i;
451 | }
452 |
453 | editingPageOffset -= winsize.ws_col;
454 | refreshDisplay(UPDATE);
455 | }
456 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
457 | return;
458 | }
459 | ++i;
460 | --newFileStrOffset;
461 | }
462 | if(newFileString[newFileStrOffset] == '\n') {
463 | --newFileStrOffset;
464 | }
465 |
466 | int wrapFlag = 0;
467 | i = 0;
468 | while(newFileStrOffset > -1 && newFileString[newFileStrOffset] != 10) {
469 | if (i >= winsize.ws_col - 1) {
470 | wrapFlag = 1;
471 | }
472 | --newFileStrOffset;
473 | ++i;
474 | }
475 | ++newFileStrOffset;
476 |
477 | if(wrapFlag) {
478 | if(editingCursorPositionY <= 2) {
479 | editingCursorPositionX = (i)%winsize.ws_col;
480 | ++newFileStrOffset;
481 | } else {
482 | editingCursorPositionX = (i+1)%winsize.ws_col;
483 | }
484 | }
485 |
486 | i = 1;
487 | while(i < editingCursorPositionX) {
488 | if(newFileString[newFileStrOffset] == 10) {
489 | break;
490 | } else if(newFileString[newFileStrOffset] == '\0') {
491 | break;
492 | } else if(newFileString[newFileStrOffset] == 9) {
493 | i+=4;
494 | ++newFileStrOffset;
495 | } else {
496 | i++;
497 | ++newFileStrOffset;
498 | }
499 | }
500 | if(wrapFlag) {
501 | newFileStrOffset+=winsize.ws_col;
502 | }
503 | --newFileStrOffset;
504 | editingCursorPositionX = i;
505 | --editingCursorPositionY;
506 | if(editingCursorPositionY < 1) {
507 | if(wrapFlag) {
508 | ++editingCursorPositionY;
509 | i = 0;
510 | int j = 0;
511 | if(newFileString[editingPageOffset - j] == '\n') {
512 | ++j;
513 | ++i;
514 | }
515 | while(editingPageOffset - j > -1 && newFileString[editingPageOffset - j] != 10) {
516 | ++j;
517 | ++i;
518 | }
519 | if(newFileString[editingPageOffset - j] == '\n') {
520 | ++j;
521 | ++i;
522 | }
523 | while(editingPageOffset - j > -1 && newFileString[editingPageOffset - j] != 10) {
524 | ++j;
525 | ++i;
526 | }
527 | editingCursorPositionX = (i-1)%winsize.ws_col;
528 | editingPageOffset-=editingCursorPositionX;
529 | } else {
530 | ++editingCursorPositionY;
531 | if(newFileString[editingPageOffset] == '\n') {
532 | --editingPageOffset;
533 | }
534 | while(editingPageOffset > -1 && newFileString[editingPageOffset] != 10) {
535 | --editingPageOffset;
536 | }
537 | if(newFileString[editingPageOffset] == '\n') {
538 | --editingPageOffset;
539 | }
540 | while(editingPageOffset > -1 && newFileString[editingPageOffset] != 10) {
541 | --editingPageOffset;
542 | }
543 | ++editingPageOffset;
544 | i = 1;
545 | int j = 0;
546 | while(i < editingCursorPositionX) {
547 | if(newFileString[editingPageOffset + j] == 10) {
548 | break;
549 | }
550 | ++i;
551 | ++j;
552 | }
553 |
554 | editingCursorPositionX = i;
555 | }
556 | refreshDisplay(UPDATE);
557 | }
558 | }
559 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
560 | }
561 |
562 | void rightArrow(int enteredValue) {
563 | if(!editing) {
564 | char tmp[sizeof(selectedDirent->d_name)];
565 | char cwdTmp[sizeof(cwd)];
566 | strcpy(tmp, selectedDirent->d_name);
567 | strcpy(cwdTmp, cwd);
568 | strcat(cwdTmp, "/");
569 | strcat(cwdTmp, tmp);
570 | closedir(pDir);
571 | pDir = opendir(cwdTmp);
572 | if (pDir != NULL) {
573 | strcpy(cwd, cwdTmp);
574 | cursorPosition = 2;
575 | currPage = 0;
576 | } else {
577 | pDir = opendir(cwd);
578 | fclose(fp);
579 | char filePath[sizeof(cwd)];
580 | memset(filePath, 0, sizeof(filePath));
581 | strcpy(filePath, cwd);
582 | strcat(filePath, "/");
583 | strcat(filePath, selectedDirent->d_name);
584 | strcpy(currCloneFilePath, filePath);
585 | strcat(currCloneFilePath, "-tmp");
586 | fp = fopen(filePath, "r");
587 | }
588 | refreshDisplay(UPDATE);
589 | } else {
590 | if(newFileString[newFileStrOffset+1] == '\0') {
591 |
592 | } else {
593 | ++newFileStrOffset;
594 | if(newFileString[newFileStrOffset] == 10 || enteredValue == 10) {
595 | editingCursorPositionX = 1;
596 | if(editingCursorPositionY < winsize.ws_row) {
597 | ++editingCursorPositionY;
598 | } else {
599 | while(newFileString[editingPageOffset] != 10 && newFileString[editingPageOffset] != '\0') {
600 | ++editingPageOffset;
601 | }
602 | if (newFileString[editingPageOffset] == 10) {
603 | ++editingPageOffset;
604 | }
605 | refreshDisplay(UPDATE);
606 | }
607 | } else if(newFileString[newFileStrOffset] == 9) {
608 | editingCursorPositionX += 4;
609 | } else {
610 | if(editingCursorPositionX < winsize.ws_col) {
611 | ++editingCursorPositionX;
612 | } else {
613 | if(editingCursorPositionY < winsize.ws_row) {
614 | editingCursorPositionX = 1;
615 | editingCursorPositionY++;
616 | } else {
617 | int i = 0;
618 | while(newFileString[newFileStrOffset + i] != 10 && newFileString[newFileStrOffset + i] != '\0' && i=0; i--) {
639 | if (cwd[i] == '/') {
640 | cwd[i] = '\0';
641 | if(cwd[0] == '\0') {
642 | cwd[0] = '/';
643 | cwd[1] = '\0';
644 | }
645 | break;
646 | }
647 | }
648 | }
649 | closedir (pDir);
650 | pDir = opendir(cwd);
651 | if (pDir == NULL) {
652 | printf ("Cannot open directory\n");
653 | }
654 | cursorPosition = 2;
655 | currPage = 0;
656 | refreshDisplay(UPDATE);
657 | } else {
658 | if(newFileStrOffset - 1 < -1) {
659 |
660 | } else {
661 | if (editingCursorPositionY <= 1 && editingCursorPositionX <= 1) {
662 | int i = 0;
663 | int j = 0;
664 | --editingPageOffset;
665 | if(newFileString[editingPageOffset] == 10) {
666 | --editingPageOffset;
667 | }
668 | while(newFileString[editingPageOffset - j] != 10 && editingPageOffset - j > -2) {
669 | ++i;
670 | ++j;
671 | }
672 |
673 | --newFileStrOffset;
674 |
675 | editingCursorPositionX = (i%winsize.ws_col)+1;
676 | for(int x=0; x -2) {
700 | ++cnt;
701 | ++i;
702 | }
703 | editingCursorPositionX = cnt;
704 | refreshDisplay(UPDATE);
705 | } else {
706 | --editingCursorPositionY;
707 | --newFileStrOffset;
708 | int i = 0;
709 | while(newFileString[newFileStrOffset - i] != 10 && newFileStrOffset - i > -1) {
710 | ++i;
711 | }
712 | editingCursorPositionX = (i+1)%winsize.ws_col;
713 | }
714 | } else if(newFileString[newFileStrOffset] == 9 || enteredValue == 700) {
715 | editingCursorPositionX -= 4;
716 | } else {
717 | if(editingCursorPositionX <= 1) {
718 | int i = 0;
719 | while(newFileString[newFileStrOffset - i] != 10 && newFileStrOffset - i > -1 && i < winsize.ws_col) {
720 | ++i;
721 | }
722 | --editingCursorPositionY;
723 | editingCursorPositionX = i;
724 | --newFileStrOffset;
725 | --newFileStrOffset;
726 | } else {
727 | --editingCursorPositionX;
728 | --newFileStrOffset;
729 | }
730 | }
731 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
732 | }
733 | }
734 | }
735 |
736 | void cancelHandler(int x) {
737 | if(savePrompt) {
738 | savePrompt = 0;
739 | system("/bin/stty raw");
740 | cooked = 0;
741 | refreshDisplay(INIT);
742 | refreshDisplay(UPDATE);
743 | printf("%s", ANSI_SHOW_CURSOR);
744 | fputc(132, stdin);
745 | }
746 | }
747 |
748 | void *updateWindowSize() {
749 | for (;;) {
750 | int width = winsize.ws_col;
751 | int height = winsize.ws_row;
752 | ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize);
753 | if(width != winsize.ws_col || height != winsize.ws_row) {
754 | refreshDisplay(UPDATE);
755 | }
756 | usleep(250000);
757 | }
758 | }
759 |
760 | int main(int argc, char **argv) {
761 |
762 | ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize);
763 | pthread_t windowSizeUpdateThread;
764 | pthread_create(&windowSizeUpdateThread, NULL, updateWindowSize, NULL);
765 | system("/bin/stty raw");
766 | signal(SIGINT, cancelHandler);
767 |
768 | consoleText = (char *)malloc(MAX_CONSOLE_TEXT*sizeof(char));
769 | currCloneFilePath = (char *)malloc(MAX_CONSOLE_TEXT*sizeof(char));
770 | newFileString = (char *)malloc(FILE_SIZE*sizeof(char));
771 | memset(newFileString, '\0', FILE_SIZE);
772 | editingPageOffset = 0;
773 |
774 | if (getcwd(cwd, sizeof(cwd)) == NULL) {
775 | perror("getcwd() error");
776 | }
777 |
778 | pDir = opendir (cwd);
779 | if (pDir == NULL) {
780 | printf ("Cannot open directory\n");
781 | }
782 |
783 | refreshDisplay(INIT);
784 | refreshDisplay(UPDATE);
785 |
786 | char newFilename[1024];
787 | int newFilenamePos = 0;
788 | int lastEnteredChar = 0;
789 | int lastlastEnteredChar = 0;
790 | while ((enteredChar = fgetc(stdin)) != EOF && appRunning) {
791 | if(readyToRender) {
792 | //printf("%i\n", enteredChar);
793 | if((lastEnteredChar == 27 && enteredChar == 13) || (lastEnteredChar == 27 && enteredChar == 10)) {
794 | appRunning = 0;
795 | break;
796 | }
797 | if(savePrompt && enteredChar != 10) {
798 | newFilename[newFilenamePos++] = enteredChar;
799 | newFilename[newFilenamePos] = '\0';
800 | continue;
801 | }
802 | if(savePrompt && enteredChar == 10) {
803 | system("/bin/stty raw");
804 | cooked = 0;
805 | savePrompt = 0;
806 | newFilenamePos = 0;
807 | editing = 0;
808 | char filePath[sizeof(cwd)];
809 | memset(filePath, 0, sizeof(filePath));
810 | strcpy(filePath, cwd);
811 | strcat(filePath, "/");
812 | strcpy(currCloneFilePath, filePath);
813 | strcat(currCloneFilePath, newFilename);
814 | fpClone = fopen(currCloneFilePath, "w+");
815 | int val;
816 | int i = 0;
817 | while((val = newFileString[i++]) != '\0') {
818 | int val2, val3, val4;
819 | if(val == ' ') {
820 | if((val2 = newFileString[i++]) == ' ') {
821 | if((val3 = newFileString[i++]) == ' ') {
822 | if((val4 = newFileString[i++]) == ' ') {
823 | fputc('\t', fpClone);
824 | } else {
825 | fputc(val, fpClone);
826 | fputc(val2, fpClone);
827 | fputc(val3, fpClone);
828 | fputc(val4, fpClone);
829 | }
830 | } else {
831 | fputc(val, fpClone);
832 | fputc(val2, fpClone);
833 | fputc(val3, fpClone);
834 | }
835 | } else {
836 | fputc(val, fpClone);
837 | fputc(val2, fpClone);
838 | }
839 | } else {
840 | fputc(val, fpClone);
841 | }
842 | }
843 | fclose(fpClone);
844 | refreshDisplay(UPDATE);
845 | }
846 | if(editing && enteredChar == 15) {
847 | savePrompt = 1;
848 | system ("/bin/stty cooked");
849 | cooked = 1;
850 | refreshDisplay(UPDATE);
851 | refreshDisplay(UPDATE);
852 | if (fp != NULL) {
853 | printf("Hit CTRL-C to Cancel. Save as (%s): ", selectedDirent->d_name);
854 | } else {
855 | printf("Hit CTRL-C to Cancel. Save as: ");
856 | }
857 | continue;
858 | }
859 | if(editing && enteredChar == 24) {
860 | editing = 0;
861 | fclose(fpClone);
862 | remove(currCloneFilePath);
863 | refreshDisplay(UPDATE);
864 | continue;
865 | }
866 | if(editing && enteredChar == 22) {
867 | while(editingCursorPositionY < winsize.ws_row) {
868 | downArrow(-1);
869 | }
870 | for(int i=0; i 1) {
877 | upArrow(-1);
878 | }
879 | for(int i=0; i FILE_SIZE) {
894 | FILE_SIZE = sizeFile * 2;
895 | newFileString = (char *)realloc(newFileString, FILE_SIZE);
896 | }
897 | rewind(fp);
898 | int val;
899 | int i = 0;
900 | while((val = fgetc(fp)) != EOF) {
901 | if(val == 10) {
902 | int j = 1;
903 | while(newFileString[i-j] == ' ') {
904 | ++j;
905 | }
906 | --j;
907 | newFileString[i-j] = val;
908 | i = i - j + 1;
909 | } else if(val == 9) {
910 | newFileString[i] = ' ';
911 | newFileString[i+1] = ' ';
912 | newFileString[i+2] = ' ';
913 | newFileString[i+3] = ' ';
914 | i+=4;
915 | } else {
916 | newFileString[i++] = val;
917 | }
918 | }
919 | newFileString[i] = '\0';
920 | rewind(fp);
921 | refreshDisplay(UPDATE);
922 | editingCursorPositionX = 1;
923 | editingCursorPositionY = 1;
924 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
925 | }
926 | } else if(enteredChar == 14 && !cooked && !editing) {
927 | editing = 1;
928 | refreshDisplay(UPDATE);
929 | editingCursorPositionX = 1;
930 | editingCursorPositionY = 1;
931 | printf("\033[%i;%iH", editingCursorPositionY, editingCursorPositionX);
932 |
933 | } else if(!cooked) {
934 | if(lastlastEnteredChar == 27 && lastEnteredChar == 91 && enteredChar == 65) {
935 | upArrow(-1);
936 | } else if(lastlastEnteredChar == 27 && lastEnteredChar == 91 && enteredChar == 66) {
937 | downArrow(-1);
938 | } else if(lastlastEnteredChar == 27 && lastEnteredChar == 91 && enteredChar == 67) {
939 | rightArrow(-1);
940 | } else if(lastlastEnteredChar == 27 && lastEnteredChar == 91 && enteredChar == 68) {
941 | leftArrow(-1);
942 | } else if(lastlastEnteredChar != 27 && lastEnteredChar != 27 && ((enteredChar > 31 && enteredChar < 127) || (enteredChar == 13))) {
943 | if(enteredChar == 13) {enteredChar = '\n';}
944 | char tmp[2];
945 | tmp[0] = enteredChar;
946 | tmp[1] = '\0';
947 | appendChars(newFileString, tmp, newFileStrOffset+1);
948 | refreshDisplay(UPDATE);
949 | rightArrow(enteredChar);
950 | } else if(enteredChar == 127) {
951 | if(newFileStrOffset - 1 > -2) {
952 | if(newFileString[newFileStrOffset] == 10) {
953 | if(editingCursorPositionX <= 1) {
954 | if(editingCursorPositionY <= 1) {
955 | removeChar(newFileString, newFileStrOffset);
956 | leftArrow(-1);
957 | --editingCursorPositionX;
958 | } else {
959 | removeChar(newFileString, newFileStrOffset);
960 | leftArrow(-1);
961 | ++newFileStrOffset;
962 | }
963 | }
964 | } else if(newFileString[newFileStrOffset] == 9) {
965 | editingCursorPositionX -= 4;
966 | removeChar(newFileString, newFileStrOffset);
967 | --newFileStrOffset;
968 | } else {
969 | if(editingCursorPositionX <= 1) {
970 | if(editingCursorPositionY <= 1) {
971 | int i = 0;
972 | while(newFileString[newFileStrOffset - i] != 10 && newFileStrOffset - i > -2 && i -2 && i