1/* 2 *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved. 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 *"Software"), to deal in the Software without restriction, including 7 *without limitation the rights to use, copy, modify, merge, publish, 8 *distribute, sublicense, and/or sell copies of the Software, and to 9 *permit persons to whom the Software is furnished to do so, subject to 10 *the following conditions: 11 * 12 *The above copyright notice and this permission notice shall be 13 *included in all copies or substantial portions of the Software. 14 * 15 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR 19 *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 20 *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 * 23 *Except as contained in this notice, the name of Harold L Hunt II 24 *shall not be used in advertising or otherwise to promote the sale, use 25 *or other dealings in this Software without prior written authorization 26 *from Harold L Hunt II. 27 * 28 * Authors: Harold L Hunt II 29 */ 30 31#ifdef HAVE_XWIN_CONFIG_H 32#include <xwin-config.h> 33#endif 34#include "win.h" 35#include <stdio.h> 36#include <stdlib.h> 37 38void 39winClipboardDOStoUNIX (char *pszSrc, int iLength); 40void 41winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength); 42 43/* 44 * Convert \r\n to \n 45 * 46 * NOTE: This was heavily inspired by, Cygwin's 47 * winsup/cygwin/fhandler.cc/fhandler_base::read () 48 */ 49 50void 51winClipboardDOStoUNIX (char *pszSrc, int iLength) 52{ 53 char *pszDest = pszSrc; 54 char *pszEnd = pszSrc + iLength; 55 56 /* Loop until the last character */ 57 while (pszSrc < pszEnd) 58 { 59 /* Copy the current source character to current destination character */ 60 *pszDest = *pszSrc; 61 62 /* Advance to the next source character */ 63 pszSrc++; 64 65 /* Don't advance the destination character if we need to drop an \r */ 66 if (*pszDest != '\r' || *pszSrc != '\n') 67 pszDest++; 68 } 69 70 /* Move the terminating null */ 71 *pszDest = '\0'; 72} 73 74 75/* 76 * Convert \n to \r\n 77 */ 78 79void 80winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength) 81{ 82 int iNewlineCount = 0; 83 unsigned char *pszSrc = *ppszData; 84 unsigned char *pszEnd = pszSrc + iLength; 85 unsigned char *pszDest = NULL, *pszDestBegin = NULL; 86 87 winDebug("UNIXtoDOS () - Original data:'%s'\n", *ppszData); 88 89 /* Count \n characters without leading \r */ 90 while (pszSrc < pszEnd) 91 { 92 /* Skip ahead two character if found set of \r\n */ 93 if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n') 94 { 95 pszSrc += 2; 96 continue; 97 } 98 99 /* Increment the count if found naked \n */ 100 if (*pszSrc == '\n') 101 { 102 iNewlineCount++; 103 } 104 105 pszSrc++; 106 } 107 108 /* Return if no naked \n's */ 109 if (iNewlineCount == 0) 110 return; 111 112 /* Allocate a new string */ 113 pszDestBegin = pszDest = malloc (iLength + iNewlineCount + 1); 114 115 /* Set source pointer to beginning of data string */ 116 pszSrc = *ppszData; 117 118 /* Loop through all characters in source string */ 119 while (pszSrc < pszEnd) 120 { 121 /* Copy line endings that are already valid */ 122 if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n') 123 { 124 *pszDest = *pszSrc; 125 *(pszDest + 1) = *(pszSrc + 1); 126 pszDest += 2; 127 pszSrc += 2; 128 continue; 129 } 130 131 /* Add \r to naked \n's */ 132 if (*pszSrc == '\n') 133 { 134 *pszDest = '\r'; 135 *(pszDest + 1) = *pszSrc; 136 pszDest += 2; 137 pszSrc += 1; 138 continue; 139 } 140 141 /* Copy normal characters */ 142 *pszDest = *pszSrc; 143 pszSrc++; 144 pszDest++; 145 } 146 147 /* Put terminating null at end of new string */ 148 *pszDest = '\0'; 149 150 /* Swap string pointers */ 151 free (*ppszData); 152 *ppszData = pszDestBegin; 153 154 winDebug("UNIXtoDOS () - Final string:'%s'\n", pszDestBegin); 155} 156