Add UTF-8 to/from ISO 8859-1 conversion routines

We convert between UTF-8 and ISO 8859-1 (latin 1) in several places
so create some common routines for this.
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index 5e49599..151ecb4 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -235,25 +235,17 @@
 void Viewport::serverCutText(const char* str)
 {
   char *buffer;
-  int size, ret;
+  size_t len;
 
   clearPendingClipboard();
 
   if (!acceptClipboard)
     return;
 
-  size = fl_utf8froma(NULL, 0, str, strlen(str));
-  if (size <= 0)
-    return;
+  buffer = latin1ToUTF8(str);
+  len = strlen(buffer);
 
-  size++;
-
-  buffer = new char[size];
-
-  ret = fl_utf8froma(buffer, size, str, strlen(str));
-  assert(ret < size);
-
-  vlog.debug("Got clipboard data (%d bytes)", (int)strlen(buffer));
+  vlog.debug("Got clipboard data (%d bytes)", (int)len);
 
   if (!hasFocus()) {
     pendingServerCutText = buffer;
@@ -264,11 +256,11 @@
   // dump the data into both variants.
 #if !defined(WIN32) && !defined(__APPLE__)
   if (setPrimary)
-    Fl::copy(buffer, ret, 0);
+    Fl::copy(buffer, len, 0);
 #endif
-  Fl::copy(buffer, ret, 1);
+  Fl::copy(buffer, len, 1);
 
-  delete [] buffer;
+  strFree(buffer);
 }
 
 static const char * dotcursor_xpm[] = {
@@ -550,27 +542,19 @@
 int Viewport::handle(int event)
 {
   char *buffer, *filtered;
-  int ret;
   int buttonMask, wheelMask;
   DownMap::const_iterator iter;
 
   switch (event) {
   case FL_PASTE:
-    buffer = new char[Fl::event_length() + 1];
-
     clearPendingClipboard();
 
-    // This is documented as to ASCII, but actually does to 8859-1
-    ret = fl_utf8toa(Fl::event_text(), Fl::event_length(), buffer,
-                     Fl::event_length() + 1);
-    assert(ret < (Fl::event_length() + 1));
-    filtered = convertLF(buffer, ret);
-    delete [] buffer;
+    buffer = utf8ToLatin1(Fl::event_text(), Fl::event_length());
+    filtered = convertLF(buffer);
+    strFree(buffer);
 
     if (!hasFocus()) {
-      pendingClientCutText = new char[strlen(filtered) + 1];
-      strcpy((char*)pendingClientCutText, filtered);
-      strFree(filtered);
+      pendingClientCutText = filtered;
       return 1;
     }
 
@@ -747,9 +731,9 @@
 
 void Viewport::clearPendingClipboard()
 {
-  delete [] pendingServerCutText;
+  strFree(pendingServerCutText);
   pendingServerCutText = NULL;
-  delete [] pendingClientCutText;
+  strFree(pendingClientCutText);
   pendingClientCutText = NULL;
 }