basic Utf-8 support
This commit is contained in:
parent
de64d25e25
commit
83e3b71cd4
44
ste.c
44
ste.c
@ -2,11 +2,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
/* defines */
|
/* defines */
|
||||||
#define CTRL(k) ((k) & 0x1f) // Control mask modifier
|
#define CTRL(k) ((k) & 0x1f) // Control mask modifier
|
||||||
#define TABSIZE 4 // Tab size as used in render
|
#define TABSIZE 4 // Tab size as used in render
|
||||||
#define STAT_SIZE 128
|
#define STAT_SIZE 128
|
||||||
|
#define _XOPEN_SOURCE_EXTENDED
|
||||||
|
|
||||||
/* main data structure containing:
|
/* main data structure containing:
|
||||||
* -cursor position
|
* -cursor position
|
||||||
@ -90,6 +92,9 @@ static void handleDel (int select);
|
|||||||
/* testing */
|
/* testing */
|
||||||
static void updateInfo (void);
|
static void updateInfo (void);
|
||||||
static int whatsThat (void);
|
static int whatsThat (void);
|
||||||
|
static inline int isUtf (int c);
|
||||||
|
static inline int isCont (int c);
|
||||||
|
static inline int isStart (int c);
|
||||||
|
|
||||||
/* --------------------------------- main ------------------------------------ */
|
/* --------------------------------- main ------------------------------------ */
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
@ -166,6 +171,9 @@ int main (int argc, char *argv[])
|
|||||||
|
|
||||||
void termInit (void)
|
void termInit (void)
|
||||||
{
|
{
|
||||||
|
/* Init locales */
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
|
||||||
/* Init the screen and refresh */
|
/* Init the screen and refresh */
|
||||||
initscr();
|
initscr();
|
||||||
refresh();
|
refresh();
|
||||||
@ -263,7 +271,7 @@ void drawLines (void)
|
|||||||
/* Draw the line matcing render memory */
|
/* Draw the line matcing render memory */
|
||||||
if (&rows.rw[ln] == NULL) termDie("drawlines NULL");
|
if (&rows.rw[ln] == NULL) termDie("drawlines NULL");
|
||||||
if (rows.rw[ln].r_size > t.cur.off_x) {
|
if (rows.rw[ln].r_size > t.cur.off_x) {
|
||||||
addnstr(&rows.rw[ln].render[t.cur.off_x], t.dim.x + 1);
|
addnstr(&rows.rw[ln].render[t.cur.off_x], t.dim.x + 1); // good for utf-8
|
||||||
}
|
}
|
||||||
|
|
||||||
lnMove(i + 1, 0);
|
lnMove(i + 1, 0);
|
||||||
@ -558,7 +566,11 @@ void cursorMove (int a)
|
|||||||
t.cur.y--;
|
t.cur.y--;
|
||||||
t.cur.x = rows.rw[t.cur.y].size;
|
t.cur.x = rows.rw[t.cur.y].size;
|
||||||
}
|
}
|
||||||
} else
|
} else if (isCont(rows.rw[t.cur.y].chars[t.cur.x - 1])) {
|
||||||
|
do {
|
||||||
|
t.cur.x--;
|
||||||
|
} while(!isStart(rows.rw[t.cur.y].chars[t.cur.x]));
|
||||||
|
} else
|
||||||
t.cur.x--;
|
t.cur.x--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -568,6 +580,10 @@ void cursorMove (int a)
|
|||||||
t.cur.y++;
|
t.cur.y++;
|
||||||
t.cur.x = 0;
|
t.cur.x = 0;
|
||||||
}
|
}
|
||||||
|
} else if (isStart(rows.rw[t.cur.y].chars[t.cur.x])) {
|
||||||
|
do {
|
||||||
|
t.cur.x++;
|
||||||
|
} while(isCont(rows.rw[t.cur.y].chars[t.cur.x]));
|
||||||
} else
|
} else
|
||||||
t.cur.x++;
|
t.cur.x++;
|
||||||
break;
|
break;
|
||||||
@ -607,9 +623,16 @@ void curUpdateRender ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// x
|
// x
|
||||||
static int i;
|
static int i, c;
|
||||||
for (i = 0, t.cur.r_x = 0; i < t.cur.x; i++) {
|
for (c = i = 0, t.cur.r_x = 0; i < t.cur.x; i++) {
|
||||||
if (rows.rw[t.cur.y].chars[i] == '\t') t.cur.r_x += (TABSIZE - 1) - (t.cur.r_x % TABSIZE);
|
c = rows.rw[t.cur.y].chars[i];
|
||||||
|
|
||||||
|
/* continue (skip increment) if you encounter a continuation char */
|
||||||
|
if (isCont(c)) continue;
|
||||||
|
else if (isStart(c)) t.cur.r_x++;
|
||||||
|
|
||||||
|
if (c == '\t') t.cur.r_x += (TABSIZE - 1) - (t.cur.r_x % TABSIZE);
|
||||||
|
|
||||||
t.cur.r_x++;
|
t.cur.r_x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -678,4 +701,15 @@ void updateInfo (void)
|
|||||||
t.dim.x -= t.pad + 1;
|
t.dim.x -= t.pad + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isUtf (int c) {
|
||||||
|
return (c >= 0x80 || c < 0 ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int isCont (int c) {
|
||||||
|
return ((c &= 0xC0) == 0x80 ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int isStart (int c) {
|
||||||
|
return (isUtf(c) && !isCont(c) ? 1 : 0);
|
||||||
|
}
|
||||||
/*--------------------------------- testing ------------------------------------*/
|
/*--------------------------------- testing ------------------------------------*/
|
||||||
|
383
ste.sublime-workspace
Normal file
383
ste.sublime-workspace
Normal file
@ -0,0 +1,383 @@
|
|||||||
|
{
|
||||||
|
"auto_complete":
|
||||||
|
{
|
||||||
|
"selected_items":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"ca",
|
||||||
|
"cambiaCapienza"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"in",
|
||||||
|
"inserisci"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"co",
|
||||||
|
"contenitore"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"off",
|
||||||
|
"off_x"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"con",
|
||||||
|
"contenitore"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"update",
|
||||||
|
"updateOffset"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"rowDel",
|
||||||
|
"rowDeleteRow"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"rowAdd",
|
||||||
|
"rowAddString"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"rowadd",
|
||||||
|
"rowAddRow"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"row",
|
||||||
|
"rowCpy"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"ge",
|
||||||
|
"getLineNumberSize"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"cur",
|
||||||
|
"cur_y"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"mem",
|
||||||
|
"memcpy"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buffers":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"build_system": "Packages/C++/C++ Single File.sublime-build",
|
||||||
|
"build_system_choices":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"build_varint": "",
|
||||||
|
"command_palette":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"last_filter": "",
|
||||||
|
"selected_items":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"vme",
|
||||||
|
"View: Toggle Menu"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"vmen",
|
||||||
|
"View: Toggle Menu"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"build",
|
||||||
|
"Build: New Build System"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"vm",
|
||||||
|
"View: Toggle Menu"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"insta",
|
||||||
|
"Package Control: Install Package"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"mark",
|
||||||
|
"Set Syntax: Markdown"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"wor",
|
||||||
|
"Word Wrap: Toggle"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"wra",
|
||||||
|
"Word Wrap: Toggle"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"side",
|
||||||
|
"View: Toggle Side Bar"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"git comi",
|
||||||
|
"Git: Commit"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"git add",
|
||||||
|
"Git: Add All"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"install",
|
||||||
|
"Package Control: Install Package"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"inst\t",
|
||||||
|
"Package Control: Install Package"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"color",
|
||||||
|
"UI: Select Color Scheme"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"theme",
|
||||||
|
"UI: Select Theme"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"install\t",
|
||||||
|
"Package Control: Install Package"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"close",
|
||||||
|
"File: Close All"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"menu",
|
||||||
|
"View: Toggle Menu"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"open",
|
||||||
|
"View: Toggle Open Files in Side Bar"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"width": 0.0
|
||||||
|
},
|
||||||
|
"console":
|
||||||
|
{
|
||||||
|
"height": 151.0,
|
||||||
|
"history":
|
||||||
|
[
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"distraction_free":
|
||||||
|
{
|
||||||
|
"menu_visible": true,
|
||||||
|
"show_minimap": false,
|
||||||
|
"show_open_files": false,
|
||||||
|
"show_tabs": false,
|
||||||
|
"side_bar_visible": false,
|
||||||
|
"status_bar_visible": false
|
||||||
|
},
|
||||||
|
"file_history":
|
||||||
|
[
|
||||||
|
"/home/ale/Documents/programmi/base/3h1/main.cpp",
|
||||||
|
"/home/ale/Documents/gits/projects/ste/README.md",
|
||||||
|
"/home/ale/Documents/gits/projects/ste/Makefile",
|
||||||
|
"/home/ale/Documents/gits/projects/ste/ste.c",
|
||||||
|
"/home/ale/.config/sublime-text-3/Packages/User/plain-g++.sublime-build",
|
||||||
|
"/home/ale/Documents/gits/projects/ste/row.c",
|
||||||
|
"/home/ale/.config/sublime-merge/Packages/User/Preferences.sublime-settings",
|
||||||
|
"/home/ale/pp",
|
||||||
|
"/home/ale/Documents/gits/projects/Lists/void-install.txt",
|
||||||
|
"/home/ale/Documents/gits/projects/ste/hello",
|
||||||
|
"/home/ale/.config/sublime-text-3/Packages/Default/Default (Linux).sublime-keymap",
|
||||||
|
"/home/ale/.config/sublime-text-3/Packages/User/Default (Linux).sublime-keymap",
|
||||||
|
"/home/ale/plan9.txt"
|
||||||
|
],
|
||||||
|
"find":
|
||||||
|
{
|
||||||
|
"height": 26.0
|
||||||
|
},
|
||||||
|
"find_in_files":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"where_history":
|
||||||
|
[
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"find_state":
|
||||||
|
{
|
||||||
|
"case_sensitive": false,
|
||||||
|
"find_history":
|
||||||
|
[
|
||||||
|
"fileopen",
|
||||||
|
"realloc",
|
||||||
|
"//",
|
||||||
|
"t.cur.off_y",
|
||||||
|
"t.cur.yy",
|
||||||
|
"unsigned ",
|
||||||
|
"t.cur.off_y",
|
||||||
|
"t.cur.yy",
|
||||||
|
"init",
|
||||||
|
"t.cur.yy",
|
||||||
|
"t.cur.off_y",
|
||||||
|
"t.cur.yy",
|
||||||
|
"rowAddrow",
|
||||||
|
"off_x",
|
||||||
|
"t.cur.xx",
|
||||||
|
"xx",
|
||||||
|
"off_x",
|
||||||
|
"drawlines",
|
||||||
|
"drawline",
|
||||||
|
"currea",
|
||||||
|
"t.dim.x",
|
||||||
|
"t.cur.yy",
|
||||||
|
"t.cur.xx",
|
||||||
|
"row ope",
|
||||||
|
"rowdeletechar",
|
||||||
|
"rowaddchar",
|
||||||
|
"t.cur.xx",
|
||||||
|
"rowaddcha",
|
||||||
|
"rowaddstri",
|
||||||
|
"statusbar",
|
||||||
|
"updateinfo",
|
||||||
|
"terminit",
|
||||||
|
"rowinit",
|
||||||
|
"termInit",
|
||||||
|
"realloc",
|
||||||
|
"malloc",
|
||||||
|
"delta",
|
||||||
|
"rownum",
|
||||||
|
"t.cur.off_y",
|
||||||
|
"drawlines",
|
||||||
|
"NULL",
|
||||||
|
"rowaddlast",
|
||||||
|
"realloc",
|
||||||
|
"addstr",
|
||||||
|
"mvaddstr",
|
||||||
|
"waddstr",
|
||||||
|
"drawlines",
|
||||||
|
"realloc",
|
||||||
|
"decimalS",
|
||||||
|
"getLineNu",
|
||||||
|
"drawba",
|
||||||
|
"t.cur.x + t.cur.off_x",
|
||||||
|
"cur_x",
|
||||||
|
"t.cur.x + t.cur.off_x",
|
||||||
|
"t.cur.yy",
|
||||||
|
"t.cur.y + t.cur.off_y",
|
||||||
|
"r_x",
|
||||||
|
"filesave",
|
||||||
|
"bufferF",
|
||||||
|
"malloc",
|
||||||
|
"rowAddLast",
|
||||||
|
"pos",
|
||||||
|
"rowAdd",
|
||||||
|
"t.dim.y -= 1",
|
||||||
|
"updateInfo",
|
||||||
|
"getyx",
|
||||||
|
"rowadd",
|
||||||
|
"realloc",
|
||||||
|
"reallo",
|
||||||
|
"rownum",
|
||||||
|
"drawba",
|
||||||
|
"realloc"
|
||||||
|
],
|
||||||
|
"highlight": true,
|
||||||
|
"in_selection": false,
|
||||||
|
"preserve_case": false,
|
||||||
|
"regex": false,
|
||||||
|
"replace_history":
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"t.cur.y",
|
||||||
|
"pos",
|
||||||
|
"t.cur.xx",
|
||||||
|
"t.cur.yy",
|
||||||
|
"rows.rownum"
|
||||||
|
],
|
||||||
|
"reverse": false,
|
||||||
|
"show_context": true,
|
||||||
|
"use_buffer2": true,
|
||||||
|
"whole_word": false,
|
||||||
|
"wrap": true
|
||||||
|
},
|
||||||
|
"groups":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"sheets":
|
||||||
|
[
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"incremental_find":
|
||||||
|
{
|
||||||
|
"height": 26.0
|
||||||
|
},
|
||||||
|
"input":
|
||||||
|
{
|
||||||
|
"height": 0.0
|
||||||
|
},
|
||||||
|
"layout":
|
||||||
|
{
|
||||||
|
"cells":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"cols":
|
||||||
|
[
|
||||||
|
0.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"rows":
|
||||||
|
[
|
||||||
|
0.0,
|
||||||
|
1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"menu_visible": true,
|
||||||
|
"output.find_results":
|
||||||
|
{
|
||||||
|
"height": 0.0
|
||||||
|
},
|
||||||
|
"pinned_build_system": "Packages/Makefile/Make.sublime-build",
|
||||||
|
"project": "ste.sublime-project",
|
||||||
|
"replace":
|
||||||
|
{
|
||||||
|
"height": 48.0
|
||||||
|
},
|
||||||
|
"save_all_on_build": true,
|
||||||
|
"select_file":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"last_filter": "",
|
||||||
|
"selected_items":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"width": 0.0
|
||||||
|
},
|
||||||
|
"select_project":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"last_filter": "",
|
||||||
|
"selected_items":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"width": 0.0
|
||||||
|
},
|
||||||
|
"select_symbol":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"last_filter": "",
|
||||||
|
"selected_items":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"width": 0.0
|
||||||
|
},
|
||||||
|
"selected_group": 0,
|
||||||
|
"settings":
|
||||||
|
{
|
||||||
|
},
|
||||||
|
"show_minimap": true,
|
||||||
|
"show_open_files": true,
|
||||||
|
"show_tabs": true,
|
||||||
|
"side_bar_visible": true,
|
||||||
|
"side_bar_width": 110.0,
|
||||||
|
"status_bar_visible": true,
|
||||||
|
"template_settings":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user