diff options
author | Petter Rodhelind <petter.rodhelind@gmail.com> | 2020-06-18 23:57:51 +0200 |
---|---|---|
committer | Petter Rodhelind <petter.rodhelind@gmail.com> | 2020-06-18 23:57:51 +0200 |
commit | 7cda34cf34f3afbd3f2000aa5e2b59ddc319f0f2 (patch) | |
tree | ff18b856a35c80a9cc40573c76899d8a468bedc5 /src/cmd | |
parent | ea23656f7c3afcfd8516b00c0db09879ae80a09f (diff) | |
parent | 329831171dd6ef81c113f101093c7b4947381003 (diff) | |
download | plan9port-7cda34cf34f3afbd3f2000aa5e2b59ddc319f0f2.tar.gz plan9port-7cda34cf34f3afbd3f2000aa5e2b59ddc319f0f2.tar.bz2 plan9port-7cda34cf34f3afbd3f2000aa5e2b59ddc319f0f2.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/cmd')
-rw-r--r-- | src/cmd/9term/AIX.c | 2 | ||||
-rw-r--r-- | src/cmd/9term/bsdpty.c | 2 | ||||
-rw-r--r-- | src/cmd/acme/regx.c | 3 | ||||
-rw-r--r-- | src/cmd/auxstats/AIX.c | 9 | ||||
-rw-r--r-- | src/cmd/devdraw/devdraw.c | 30 | ||||
-rw-r--r-- | src/cmd/devdraw/devdraw.h | 28 | ||||
-rw-r--r-- | src/cmd/devdraw/latin1.c | 39 | ||||
-rw-r--r-- | src/cmd/devdraw/mac-screen.m | 43 | ||||
-rw-r--r-- | src/cmd/devdraw/mklatinkbd.c | 2 | ||||
-rw-r--r-- | src/cmd/devdraw/srv.c | 35 | ||||
-rw-r--r-- | src/cmd/devdraw/x11-screen.c | 21 | ||||
-rw-r--r-- | src/cmd/diff/diffreg.c | 3 | ||||
-rw-r--r-- | src/cmd/draw/mc.c | 3 | ||||
-rw-r--r-- | src/cmd/ed.c | 41 | ||||
-rw-r--r-- | src/cmd/fontsrv/a.h | 9 | ||||
-rw-r--r-- | src/cmd/fontsrv/mac.c | 6 | ||||
-rw-r--r-- | src/cmd/fontsrv/main.c | 53 | ||||
-rw-r--r-- | src/cmd/fontsrv/x11.c | 22 | ||||
-rw-r--r-- | src/cmd/mk/archive.c | 4 | ||||
-rw-r--r-- | src/cmd/mk/env.c | 3 | ||||
-rw-r--r-- | src/cmd/mkfile | 2 | ||||
-rw-r--r-- | src/cmd/rc/rc.h | 6 | ||||
-rw-r--r-- | src/cmd/vbackup/mount-AIX.c | 1 |
23 files changed, 254 insertions, 113 deletions
diff --git a/src/cmd/9term/AIX.c b/src/cmd/9term/AIX.c new file mode 100644 index 00000000..b7ccbf0f --- /dev/null +++ b/src/cmd/9term/AIX.c @@ -0,0 +1,2 @@ +#define TIOCSCTTY 0x540E +#include "bsdpty.c" diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c index d64e4c2f..3710a18d 100644 --- a/src/cmd/9term/bsdpty.c +++ b/src/cmd/9term/bsdpty.c @@ -5,7 +5,9 @@ #include <errno.h> #include <grp.h> #include <termios.h> +#ifdef HAS_SYS_TERMIOS #include <sys/termios.h> +#endif #ifdef __linux__ #include <pty.h> #endif diff --git a/src/cmd/acme/regx.c b/src/cmd/acme/regx.c index 56ea900c..ec574563 100644 --- a/src/cmd/acme/regx.c +++ b/src/cmd/acme/regx.c @@ -15,6 +15,9 @@ Rangeset sel; Rune *lastregexp; +#undef class +#define class regxclass /* some systems declare "class" in system headers */ + /* * Machine Information */ diff --git a/src/cmd/auxstats/AIX.c b/src/cmd/auxstats/AIX.c new file mode 100644 index 00000000..33ebdedc --- /dev/null +++ b/src/cmd/auxstats/AIX.c @@ -0,0 +1,9 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include "dat.h" + +void (*statfn[])(int) = +{ + 0 +}; diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c index b4c373ad..234cdf1b 100644 --- a/src/cmd/devdraw/devdraw.c +++ b/src/cmd/devdraw/devdraw.c @@ -14,6 +14,8 @@ #include <drawfcall.h> #include "devdraw.h" +QLock drawlk; + static int drawuninstall(Client*, int); static Memimage* drawinstall(Client*, int, Memimage*, DScreen*); static void drawfreedimage(Client*, DImage*); @@ -47,14 +49,14 @@ gfx_replacescreenimage(Client *c, Memimage *m) */ Memimage *om; - qlock(&c->drawlk); + qlock(&drawlk); om = c->screenimage; c->screenimage = m; m->screenref = 1; if(om && --om->screenref == 0){ _freememimage(om); } - qunlock(&c->drawlk); + qunlock(&drawlk); gfx_mouseresized(c); } @@ -142,9 +144,9 @@ addflush(Client *c, Rectangle r) // and gfx thread might be blocked on drawlk trying to install a new screen // during a resize. rpc_gfxdrawunlock(); - qunlock(&c->drawlk); - rpc_flush(c, fr); - qlock(&c->drawlk); + qunlock(&drawlk); + c->impl->rpc_flush(c, fr); + qlock(&drawlk); rpc_gfxdrawlock(); } } @@ -187,9 +189,9 @@ drawflush(Client *c) // and gfx thread might be blocked on drawlk trying to install a new screen // during a resize. rpc_gfxdrawunlock(); - qunlock(&c->drawlk); - rpc_flush(c, r); - qlock(&c->drawlk); + qunlock(&drawlk); + c->impl->rpc_flush(c, r); + qlock(&drawlk); rpc_gfxdrawlock(); } } @@ -614,7 +616,7 @@ drawcoord(uchar *p, uchar *maxp, int oldx, int *newx) int draw_dataread(Client *cl, void *a, int n) { - qlock(&cl->drawlk); + qlock(&drawlk); if(cl->readdata == nil){ werrstr("no draw data"); goto err; @@ -627,11 +629,11 @@ draw_dataread(Client *cl, void *a, int n) memmove(a, cl->readdata, cl->nreaddata); free(cl->readdata); cl->readdata = nil; - qunlock(&cl->drawlk); + qunlock(&drawlk); return n; err: - qunlock(&cl->drawlk); + qunlock(&drawlk); return -1; } @@ -656,7 +658,7 @@ draw_datawrite(Client *client, void *v, int n) Refreshfn reffn; Refx *refx; - qlock(&client->drawlk); + qlock(&drawlk); rpc_gfxdrawlock(); a = v; m = 0; @@ -1431,7 +1433,7 @@ draw_datawrite(Client *client, void *v, int n) } } rpc_gfxdrawunlock(); - qunlock(&client->drawlk); + qunlock(&drawlk); return oldn - n; Enodrawimage: @@ -1502,6 +1504,6 @@ Ebadarg: error: werrstr("%s", err); rpc_gfxdrawunlock(); - qunlock(&client->drawlk); + qunlock(&drawlk); return -1; } diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h index 6829ab32..261d04d1 100644 --- a/src/cmd/devdraw/devdraw.h +++ b/src/cmd/devdraw/devdraw.h @@ -7,6 +7,7 @@ typedef struct Mousebuf Mousebuf; typedef struct Tagbuf Tagbuf; typedef struct Client Client; +typedef struct ClientImpl ClientImpl; typedef struct DImage DImage; typedef struct DScreen DScreen; typedef struct CScreen CScreen; @@ -43,6 +44,20 @@ struct Tagbuf int wi; }; +struct ClientImpl +{ + void (*rpc_resizeimg)(Client*); + void (*rpc_resizewindow)(Client*, Rectangle); + void (*rpc_setcursor)(Client*, Cursor*, Cursor2*); + void (*rpc_setlabel)(Client*, char*); + void (*rpc_setmouse)(Client*, Point); + void (*rpc_topwin)(Client*); + void (*rpc_bouncemouse)(Client*, Mouse); + void (*rpc_flush)(Client*, Rectangle); +}; + +extern QLock drawlk; + struct Client { int rfd; @@ -56,10 +71,9 @@ struct Client char* wsysid; - // drawlk protects the draw data structures. + // drawlk protects the draw data structures for all clients. // It can be acquired by an RPC thread or a graphics thread // but must not be held on one thread while waiting for the other. - QLock drawlk; /*Ref r;*/ DImage* dimage[NHASH]; CScreen* cscreen; @@ -82,6 +96,7 @@ struct Client int nname; DName* name; int namevers; + ClientImpl* impl; // Only accessed/modified by the graphics thread. const void* view; @@ -196,17 +211,8 @@ void gfx_started(void); Memimage *rpc_attach(Client*, char*, char*); char* rpc_getsnarf(void); void rpc_putsnarf(char*); -void rpc_resizeimg(Client*); -void rpc_resizewindow(Client*, Rectangle); -void rpc_serve(Client*); -void rpc_setcursor(Client*, Cursor*, Cursor2*); -void rpc_setlabel(Client*, char*); -void rpc_setmouse(Client*, Point); void rpc_shutdown(void); -void rpc_topwin(Client*); void rpc_main(void); -void rpc_bouncemouse(Client*, Mouse); -void rpc_flush(Client*, Rectangle); // rpc_gfxdrawlock and rpc_gfxdrawunlock // are called around drawing operations to lock and unlock diff --git a/src/cmd/devdraw/latin1.c b/src/cmd/devdraw/latin1.c index a3d13a08..87c0be45 100644 --- a/src/cmd/devdraw/latin1.c +++ b/src/cmd/devdraw/latin1.c @@ -17,16 +17,15 @@ static struct cvlist }; /* - * Given 5 characters k[0]..k[4], find the rune or return -1 for failure. + * Given 5 characters k[0]..k[n], find the rune or return -1 for failure. */ static long -unicode(Rune *k) +unicode(Rune *k, int n) { long i, c; - k++; /* skip 'X' */ c = 0; - for(i=0; i<4; i++,k++){ + for(i=0; i<n; i++,k++){ c <<= 4; if('0'<=*k && *k<='9') c += *k-'0'; @@ -36,6 +35,8 @@ unicode(Rune *k) c += 10 + *k-'A'; else return -1; + if(c > Runemax) + return -1; } return c; } @@ -53,10 +54,32 @@ latin1(Rune *k, int n) char* p; if(k[0] == 'X'){ - if(n>=5) - return unicode(k); - else - return -5; + if(n < 2) + return -2; + if(k[1] == 'X') { + if(n < 3) + return -3; + if(k[2] == 'X') { + if(n < 9) { + if(unicode(k+3, n-3) < 0) + return -1; + return -(n+1); + } + return unicode(k+3, 6); + } + if(n < 7) { + if(unicode(k+2, n-2) < 0) + return -1; + return -(n+1); + } + return unicode(k+2, 5); + } + if(n < 5) { + if(unicode(k+1, n-1) < 0) + return -1; + return -(n+1); + } + return unicode(k+1, 4); } for(l=latintab; l->ld!=0; l++) diff --git a/src/cmd/devdraw/mac-screen.m b/src/cmd/devdraw/mac-screen.m index c6e58341..ad9c029e 100644 --- a/src/cmd/devdraw/mac-screen.m +++ b/src/cmd/devdraw/mac-screen.m @@ -37,6 +37,26 @@ static void setprocname(const char*); static uint keycvt(uint); static uint msec(void); +static void rpc_resizeimg(Client*); +static void rpc_resizewindow(Client*, Rectangle); +static void rpc_setcursor(Client*, Cursor*, Cursor2*); +static void rpc_setlabel(Client*, char*); +static void rpc_setmouse(Client*, Point); +static void rpc_topwin(Client*); +static void rpc_bouncemouse(Client*, Mouse); +static void rpc_flush(Client*, Rectangle); + +static ClientImpl macimpl = { + rpc_resizeimg, + rpc_resizewindow, + rpc_setcursor, + rpc_setlabel, + rpc_setmouse, + rpc_topwin, + rpc_bouncemouse, + rpc_flush +}; + @class DrawView; @class DrawLayer; @@ -201,6 +221,7 @@ rpc_attach(Client *c, char *label, char *winsize) { LOG(@"attachscreen(%s, %s)", label, winsize); + c->impl = &macimpl; dispatch_sync(dispatch_get_main_queue(), ^(void) { @autoreleasepool { DrawView *view = [[DrawView new] attach:c winsize:winsize label:label]; @@ -302,7 +323,7 @@ rpc_attach(Client *c, char *label, char *winsize) // rpc_topwin moves the window to the top of the desktop. // Called from an RPC thread with no client lock held. -void +static void rpc_topwin(Client *c) { DrawView *view = (__bridge DrawView*)c->view; @@ -319,7 +340,7 @@ rpc_topwin(Client *c) // rpc_setlabel updates the client window's label. // If label == nil, the call is a no-op. // Called from an RPC thread with no client lock held. -void +static void rpc_setlabel(Client *client, char *label) { DrawView *view = (__bridge DrawView*)client->view; @@ -344,7 +365,7 @@ rpc_setlabel(Client *client, char *label) // rpc_setcursor updates the client window's cursor image. // Either c and c2 are both non-nil, or they are both nil to use the default arrow. // Called from an RPC thread with no client lock held. -void +static void rpc_setcursor(Client *client, Cursor *c, Cursor2 *c2) { DrawView *view = (__bridge DrawView*)client->view; @@ -460,7 +481,7 @@ rpc_setcursor(Client *client, Cursor *c, Cursor2 *c2) // rpc_flush flushes changes to view.img's rectangle r // to the on-screen window, making them visible. // Called from an RPC thread with no client lock held. -void +static void rpc_flush(Client *client, Rectangle r) { DrawView *view = (__bridge DrawView*)client->view; @@ -474,17 +495,17 @@ rpc_flush(Client *client, Rectangle r) if(!rectclip(&r, Rect(0, 0, self.dlayer.texture.width, self.dlayer.texture.height)) || !rectclip(&r, self.img->r)) return; - // self.client->drawlk protects the pixel data in self.img. + // drawlk protects the pixel data in self.img. // In addition to avoiding a technical data race, // the lock avoids drawing partial updates, which makes // animations like sweeping windows much less flickery. - qlock(&self.client->drawlk); + qlock(&drawlk); [self.dlayer.texture replaceRegion:MTLRegionMake2D(r.min.x, r.min.y, Dx(r), Dy(r)) mipmapLevel:0 withBytes:byteaddr(self.img, Pt(r.min.x, r.min.y)) bytesPerRow:self.img->width*sizeof(u32int)]; - qunlock(&self.client->drawlk); + qunlock(&drawlk); NSRect nr = NSMakeRect(r.min.x, r.min.y, Dx(r), Dy(r)); dispatch_time_t time; @@ -506,7 +527,7 @@ rpc_flush(Client *client, Rectangle r) // rpc_resizeimg forces the client window to discard its current window and make a new one. // It is called when the user types Cmd-R to toggle whether retina mode is forced. // Called from an RPC thread with no client lock held. -void +static void rpc_resizeimg(Client *c) { DrawView *view = (__bridge DrawView*)c->view; @@ -541,7 +562,7 @@ rpc_resizeimg(Client *c) // rpc_resizewindow asks for the client window to be resized to size r. // Called from an RPC thread with no client lock held. -void +static void rpc_resizewindow(Client *c, Rectangle r) { DrawView *view = (__bridge DrawView*)c->view; @@ -696,7 +717,7 @@ rpc_resizewindow(Client *c, Rectangle r) // rpc_setmouse moves the mouse cursor. // Called from an RPC thread with no client lock held. -void +static void rpc_setmouse(Client *c, Point p) { DrawView *view = (__bridge DrawView*)c->view; @@ -1095,7 +1116,7 @@ rpc_putsnarf(char *s) // rpc_bouncemouse is for sending a mouse event // back to the X11 window manager rio(1). // Does not apply here. -void +static void rpc_bouncemouse(Client *c, Mouse m) { } diff --git a/src/cmd/devdraw/mklatinkbd.c b/src/cmd/devdraw/mklatinkbd.c index db34b6ec..50dd26b0 100644 --- a/src/cmd/devdraw/mklatinkbd.c +++ b/src/cmd/devdraw/mklatinkbd.c @@ -191,7 +191,7 @@ readfile(char *fname) r = strtol(line, nil, 16); p = strchr(line, ' '); - if(r == 0 || p != line+4 || p[0] != ' ' || p[1] != ' ') { + if(r == 0 || (p != line+4 && p != line+5) || p[0] != ' ' || (p == line+4 && p[1] != ' ')) { fprint(2, "%s:%d: cannot parse line\n", fname, lineno); continue; } diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c index 570091bc..05a08fda 100644 --- a/src/cmd/devdraw/srv.c +++ b/src/cmd/devdraw/srv.c @@ -54,6 +54,7 @@ threadmain(int argc, char **argv) usage(); }ARGEND + memimageinit(); fmtinstall('H', encodefmt); if((p = getenv("DEVDRAWTRACE")) != nil) trace = atoi(p); @@ -202,8 +203,11 @@ runmsg(Client *c, Wsysmsg *m) break; case Tinit: - memimageinit(); i = rpc_attach(c, m->label, m->winsize); + if(i == nil) { + replyerror(c, m); + break; + } draw_initdisplaymemimage(c, i); replymsg(c, m); break; @@ -225,6 +229,7 @@ runmsg(Client *c, Wsysmsg *m) break; case Trdkbd: + case Trdkbd4: qlock(&c->eventlk); if((c->kbdtags.wi+1)%nelem(c->kbdtags.t) == c->kbdtags.ri) { qunlock(&c->eventlk); @@ -232,7 +237,7 @@ runmsg(Client *c, Wsysmsg *m) replyerror(c, m); break; } - c->kbdtags.t[c->kbdtags.wi++] = m->tag; + c->kbdtags.t[c->kbdtags.wi++] = (m->tag<<1) | (m->type==Trdkbd4); if(c->kbdtags.wi == nelem(c->kbdtags.t)) c->kbdtags.wi = 0; c->kbd.stall = 0; @@ -241,35 +246,35 @@ runmsg(Client *c, Wsysmsg *m) break; case Tmoveto: - rpc_setmouse(c, m->mouse.xy); + c->impl->rpc_setmouse(c, m->mouse.xy); replymsg(c, m); break; case Tcursor: if(m->arrowcursor) - rpc_setcursor(c, nil, nil); + c->impl->rpc_setcursor(c, nil, nil); else { scalecursor(&m->cursor2, &m->cursor); - rpc_setcursor(c, &m->cursor, &m->cursor2); + c->impl->rpc_setcursor(c, &m->cursor, &m->cursor2); } replymsg(c, m); break; case Tcursor2: if(m->arrowcursor) - rpc_setcursor(c, nil, nil); + c->impl->rpc_setcursor(c, nil, nil); else - rpc_setcursor(c, &m->cursor, &m->cursor2); + c->impl->rpc_setcursor(c, &m->cursor, &m->cursor2); replymsg(c, m); break; case Tbouncemouse: - rpc_bouncemouse(c, m->mouse); + c->impl->rpc_bouncemouse(c, m->mouse); replymsg(c, m); break; case Tlabel: - rpc_setlabel(c, m->label); + c->impl->rpc_setlabel(c, m->label); replymsg(c, m); break; @@ -306,12 +311,12 @@ runmsg(Client *c, Wsysmsg *m) break; case Ttop: - rpc_topwin(c); + c->impl->rpc_topwin(c); replymsg(c, m); break; case Tresize: - rpc_resizewindow(c, m->rect); + c->impl->rpc_resizewindow(c, m->rect); replymsg(c, m); break; } @@ -353,13 +358,17 @@ replymsg(Client *c, Wsysmsg *m) static void matchkbd(Client *c) { + int tag; Wsysmsg m; if(c->kbd.stall) return; while(c->kbd.ri != c->kbd.wi && c->kbdtags.ri != c->kbdtags.wi){ + tag = c->kbdtags.t[c->kbdtags.ri++]; m.type = Rrdkbd; - m.tag = c->kbdtags.t[c->kbdtags.ri++]; + if(tag&1) + m.type = Rrdkbd4; + m.tag = tag>>1; if(c->kbdtags.ri == nelem(c->kbdtags.t)) c->kbdtags.ri = 0; m.rune = c->kbd.r[c->kbd.ri++]; @@ -513,7 +522,7 @@ gfx_keystroke(Client *c, int ch) else c->forcedpi = 225; qunlock(&c->eventlk); - rpc_resizeimg(c); + c->impl->rpc_resizeimg(c); return; } if(!c->kbd.alting){ diff --git a/src/cmd/devdraw/x11-screen.c b/src/cmd/devdraw/x11-screen.c index 62f49f2f..0bbc25d6 100644 --- a/src/cmd/devdraw/x11-screen.c +++ b/src/cmd/devdraw/x11-screen.c @@ -40,6 +40,26 @@ static void _xmovewindow(Xwin *w, Rectangle r); static int _xtoplan9kbd(XEvent *e); static int _xselect(XEvent *e); +static void rpc_resizeimg(Client*); +static void rpc_resizewindow(Client*, Rectangle); +static void rpc_setcursor(Client*, Cursor*, Cursor2*); +static void rpc_setlabel(Client*, char*); +static void rpc_setmouse(Client*, Point); +static void rpc_topwin(Client*); +static void rpc_bouncemouse(Client*, Mouse); +static void rpc_flush(Client*, Rectangle); + +static ClientImpl x11impl = { + rpc_resizeimg, + rpc_resizewindow, + rpc_setcursor, + rpc_setlabel, + rpc_setmouse, + rpc_topwin, + rpc_bouncemouse, + rpc_flush +}; + static Xwin* newxwin(Client *c) { @@ -51,6 +71,7 @@ newxwin(Client *c) w->client = c; w->next = _x.windows; _x.windows = w; + c->impl = &x11impl; c->view = w; return w; } diff --git a/src/cmd/diff/diffreg.c b/src/cmd/diff/diffreg.c index ed4d17b8..478c1b1b 100644 --- a/src/cmd/diff/diffreg.c +++ b/src/cmd/diff/diffreg.c @@ -66,6 +66,9 @@ * 3*(number of k-candidates installed), typically about * 6n words for files of length n. */ + +#define class diffclass + /* TIDY THIS UP */ struct cand { int x; diff --git a/src/cmd/draw/mc.c b/src/cmd/draw/mc.c index ee112194..f1bcc82a 100644 --- a/src/cmd/draw/mc.c +++ b/src/cmd/draw/mc.c @@ -9,7 +9,10 @@ */ #include <u.h> #include <sys/ioctl.h> +#include <termios.h> +#ifdef HAS_SYS_TERMIOS #include <sys/termios.h> +#endif #include <libc.h> #include <draw.h> #include <bio.h> diff --git a/src/cmd/ed.c b/src/cmd/ed.c index 8b0f36e5..a04f0d3f 100644 --- a/src/cmd/ed.c +++ b/src/cmd/ed.c @@ -21,6 +21,12 @@ enum EOF = -1 }; +enum +{ + LINELEN = 70, /* max number of glyphs in a display line */ + BELL = 6 /* A char could require up to BELL glyphs to display */ +}; + void (*oldhup)(int); void (*oldquit)(int); int* addr1; @@ -40,7 +46,7 @@ int ichanged; int io; Biobuf iobuf; int lastc; -char line[70]; +char line[LINELEN]; Rune* linebp; Rune linebuf[LBSIZE]; int listf; @@ -1543,7 +1549,7 @@ putchr(int ac) *lp++ = 'n'; } } else { - if(col > (72-6-2)) { + if(col > (LINELEN-BELL)) { col = 8; *lp++ = '\\'; *lp++ = '\n'; @@ -1558,15 +1564,32 @@ putchr(int ac) if(c == '\t') c = 't'; col++; - } else - if(c<' ' || c>='\177') { + } else if (c<' ' || c=='\177') { *lp++ = '\\'; *lp++ = 'x'; - *lp++ = hex[c>>12]; - *lp++ = hex[c>>8&0xF]; - *lp++ = hex[c>>4&0xF]; - c = hex[c&0xF]; + *lp++ = hex[(c>>4)&0xF]; + c = hex[c&0xF]; + col += 3; + } else if (c>'\177' && c<=0xFFFF) { + *lp++ = '\\'; + *lp++ = 'u'; + *lp++ = hex[(c>>12)&0xF]; + *lp++ = hex[(c>>8)&0xF]; + *lp++ = hex[(c>>4)&0xF]; + c = hex[c&0xF]; col += 5; + } else if (c>0xFFFF) { + *lp++ = '\\'; + *lp++ = 'U'; + *lp++ = hex[(c>>28)&0xF]; + *lp++ = hex[(c>>24)&0xF]; + *lp++ = hex[(c>>20)&0xF]; + *lp++ = hex[(c>>16)&0xF]; + *lp++ = hex[(c>>12)&0xF]; + *lp++ = hex[(c>>8)&0xF]; + *lp++ = hex[(c>>4)&0xF]; + c = hex[c&0xF]; + col += 9; } } } @@ -1574,7 +1597,7 @@ putchr(int ac) rune = c; lp += runetochar(lp, &rune); - if(c == '\n' || lp >= &line[sizeof(line)-5]) { + if(c == '\n' || lp >= &line[LINELEN-BELL]) { linp = line; write(oflag? 2: 1, line, lp-line); return; diff --git a/src/cmd/fontsrv/a.h b/src/cmd/fontsrv/a.h index 164b1bd6..2eeb404f 100644 --- a/src/cmd/fontsrv/a.h +++ b/src/cmd/fontsrv/a.h @@ -4,19 +4,22 @@ int nxfont; enum { SubfontSize = 32, - SubfontMask = (1<<16)/SubfontSize - 1, + MaxSubfont = (Runemax+1)/SubfontSize, }; struct XFont { char *name; int loaded; - uchar range[(1<<16)/SubfontSize]; // range[i] == whether to have subfont i*SubfontSize to (i+1)*SubfontSize - 1. - int nrange; + uchar range[MaxSubfont]; // range[i] = fontfile starting at i*SubfontSize exists + ushort file[MaxSubfont]; // file[i] == fontfile i's lo rune / SubfontSize + int nfile; int unit; double height; double originy; void (*loadheight)(XFont*, int, int*, int*); + char *fonttext; + int nfonttext; // fontconfig workarround, as FC_FULLNAME does not work for matching fonts. char *fontfile; diff --git a/src/cmd/fontsrv/mac.c b/src/cmd/fontsrv/mac.c index b4dadd90..9829b5a8 100644 --- a/src/cmd/fontsrv/mac.c +++ b/src/cmd/fontsrv/mac.c @@ -200,9 +200,12 @@ load(XFont *f) f->loadheight = fontheight; // enable all Unicode ranges + if(nelem(f->file) > 0xffff) + sysfatal("too many subfiles"); // f->file holds ushorts for(i=0; i<nelem(f->range); i++) { f->range[i] = 1; - f->nrange++; + f->file[i] = i; + f->nfile++; } } @@ -233,7 +236,6 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) if(font == nil) return nil; - bbox = CTFontGetBoundingBox(font); x = (int)(bbox.size.width*2 + 0.99999999); diff --git a/src/cmd/fontsrv/main.c b/src/cmd/fontsrv/main.c index ebab6249..b2189be9 100644 --- a/src/cmd/fontsrv/main.c +++ b/src/cmd/fontsrv/main.c @@ -52,7 +52,7 @@ enum #define QFONT(p) (((p) >> 4) & 0xFFFF) #define QSIZE(p) (((p) >> 20) & 0xFF) #define QANTIALIAS(p) (((p) >> 28) & 0x1) -#define QRANGE(p) (((p) >> 29) & SubfontMask) +#define QRANGE(p) (((p) >> 29) & 0xFFFFFF) static int sizes[] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 28 }; static vlong @@ -102,7 +102,7 @@ dostat(vlong path, Qid *qid, Dir *dir) case Qfontfile: f = &xfont[QFONT(path)]; load(f); - length = 11+1+11+1+f->nrange*(6+1+6+1+9+1); + length = 11+1+11+1+f->nfile*(6+1+6+1+9+1); name = "font"; break; @@ -189,9 +189,9 @@ xwalk1(Fid *fid, char *name, Qid *qid) goto NotFound; p++; n = strtoul(p, &p, 16); - if(p != name+5 || n%SubfontSize != 0 || strcmp(p, ".bit") != 0 || !f->range[(n/SubfontSize) & SubfontMask]) + if(p < name+5 || p > name+5 && name[1] == '0' || n%SubfontSize != 0 || n/SubfontSize >= MaxSubfont || strcmp(p, ".bit") != 0 || !f->range[n/SubfontSize]) goto NotFound; - path += Qsubfontfile - Qsizedir + qpath(0, 0, 0, 0, (n/SubfontSize) & SubfontMask); + path += Qsubfontfile - Qsizedir + qpath(0, 0, 0, 0, n/SubfontSize); break; } Found: @@ -229,7 +229,6 @@ sizegen(int i, Dir *d, void *v) vlong path; Fid *fid; XFont *f; - int j; fid = v; path = fid->qid.path; @@ -240,15 +239,10 @@ sizegen(int i, Dir *d, void *v) i--; f = &xfont[QFONT(path)]; load(f); - for(j=0; j<nelem(f->range); j++) { - if(f->range[j] == 0) - continue; - if(i == 0) { - path += Qsubfontfile - Qsizedir; - path += qpath(0, 0, 0, 0, j); - goto Done; - } - i--; + if(i < f->nfile) { + path += Qsubfontfile - Qsizedir; + path += qpath(0, 0, 0, 0, f->file[i]); + goto Done; } return -1; @@ -315,23 +309,22 @@ xread(Req *r) readstr(r, "font missing\n"); break; } - height = 0; - ascent = 0; - if(f->unit > 0) { - height = f->height * (int)QSIZE(path)/f->unit + 0.99999999; - ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999); - } - if(f->loadheight != nil) - f->loadheight(f, QSIZE(path), &height, &ascent); - fmtprint(&fmt, "%11d %11d\n", height, ascent); - for(i=0; i<nelem(f->range); i++) { - if(f->range[i] == 0) - continue; - fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", i*SubfontSize, ((i+1)*SubfontSize) - 1, i*SubfontSize); + if(f->fonttext == nil) { + height = 0; + ascent = 0; + if(f->unit > 0) { + height = f->height * (int)QSIZE(path)/f->unit + 0.99999999; + ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999); + } + if(f->loadheight != nil) + f->loadheight(f, QSIZE(path), &height, &ascent); + fmtprint(&fmt, "%11d %11d\n", height, ascent); + for(i=0; i<f->nfile; i++) + fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", f->file[i]*SubfontSize, ((f->file[i]+1)*SubfontSize) - 1, f->file[i]*SubfontSize); + f->fonttext = fmtstrflush(&fmt); + f->nfonttext = strlen(f->fonttext); } - data = fmtstrflush(&fmt); - readstr(r, data); - free(data); + readbuf(r, f->fonttext, f->nfonttext); break; case Qsubfontfile: f = &xfont[QFONT(path)]; diff --git a/src/cmd/fontsrv/x11.c b/src/cmd/fontsrv/x11.c index 0f6b97bb..c1d10197 100644 --- a/src/cmd/fontsrv/x11.c +++ b/src/cmd/fontsrv/x11.c @@ -61,6 +61,7 @@ load(XFont *f) FT_Error e; FT_ULong charcode; FT_UInt glyph_index; + int i; if(f->loaded) return; @@ -78,27 +79,30 @@ load(XFont *f) } f->unit = face->units_per_EM; f->height = (int)((face->ascender - face->descender) * 1.35); - f->originy = face->descender; // bbox.yMin (or descender) is negative, becase the baseline is y-coord 0 + f->originy = face->descender * 1.35; // bbox.yMin (or descender) is negative, because the baseline is y-coord 0 for(charcode=FT_Get_First_Char(face, &glyph_index); glyph_index != 0; charcode=FT_Get_Next_Char(face, charcode, &glyph_index)) { int idx = charcode/SubfontSize; - if(charcode > 0xffff) + if(charcode > Runemax) break; - if(!f->range[idx]) { + if(!f->range[idx]) f->range[idx] = 1; - f->nrange++; - } } + FT_Done_Face(face); + // libdraw expects U+0000 to be present - if(!f->range[0]) { + if(!f->range[0]) f->range[0] = 1; - f->nrange++; - } - FT_Done_Face(face); + + // fix up file list + for(i=0; i<nelem(f->range); i++) + if(f->range[i]) + f->file[f->nfile++] = i; + f->loaded = 1; } diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c index 5b0c1d00..6d646979 100644 --- a/src/cmd/mk/archive.c +++ b/src/cmd/mk/archive.c @@ -1,5 +1,9 @@ #include "mk.h" +#if defined(__AIX__) +#define ARMAG "<bigaf>\n" +#else #define ARMAG "!<arch>\n" +#endif #define SARMAG (sizeof(ARMAG) - sizeof("")) #define ARFMAG "`\n" diff --git a/src/cmd/mk/env.c b/src/cmd/mk/env.c index d7c6481d..e01aa21a 100644 --- a/src/cmd/mk/env.c +++ b/src/cmd/mk/env.c @@ -123,7 +123,8 @@ buildenv(Job *j, int slot) qp = strchr(cp+1, ')'); if(qp){ *qp = 0; - strcpy(w->s, cp+1); + /* strcpy, but might overlap */ + memmove(w->s, cp+1, strlen(cp+1)+1); l = &w->next; w = w->next; continue; diff --git a/src/cmd/mkfile b/src/cmd/mkfile index bc8b5a0d..2d0c657e 100644 --- a/src/cmd/mkfile +++ b/src/cmd/mkfile @@ -27,7 +27,7 @@ $PLAN9/bin/lex: $PLAN9/bin/yacc # This should not be necessary. $PLAN9/bin/yacc: $O.yacc - install -c $O.yacc $PLAN9/bin/yacc + $INSTALL -c $O.yacc $PLAN9/bin/yacc $O.yacc: yacc.$O $LD -o $target $prereq yacc.$O: yacc.c diff --git a/src/cmd/rc/rc.h b/src/cmd/rc/rc.h index 46ff9510..2fd6758b 100644 --- a/src/cmd/rc/rc.h +++ b/src/cmd/rc/rc.h @@ -33,6 +33,12 @@ #undef pipe /* so that /dev/fd works */ #define searchpath rcsearchpath /* avoid new libc function */ +/* some systems define a global "var", "thread" */ +#undef var +#define var rcvar +#undef thread +#define thread rcthread + typedef struct tree tree; typedef struct word word; typedef struct io io; diff --git a/src/cmd/vbackup/mount-AIX.c b/src/cmd/vbackup/mount-AIX.c new file mode 100644 index 00000000..3dde4fdf --- /dev/null +++ b/src/cmd/vbackup/mount-AIX.c @@ -0,0 +1 @@ +#include "mount-none.c" |