Back to index

lightning-sunbird  0.9+nobinonly
a2w.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
00002  *
00003  * ***** BEGIN LICENSE BLOCK *****
00004  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00005  *
00006  * The contents of this file are subject to the Mozilla Public License Version
00007  * 1.1 (the "License"); you may not use this file except in compliance with
00008  * the License. You may obtain a copy of the License at
00009  * http://www.mozilla.org/MPL/
00010  *
00011  * Software distributed under the License is distributed on an "AS IS" basis,
00012  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013  * for the specific language governing rights and limitations under the
00014  * License.
00015  *
00016  * The Original Code is mozilla.org code, released
00017  * Jan 28, 2003.
00018  *
00019  * The Initial Developer of the Original Code is
00020  * Netscape Communications Corporation.
00021  * Portions created by the Initial Developer are Copyright (C) 2003
00022  * the Initial Developer. All Rights Reserved.
00023  *
00024  * Contributor(s):
00025  *   Garrett Arch Blythe, 28-January-2003
00026  *
00027  * Alternatively, the contents of this file may be used under the terms of
00028  * either the GNU General Public License Version 2 or later (the "GPL"), or
00029  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00030  * in which case the provisions of the GPL or the LGPL are applicable instead
00031  * of those above. If you wish to allow use of your version of this file only
00032  * under the terms of either the GPL or the LGPL, and not to allow others to
00033  * use your version of this file under the terms of the MPL, indicate your
00034  * decision by deleting the provisions above and replace them with the notice
00035  * and other provisions required by the GPL or the LGPL. If you do not delete
00036  * the provisions above, a recipient may use your version of this file under
00037  * the terms of any one of the MPL, the GPL or the LGPL.
00038  *
00039  * ***** END LICENSE BLOCK ***** */
00040 
00041 #include "mozce_internal.h"
00042 
00043 int a2w_buffer(const char* inACPString, int inACPChars, unsigned short* outWideString, int inWideChars)
00044 {
00045     int retval = 0;
00046     
00047     /*
00048     **  Start off by terminating the out argument if appropriate.
00049     */
00050     if(NULL != outWideString && 0 != inWideChars)
00051     {
00052         *outWideString = L'\0';
00053     }
00054     
00055     /*
00056     **  Sanity check arguments.
00057     */
00058     if(NULL != inACPString && 0 != inACPChars && (0 == inWideChars || NULL != outWideString))
00059     {
00060         /*
00061         **  Attempt the conversion.
00062         */
00063         retval = MultiByteToWideChar(
00064                                      CP_ACP,
00065                                      0,
00066                                      inACPString,
00067                                      inACPChars,
00068                                      outWideString,
00069                                      inWideChars
00070                                      );
00071     }
00072     
00073     return retval;
00074 }
00075 
00076 
00077 unsigned short* a2w_malloc(const char* inACPString, int inACPChars, int* outWideChars)
00078 {
00079     LPWSTR retval = NULL;
00080     
00081     /*
00082     **  Initialize any out arguments.
00083     */
00084     if(NULL != outWideChars)
00085     {
00086         *outWideChars = 0;
00087     }
00088     
00089     /*
00090     **  Initialize the acp char length if requested.
00091     **  We do this here to avoid doing it twice in calls to a2w_buffer.
00092     */
00093     if(-1 == inACPChars)
00094     {
00095         if(NULL != inACPString)
00096         {
00097             /*
00098             **  Plus one so the terminating character is included.
00099             */
00100             inACPChars = (int)strlen(inACPString) + 1;
00101         }
00102         else
00103         {
00104             inACPChars = 0;
00105         }
00106     }
00107     
00108     /*
00109     **  Sanity check arguments.
00110     */
00111     if(NULL != inACPString && 0 != inACPChars)
00112     {
00113         int charsRequired = 0;
00114         
00115         /*
00116         **  Determine the size of buffer required for the conversion.
00117         */
00118         charsRequired = a2w_buffer(inACPString, inACPChars, NULL, 0);
00119         if(0 != charsRequired)
00120         {
00121             LPWSTR heapBuffer = NULL;
00122             
00123             heapBuffer = (LPWSTR)malloc((size_t)charsRequired * sizeof(WCHAR));
00124             if(NULL != heapBuffer)
00125             {
00126                 int wideChars = 0;
00127                 
00128                 /*
00129                 **  Real thing this time.
00130                 */
00131                 wideChars = a2w_buffer(inACPString, inACPChars, heapBuffer, charsRequired);
00132                 if(0 != wideChars)
00133                 {
00134                     retval = heapBuffer;
00135                     if(NULL != outWideChars)
00136                     {
00137                         *outWideChars = wideChars;
00138                     }
00139                 }
00140                 else
00141                 {
00142                     /*
00143                     **  Something wrong.
00144                     **  Clean up.
00145                     */
00146                     free(heapBuffer);
00147                 }
00148             }
00149         }
00150     }
00151     
00152     return retval;
00153 }