summaryrefslogtreecommitdiff
path: root/amiga/clipboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'amiga/clipboard.c')
-rw-r--r--[-rwxr-xr-x]amiga/clipboard.c107
1 files changed, 55 insertions, 52 deletions
diff --git a/amiga/clipboard.c b/amiga/clipboard.c
index 0897357ab..5e51efc70 100755..100644
--- a/amiga/clipboard.c
+++ b/amiga/clipboard.c
@@ -20,7 +20,7 @@
#include "desktop/plotters.h"
#include "desktop/selection.h"
#include "desktop/textinput.h"
-#include "utils/utf8.h"
+#include "desktop/options.h"
#include "amiga/bitmap.h"
#include "amiga/clipboard.h"
@@ -30,9 +30,10 @@
#include "amiga/iff_cset.h"
#include "amiga/iff_dr2d.h"
#include "amiga/menu.h"
-#include "desktop/options.h"
#include "amiga/utf8.h"
+#include "utils/utf8.h"
+
#include <proto/iffparse.h>
#include <proto/intuition.h>
#include <proto/exec.h>
@@ -117,74 +118,79 @@ void gui_clear_selection(struct gui_window *g)
OffMenu(g->shared->win, AMI_MENU_COPY);
}
-bool ami_clipboard_check_for_utf8(struct IFFHandle *iffh) {
- struct ContextNode *cn;
- ULONG error;
- bool utf8_chunk = false;
-
- if(OpenIFF(iffh, IFFF_READ)) return false;
-
- ami_clipboard_iffp_clear_stopchunk(iffh, ID_FTXT, ID_CSET);
- ami_clipboard_iffp_clear_stopchunk(iffh, ID_FTXT, ID_CHRS);
-
- if(!StopChunk(iffh, ID_FTXT, ID_UTF8)) {
- error = ParseIFF(iffh, IFFPARSE_SCAN);
- if(error != IFFERR_EOF)
- utf8_chunk = true; /* or a real error, but that'll get caught later */
- }
- CloseIFF(iffh);
-
- return utf8_chunk;
-}
-
char *ami_clipboard_cat_collection(struct CollectionItem *ci, LONG codeset, size_t *text_length)
{
- struct CollectionItem *ci_curr = ci;
+ struct CollectionItem *ci_new = NULL, *ci_next, *ci_curr = ci;
size_t len = 0;
char *text = NULL, *p, *clip;
- /* Scan the collected chunks to find out the total size */
+ /* Scan the collected chunks to find out the total size.
+ * If they are not in UTF-8, convert the chunks first and create a new CollectionItem list.
+ */
do {
- len += ci_curr->ci_Size;
- } while (ci_curr = ci_curr->ci_Next);
-
- text = malloc(len);
-
- if(text == NULL) return NULL;
-
- /* p points to the end of the buffer. This is because the chunks are
- * in the list in reverse order. */
- p = text + len;
- ci_curr = ci;
-
- do {
- p -= ci_curr->ci_Size;
-
switch(codeset) {
case 106:
- memcpy(p, ci_curr->ci_Data, ci_curr->ci_Size);
+ len += ci_curr->ci_Size;
break;
-
- /* If codeset isn't 106 (UTF-8) we need to convert to UTF-8.
- * TODO: ensure buffer is big enough for converted text */
-
+
case 0:
- utf8_from_local_encoding(ci_curr->ci_Data, ci_curr->ci_Size, &clip);
- memcpy(p, clip, ci_curr->ci_Size);
- free(clip);
+ if(ci_new) {
+ ci_next->ci_Next = AllocVec(sizeof(struct CollectionItem), MEMF_PRIVATE | MEMF_CLEAR);
+ ci_next = ci_next->ci_Next;
+ } else {
+ ci_new = AllocVec(sizeof(struct CollectionItem), MEMF_PRIVATE | MEMF_CLEAR);
+ ci_next = ci_new;
+ }
+
+ utf8_from_local_encoding(ci_curr->ci_Data, ci_curr->ci_Size, &ci_next->ci_Data);
+ ci_next->ci_Size = strlen(ci_next->ci_Data);
+ len += ci_next->ci_Size;
break;
default:
+ if(ci_new) {
+ ci_next->ci_Next = AllocVec(sizeof(struct CollectionItem), MEMF_PRIVATE | MEMF_CLEAR);
+ ci_next = ci_next->ci_Next;
+ } else {
+ ci_new = AllocVec(sizeof(struct CollectionItem), MEMF_PRIVATE | MEMF_CLEAR);
+ ci_next = ci_new;
+ }
+
utf8_from_enc(ci_curr->ci_Data,
(const char *)ObtainCharsetInfo(DFCS_NUMBER,
codeset, DFCS_MIMENAME),
ci_curr->ci_Size, &clip);
- memcpy(p, clip, ci_curr->ci_Size);
- free(clip);
+ ci_next->ci_Size = strlen(ci_next->ci_Data);
+ len += ci_next->ci_Size;
break;
}
} while (ci_curr = ci_curr->ci_Next);
+ text = malloc(len);
+
+ if(text == NULL) return NULL;
+
+ /* p points to the end of the buffer. This is because the chunks are
+ * in the list in reverse order. */
+ p = text + len;
+
+ if(ci_new) {
+ ci_curr = ci;
+ } else {
+ ci_curr = ci_new;
+ }
+
+ do {
+ p -= ci_curr->ci_Size;
+ memcpy(p, ci_curr->ci_Data, ci_curr->ci_Size);
+ ci_next = ci_curr->ci_Next;
+
+ if(ci_new) {
+ free(ci_curr->ci_Data);
+ FreeVec(ci_curr);
+ }
+ } while (ci_curr = ci_next);
+
*text_length = len;
return text;
}
@@ -196,9 +202,6 @@ void gui_get_clipboard(char **buffer, size_t *length)
ULONG rlen=0,error;
struct CSet cset;
LONG codeset = 0;
- char *clip;
- bool utf8_chunks = false;
- STRPTR readbuf = AllocVec(1024,MEMF_PRIVATE | MEMF_CLEAR);
cset.CodeSet = 0;