ited: handle Unicode beyond the BMP correctly in list mode. - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 95220bf88775deab4a037264d08b21bacc612d70 /src/plan9port/commit/95220bf88775deab4a037264d08b21bacc612d70.gph mx1.adamsgaard.dk 70 1parent 3850e6e177677885074c8896ef24534894726ad5 /src/plan9port/commit/3850e6e177677885074c8896ef24534894726ad5.gph mx1.adamsgaard.dk 70 hAuthor: sean URL:mailto:phonologus@gmail.com mx1.adamsgaard.dk 70 iDate: Thu, 21 May 2020 16:10:30 +0100 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ied: handle Unicode beyond the BMP correctly in list mode. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iList mode was constrained to the BMP. This change introduces Err mx1.adamsgaard.dk 70 itthe following new list mode convention, using Go string literal syntax: Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iNon-printing ASCII characters display as \xhh. Err mx1.adamsgaard.dk 70 iNon-ASCII characters in the BMP display as \uhhhh. Err mx1.adamsgaard.dk 70 iCharacters beyond the BMP display as \Uhhhhhhhh. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M man/man1/ed.1 | 12 ++++++++++-- Err mx1.adamsgaard.dk 70 i M src/cmd/ed.c | 41 ++++++++++++++++++++++++------- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i2 files changed, 42 insertions(+), 11 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/man/man1/ed.1 b/man/man1/ed.1 /src/plan9port/file/man/man1/ed.1.gph mx1.adamsgaard.dk 70 it@@ -441,10 +441,18 @@ a backspace as Err mx1.adamsgaard.dk 70 i .LR \eb , Err mx1.adamsgaard.dk 70 i backslashes as Err mx1.adamsgaard.dk 70 i .LR \e\e , Err mx1.adamsgaard.dk 70 i-and non-printing characters as Err mx1.adamsgaard.dk 70 i+and non-printing ASCII characters as Err mx1.adamsgaard.dk 70 i a backslash, an Err mx1.adamsgaard.dk 70 i .LR x , Err mx1.adamsgaard.dk 70 i-and four hexadecimal digits. Err mx1.adamsgaard.dk 70 i+and two hexadecimal digits. Err mx1.adamsgaard.dk 70 i+non-ASCII characters in the Basic Multilingual Plane Err mx1.adamsgaard.dk 70 i+are printed as a backslash, a small Err mx1.adamsgaard.dk 70 i+.LR u , Err mx1.adamsgaard.dk 70 i+and four hexadecimal digits; and characters above the Err mx1.adamsgaard.dk 70 i+Basic Multilingual Plane are printed as a backslash, Err mx1.adamsgaard.dk 70 i+a big Err mx1.adamsgaard.dk 70 i+.LR U , Err mx1.adamsgaard.dk 70 i+and six hexadecimal digits. Err mx1.adamsgaard.dk 70 i Long lines are folded, Err mx1.adamsgaard.dk 70 i with the second and subsequent sub-lines indented one tab stop. Err mx1.adamsgaard.dk 70 i If the last character in the line is a blank, Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/ed.c b/src/cmd/ed.c /src/plan9port/file/src/cmd/ed.c.gph mx1.adamsgaard.dk 70 it@@ -21,6 +21,12 @@ enum Err mx1.adamsgaard.dk 70 i EOF = -1 Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+enum Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ LINELEN = 70, /* max number of glyphs in a display line */ Err mx1.adamsgaard.dk 70 i+ BELL = 6 /* A char could require up to BELL glyphs to display */ Err mx1.adamsgaard.dk 70 i+}; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void (*oldhup)(int); Err mx1.adamsgaard.dk 70 i void (*oldquit)(int); Err mx1.adamsgaard.dk 70 i int* addr1; Err mx1.adamsgaard.dk 70 it@@ -40,7 +46,7 @@ int ichanged; Err mx1.adamsgaard.dk 70 i int io; Err mx1.adamsgaard.dk 70 i Biobuf iobuf; Err mx1.adamsgaard.dk 70 i int lastc; Err mx1.adamsgaard.dk 70 i-char line[70]; Err mx1.adamsgaard.dk 70 i+char line[LINELEN]; Err mx1.adamsgaard.dk 70 i Rune* linebp; Err mx1.adamsgaard.dk 70 i Rune linebuf[LBSIZE]; Err mx1.adamsgaard.dk 70 i int listf; Err mx1.adamsgaard.dk 70 it@@ -1543,7 +1549,7 @@ putchr(int ac) Err mx1.adamsgaard.dk 70 i *lp++ = 'n'; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } else { Err mx1.adamsgaard.dk 70 i- if(col > (72-6-2)) { Err mx1.adamsgaard.dk 70 i+ if(col > (LINELEN-BELL)) { Err mx1.adamsgaard.dk 70 i col = 8; Err mx1.adamsgaard.dk 70 i *lp++ = '\\'; Err mx1.adamsgaard.dk 70 i *lp++ = '\n'; Err mx1.adamsgaard.dk 70 it@@ -1558,15 +1564,32 @@ putchr(int ac) Err mx1.adamsgaard.dk 70 i if(c == '\t') Err mx1.adamsgaard.dk 70 i c = 't'; Err mx1.adamsgaard.dk 70 i col++; Err mx1.adamsgaard.dk 70 i- } else Err mx1.adamsgaard.dk 70 i- if(c<' ' || c>='\177') { Err mx1.adamsgaard.dk 70 i+ } else if (c<' ' || c=='\177') { Err mx1.adamsgaard.dk 70 i *lp++ = '\\'; Err mx1.adamsgaard.dk 70 i *lp++ = 'x'; Err mx1.adamsgaard.dk 70 i- *lp++ = hex[c>>12]; Err mx1.adamsgaard.dk 70 i- *lp++ = hex[c>>8&0xF]; Err mx1.adamsgaard.dk 70 i- *lp++ = hex[c>>4&0xF]; Err mx1.adamsgaard.dk 70 i- c = hex[c&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>4)&0xF]; Err mx1.adamsgaard.dk 70 i+ c = hex[c&0xF]; Err mx1.adamsgaard.dk 70 i+ col += 3; Err mx1.adamsgaard.dk 70 i+ } else if (c>'\177' && c<=0xFFFF) { Err mx1.adamsgaard.dk 70 i+ *lp++ = '\\'; Err mx1.adamsgaard.dk 70 i+ *lp++ = 'u'; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>12)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>8)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>4)&0xF]; Err mx1.adamsgaard.dk 70 i+ c = hex[c&0xF]; Err mx1.adamsgaard.dk 70 i col += 5; Err mx1.adamsgaard.dk 70 i+ } else if (c>0xFFFF) { Err mx1.adamsgaard.dk 70 i+ *lp++ = '\\'; Err mx1.adamsgaard.dk 70 i+ *lp++ = 'U'; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>28)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>24)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>20)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>16)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>12)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>8)&0xF]; Err mx1.adamsgaard.dk 70 i+ *lp++ = hex[(c>>4)&0xF]; Err mx1.adamsgaard.dk 70 i+ c = hex[c&0xF]; Err mx1.adamsgaard.dk 70 i+ col += 9; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -1574,7 +1597,7 @@ putchr(int ac) Err mx1.adamsgaard.dk 70 i rune = c; Err mx1.adamsgaard.dk 70 i lp += runetochar(lp, &rune); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- if(c == '\n' || lp >= &line[sizeof(line)-5]) { Err mx1.adamsgaard.dk 70 i+ if(c == '\n' || lp >= &line[LINELEN-BELL]) { Err mx1.adamsgaard.dk 70 i linp = line; Err mx1.adamsgaard.dk 70 i write(oflag? 2: 1, line, lp-line); Err mx1.adamsgaard.dk 70 i return; Err mx1.adamsgaard.dk 70 .