1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
Author: Michael Cree <mcree@orcon.net.nz>
Description: fix alignment issues when casting chars to shorts
On alpha, we want our unsigned shorts to be 16-bit aligned; when casting
from a char * to an unsigned short *, this is not guaranteed, as the char *
may be only 8-bit aligned. So make the appropriate alignment fix-ups in
the relevant functions, fixing a FTBFS on alpha.
Bug-Debian: http://bugs.debian.org/644473
--- a/src/cmsnamed.c
+++ b/src/cmsnamed.c
@@ -185,8 +185,19 @@
cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1;
wchar_t* WStr;
cmsBool rc;
- cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
- cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+ union {
+ cmsUInt16Number uint16;
+ char str[2];
+ } code_convert;
+ cmsUInt16Number Lang;
+ cmsUInt16Number Cntry;
+
+ code_convert.str[0] = LanguageCode[0];
+ code_convert.str[1] = LanguageCode[1];
+ Lang = _cmsAdjustEndianess16(code_convert.uint16);
+ code_convert.str[0] = CountryCode[0];
+ code_convert.str[1] = CountryCode[1];
+ Cntry = _cmsAdjustEndianess16(code_convert.uint16);
if (mlu == NULL) return FALSE;
@@ -220,9 +231,20 @@
// Add a wide entry
cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)
{
- cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) Language);
- cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) Country);
cmsUInt32Number len;
+ union {
+ cmsUInt16Number uint16;
+ char str[2];
+ } code_convert;
+ cmsUInt16Number Lang;
+ cmsUInt16Number Cntry;
+
+ code_convert.str[0] = Language[0];
+ code_convert.str[1] = Language[1];
+ Lang = _cmsAdjustEndianess16(code_convert.uint16);
+ code_convert.str[0] = Country[0];
+ code_convert.str[1] = Country[1];
+ Cntry = _cmsAdjustEndianess16(code_convert.uint16);
if (mlu == NULL) return FALSE;
if (WideString == NULL) return FALSE;
@@ -350,8 +372,19 @@
cmsUInt32Number StrLen = 0;
cmsUInt32Number ASCIIlen, i;
- cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
- cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+ union {
+ cmsUInt16Number uint16;
+ char str[2];
+ } code_convert;
+ cmsUInt16Number Lang;
+ cmsUInt16Number Cntry;
+
+ code_convert.str[0] = LanguageCode[0];
+ code_convert.str[1] = LanguageCode[1];
+ Lang = _cmsAdjustEndianess16(code_convert.uint16);
+ code_convert.str[0] = CountryCode[0];
+ code_convert.str[1] = CountryCode[1];
+ Cntry = _cmsAdjustEndianess16(code_convert.uint16);
// Sanitize
if (mlu == NULL) return 0;
@@ -394,8 +427,19 @@
const wchar_t *Wide;
cmsUInt32Number StrLen = 0;
- cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
- cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+ union {
+ cmsUInt16Number uint16;
+ char str[2];
+ } code_convert;
+ cmsUInt16Number Lang;
+ cmsUInt16Number Cntry;
+
+ code_convert.str[0] = LanguageCode[0];
+ code_convert.str[1] = LanguageCode[1];
+ Lang = _cmsAdjustEndianess16(code_convert.uint16);
+ code_convert.str[0] = CountryCode[0];
+ code_convert.str[1] = CountryCode[1];
+ Cntry = _cmsAdjustEndianess16(code_convert.uint16);
// Sanitize
if (mlu == NULL) return 0;
@@ -426,10 +470,19 @@
char ObtainedLanguage[3], char ObtainedCountry[3])
{
const wchar_t *Wide;
+ cmsUInt16Number ObtLang, ObtCode;
- cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
- cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
- cmsUInt16Number ObtLang, ObtCode;
+ union {
+ cmsUInt16Number uint16;
+ char str[3];
+ } code_convert;
+ cmsUInt16Number Lang;
+ cmsUInt16Number Cntry;
+
+ strcpy(code_convert.str, LanguageCode);
+ Lang = _cmsAdjustEndianess16(code_convert.uint16);
+ strcpy(code_convert.str, CountryCode);
+ Cntry = _cmsAdjustEndianess16(code_convert.uint16);
// Sanitize
if (mlu == NULL) return FALSE;
|