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 <string.h>
|
||||
#include <ctype.h>
|
||||
#include <locale.h>
|
||||
|
||||
/* defines */
|
||||
#define CTRL(k) ((k) & 0x1f) // Control mask modifier
|
||||
#define TABSIZE 4 // Tab size as used in render
|
||||
#define STAT_SIZE 128
|
||||
#define _XOPEN_SOURCE_EXTENDED
|
||||
|
||||
/* main data structure containing:
|
||||
* -cursor position
|
||||
@ -90,6 +92,9 @@ static void handleDel (int select);
|
||||
/* testing */
|
||||
static void updateInfo (void);
|
||||
static int whatsThat (void);
|
||||
static inline int isUtf (int c);
|
||||
static inline int isCont (int c);
|
||||
static inline int isStart (int c);
|
||||
|
||||
/* --------------------------------- main ------------------------------------ */
|
||||
int main (int argc, char *argv[])
|
||||
@ -166,6 +171,9 @@ int main (int argc, char *argv[])
|
||||
|
||||
void termInit (void)
|
||||
{
|
||||
/* Init locales */
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
/* Init the screen and refresh */
|
||||
initscr();
|
||||
refresh();
|
||||
@ -263,7 +271,7 @@ void drawLines (void)
|
||||
/* Draw the line matcing render memory */
|
||||
if (&rows.rw[ln] == NULL) termDie("drawlines NULL");
|
||||
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);
|
||||
@ -558,7 +566,11 @@ void cursorMove (int a)
|
||||
t.cur.y--;
|
||||
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--;
|
||||
break;
|
||||
|
||||
@ -568,6 +580,10 @@ void cursorMove (int a)
|
||||
t.cur.y++;
|
||||
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
|
||||
t.cur.x++;
|
||||
break;
|
||||
@ -607,9 +623,16 @@ void curUpdateRender ()
|
||||
}
|
||||
|
||||
// x
|
||||
static int i;
|
||||
for (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);
|
||||
static int i, c;
|
||||
for (c = i = 0, t.cur.r_x = 0; i < t.cur.x; i++) {
|
||||
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++;
|
||||
}
|
||||
|
||||
@ -678,4 +701,15 @@ void updateInfo (void)
|
||||
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 ------------------------------------*/
|
||||
|
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