diff --git a/programs/other/tte/tte.c b/programs/other/tte/tte.c index d67f7b7cd..1f6c9f7bb 100644 --- a/programs/other/tte/tte.c +++ b/programs/other/tte/tte.c @@ -14,6 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +/* Kolibri port by Siemargl 2018 + * my fixes mostly commented with triple comment /// + * */ /*** Include section ***/ @@ -41,6 +44,9 @@ #include ///#include #include + + + /*** Define section ***/ // This mimics the Ctrl + whatever behavior, setting the @@ -65,7 +71,8 @@ // Kolibri defaults int con_def_wnd_width = 80; int con_def_wnd_height = 25; - +/// winFile support +int fileIsOd0a; typedef struct editor_row { int idx; // Row own index within the file. @@ -399,6 +406,7 @@ void die(const char* s) { // a descriptive error mesage for it. perror(s); printf("\r\n"); + con_exit(0); /// KOS console exit(1); } @@ -449,82 +457,12 @@ void enableRawMode() { } -/* -int editorReadKey() { - int nread; - char c; - while ((nread = read(STDIN_FILENO, &c, 1)) != 1) { - // Ignoring EAGAIN to make it work on Cygwin. - if (nread == -1 && errno != EAGAIN) - die("Error reading input"); - } - // Check escape sequences, if first byte - // is an escape character then... - if (c == '\x1b') { - char seq[3]; - - if (read(STDIN_FILENO, &seq[0], 1) != 1 || - read(STDIN_FILENO, &seq[1], 1) != 1) - return '\x1b'; - - if (seq[0] == '[') { - if (seq[1] >= '0' && seq[1] <= '9') { - if (read(STDIN_FILENO, &seq[2], 1) != 1) - return '\x1b'; - if (seq[2] == '~') { - switch (seq[1]) { - // Home and End keys may be sent in many ways depending on the OS - // \x1b[1~, \x1b[7~, \x1b[4~, \x1b[8~ - case '1': - case '7': - return HOME_KEY; - case '4': - case '8': - return END_KEY; - // Del key is sent as \x1b[3~ - case '3': - return DEL_KEY; - // Page Up and Page Down send '\x1b', '[', '5' or '6' and '~'. - case '5': return PAGE_UP; - case '6': return PAGE_DOWN; - } - } - } else { - switch (seq[1]) { - // Arrow keys send multiple bytes starting with '\x1b', '['' - // and followed by an 'A', 'B', 'C' or 'D' depending on which - // arrow is pressed. - case 'A': return ARROW_UP; - case 'B': return ARROW_DOWN; - case 'C': return ARROW_RIGHT; - case 'D': return ARROW_LEFT; - // Home key can also be sent as \x1b[H - case 'H': return HOME_KEY; - // End key can also be sent as \x1b[F - case 'F': return END_KEY; - } - } - } else if (seq[0] == 'O') { - switch (seq[1]) { - // Yes, Home key can ALSO be sent as \x1bOH - case 'H': return HOME_KEY; - // And... End key as \x1bOF - case 'F': return END_KEY; - } - } - return '\x1b'; - } else { - return c; - } -} -*/ /// by Siemargl rewritten, still Ctrl+ combination works only in english locale, so need analyze scancode int editorReadKey() { - int nread; int key = con_getch2(); if (key == 0) - die("Window closed by X-button"); + die("Window closed by moused X-button"); if (0 != (key & 0xff)) { key &= 0xff; @@ -551,6 +489,7 @@ int editorReadKey() { return CTRL_KEY('l'); case 17: // Ctrl+Q + case 26: // Ctrl+Z return CTRL_KEY('q'); case 19: // Ctrl+S @@ -1154,7 +1093,8 @@ char* editorRowsToString(int* buf_len) { // to each one for the newline character we'll add to // the end of each line. for (j = 0; j < ec.num_rows; j++) { - total_len += ec.row[j].size + 1; + total_len += ec.row[j].size + 1 + + (fileIsOd0a ? 1:0); /// winFile suppor } *buf_len = total_len; @@ -1166,6 +1106,8 @@ char* editorRowsToString(int* buf_len) { for (j = 0; j < ec.num_rows; j++) { memcpy(p, ec.row[j].chars, ec.row[j].size); p += ec.row[j].size; + /// winFile support + if (fileIsOd0a) *p++ = '\r'; *p = '\n'; p++; } @@ -1190,12 +1132,20 @@ void editorOpen(char* file_name) { size_t line_cap = 0; // Bigger than int int line_len; ///was ssize_t + fileIsOd0a = 0; /// winFile support + while ((line_len = getline(&line, &line_cap, file)) != -1) { // We already know each row represents one line of text, there's no need // to keep carriage return and newline characters. if (line_len > 0 && (line[line_len - 1] == '\n' || line[line_len - 1] == '\r')) line_len--; - editorInsertRow(ec.num_rows, line, line_len); +/// Siemargl fix 0d0a windows file, save format flag + if (line_len > 0 && line[line_len - 1] == '\r') + { + line_len--; + fileIsOd0a = 1; + } + editorInsertRow(ec.num_rows, line, line_len); } free(line); fclose(file); @@ -1214,30 +1164,12 @@ void editorSave() { int len; char* buf = editorRowsToString(&len); -/// -/* - // We want to create if it doesn't already exist (O_CREAT flag), giving - // 0644 permissions (the standard ones). O_RDWR stands for reading and - // writing. - int fd = open(ec.file_name, O_RDWR | O_CREAT, 0644); - if (fd != -1) { - // ftruncate sets the file's size to the specified length. - if (ftruncate(fd, len) != -1) { - // Writing the file. - if (write(fd, buf, len) == len) { - close(fd); - free(buf); - ec.dirty = 0; - editorSetStatusMessage("%d bytes written to disk", len); - return; - } - } - close(fd); - } -*/ + +/// siemargl rewrite using standard FILE stream FILE *fd = fopen(ec.file_name,"w+b"); + int rc = -1; if (fd) { - if (fwrite(buf, 1, len, fd) == len) { + if ((rc = fwrite(buf, 1, len, fd)) == len) { fclose(fd); free(buf); ec.dirty = 0; @@ -1422,7 +1354,7 @@ void editorDrawStatusBar(struct a_buf* ab) { void editorDrawMessageBar(struct a_buf *ab) { // Clearing the message bar. - abufAppend(ab, "\x1b[K", 3); +/// abufAppend(ab, "\x1b[K", 3); /// not work in Kolibri int msg_len = strlen(ec.status_msg); if (msg_len > ec.screen_cols) msg_len = ec.screen_cols; @@ -1509,7 +1441,7 @@ void editorDrawRows(struct a_buf* ab) { } } else if (highlight[j] == HL_NORMAL) { if (current_color != -1) { - abufAppend(ab, "\x1b[39m", 5); + abufAppend(ab, "\x1b[m", 3); /// was [39, 5 current_color = -1; } abufAppend(ab, &c[j], 1); @@ -1527,11 +1459,11 @@ void editorDrawRows(struct a_buf* ab) { abufAppend(ab, &c[j], 1); } } - abufAppend(ab, "\x1b[39m", 5); + abufAppend(ab, "\x1b[m", 3); /// was [39, 5 } // Redrawing each line instead of the whole screen. - abufAppend(ab, "\x1b[K", 3); +/// abufAppend(ab, "\x1b[K", 3); /// not work in Kolibri // Addind a new line abufAppend(ab, "\r\n", 2); } @@ -1545,20 +1477,25 @@ void editorRefreshScreen() { // Hiding the cursor while the screen is refreshing. // See http://vt100.net/docs/vt100-ug/chapter3.html#S3.3.4 // for more info. - abufAppend(&ab, "\x1b[?25l", 6); +/// abufAppend(&ab, "\x1b[?25l", 6); abufAppend(&ab, "\x1b[H", 3); +/// full clear because "\x1b[K" not work in Kolibri + abufAppend(&ab, "\x1b[2J", 4); + editorDrawRows(&ab); editorDrawStatusBar(&ab); editorDrawMessageBar(&ab); // Moving the cursor where it should be. char buf[32]; - snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (ec.cursor_y - ec.row_offset) + 1, (ec.render_x - ec.col_offset) + 1); - abufAppend(&ab, buf, strlen(buf)); +/// snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (ec.cursor_y - ec.row_offset) + 1, (ec.render_x - ec.col_offset) + 1); +/// a bit different in Kolibri + snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (ec.render_x - ec.col_offset), (ec.cursor_y - ec.row_offset)); + abufAppend(&ab, buf, strlen(buf)); // Showing again the cursor. - abufAppend(&ab, "\x1b[?25h", 6); +/// abufAppend(&ab, "\x1b[?25h", 6); // Writing all content at once /// write(STDOUT_FILENO, ab.buf, ab.len); @@ -1677,12 +1614,13 @@ void editorProcessKeypress() { break; case CTRL_KEY('q'): if (ec.dirty && quit_times > 0) { - editorSetStatusMessage("Warning! File has unsaved changes. Press Ctrl-Q %d more time%s to quit", quit_times, quit_times > 1 ? "s" : ""); + editorSetStatusMessage("Warning! File has unsaved changes. Press Ctrl-Q or ^Z %d more time%s to quit", quit_times, quit_times > 1 ? "s" : ""); quit_times--; return; } editorClearScreen(); consoleBufferClose(); + con_exit(1); /// KOS console exit(0); break; case CTRL_KEY('s'): @@ -1788,7 +1726,7 @@ void printHelp() { printf("Usage: tte [OPTIONS] [FILE]\n\n"); printf("\nKEYBINDINGS\n-----------\n\n"); printf("Keybinding\t\tAction\n\n"); - printf("Ctrl-Q \t\tExit\n"); + printf("Ctrl-Q,^Z \t\tExit\n"); printf("Ctrl-S \t\tSave\n"); printf("Ctrl-F \t\tSearch. Esc, enter and arrows to interact once searching\n"); printf("Ctrl-E \t\tFlip line upwards\n"); @@ -1835,13 +1773,13 @@ int main(int argc, char* argv[]) { return 0; enableRawMode(); - editorSetStatusMessage(" Ctrl-Q to quit | Ctrl-S to save | (tte -h | --help for more info)"); + editorSetStatusMessage(" Ctrl-Q, ^Z to quit | Ctrl-S to save | (tte -h | --help for more info)"); while (1) { editorRefreshScreen(); editorProcessKeypress(); } - con_exit(0); + con_exit(1); return 0; }