devdraw: update OS X snarf for 32-bit Rune

fixes #29 http://code.swtch.com/plan9port/issues/29/

http://codereview.appspot.com/117057
This commit is contained in:
Russ Cox 2009-09-12 19:38:54 -04:00
parent 6ad2891094
commit dd73705611

View file

@ -732,7 +732,7 @@ struct {
char*
getsnarf(void)
{
char *s;
char *s, *t;
CFArrayRef flavors;
CFDataRef data;
CFIndex nflavor, ndata, j;
@ -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);
@ -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);
}
@ -810,9 +796,6 @@ putsnarf(char *s)
{
CFDataRef cfdata;
PasteboardSyncFlags flags;
u16int *u, *p;
Rune r;
int i;
/* fprint(2, "appleputsnarf\n"); */
@ -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);