tdevdraw: update OS X snarf for 32-bit Rune - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dd73705611ada36019e58fdd8f27fa59aae7e975
 (DIR) parent 6ad28910942886749e259f58505ee23fea04f267
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Sat, 12 Sep 2009 19:38:54 -0400
       
       devdraw: update OS X snarf for 32-bit Rune
       
       fixes #29 http://code.swtch.com/plan9port/issues/29/
       
       http://codereview.appspot.com/117057
       
       Diffstat:
         M src/cmd/devdraw/osx-screen.c        |      49 ++++++-------------------------
       
       1 file changed, 9 insertions(+), 40 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/devdraw/osx-screen.c b/src/cmd/devdraw/osx-screen.c
       t@@ -732,7 +732,7 @@ struct {
        char*
        getsnarf(void)
        {
       -        char *s;
       +        char *s, *t;
                CFArrayRef flavors;
                CFDataRef data;
                CFIndex nflavor, ndata, j;
       t@@ -741,9 +741,6 @@ getsnarf(void)
                PasteboardItemID id;
                PasteboardSyncFlags flags;
                UInt32 i;
       -        u16int *u;
       -        Fmt fmt;
       -        Rune r;
        
        /*        fprint(2, "applegetsnarf\n"); */
                qlock(&clip.lk);
       t@@ -778,26 +775,15 @@ getsnarf(void)
                                        continue;
                                if(PasteboardCopyItemFlavorData(clip.apple, id, type, &data) != noErr)
                                        continue;
       +                        ndata = CFDataGetLength(data);
                                qunlock(&clip.lk);
       -                        ndata = CFDataGetLength(data)/2;
       -                        u = (u16int*)CFDataGetBytePtr(data);
       -                        fmtstrinit(&fmt);
       -                        // decode utf-16.  what was apple thinking?
       -                        for(i=0; i<ndata; i++) {
       -                                r = u[i];
       -                                if(0xd800 <= r && r < 0xdc00 && i+1 < ndata && 0xdc00 <= u[i+1] && u[i+1] < 0xe000) {
       -                                        r = (((r - 0xd800)<<10) |  (u[i+1] - 0xdc00)) + 0x10000;
       -                                        i++;
       -                                }
       -                                else if(0xd800 <= r && r < 0xe000)
       -                                        r = Runeerror;
       -                                if(r == '\r')
       -                                        r = '\n';
       -                                fmtrune(&fmt, r);
       -                        }
       +                        s = smprint("%.*S", ndata/2, (Rune*)CFDataGetBytePtr(data));
                                CFRelease(flavors);
                                CFRelease(data);
       -                        return fmtstrflush(&fmt);
       +                        for(t=s; *t; t++)
       +                                if(*t == '\r')
       +                                        *t = '\n';
       +                        return s;
                        }
                        CFRelease(flavors);
                }
       t@@ -810,9 +796,6 @@ putsnarf(char *s)
        {
                CFDataRef cfdata;
                PasteboardSyncFlags flags;
       -        u16int *u, *p;
       -        Rune r;
       -        int i;
        
        /*        fprint(2, "appleputsnarf\n"); */
        
       t@@ -833,23 +816,9 @@ putsnarf(char *s)
                        qunlock(&clip.lk);
                        return;
                }
       -        u = malloc(runestrlen(clip.rbuf)*4);
       -        p = u;
       -        for(i=0; clip.rbuf[i]; i++) {
       -                r = clip.rbuf[i];
       -                // convert to utf-16
       -                if(0xd800 <= r && r < 0xe000)
       -                        r = Runeerror;
       -                if(r >= 0x10000) {
       -                        r -= 0x10000;
       -                        *p++ = 0xd800 + (r>>10);
       -                        *p++ = 0xdc00 + (r & ((1<<10)-1));
       -                } else
       -                        *p++ = r;
       -        }
       +        assert(sizeof(clip.rbuf[0]) == 2);
                cfdata = CFDataCreate(kCFAllocatorDefault, 
       -                (uchar*)u, (p-u)*2);
       -        free(u);
       +                (uchar*)clip.rbuf, runestrlen(clip.rbuf)*2);
                if(cfdata == nil){
                        fprint(2, "apple pasteboard cfdatacreate failed\n");
                        qunlock(&clip.lk);