xref: /aosp_15_r20/external/fastrpc/src/std_SwapBytes.c (revision 418b791d679beb2078b579a3b6936cf330c41799)
1*418b791dSBob Badour /*
2*418b791dSBob Badour  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
3*418b791dSBob Badour  *
4*418b791dSBob Badour  * Redistribution and use in source and binary forms, with or without
5*418b791dSBob Badour  * modification, are permitted provided that the following conditions are
6*418b791dSBob Badour  * met:
7*418b791dSBob Badour  *    * Redistributions of source code must retain the above copyright
8*418b791dSBob Badour  *      notice, this list of conditions and the following disclaimer.
9*418b791dSBob Badour  *    * Redistributions in binary form must reproduce the above
10*418b791dSBob Badour  *      copyright notice, this list of conditions and the following
11*418b791dSBob Badour  *      disclaimer in the documentation and/or other materials provided
12*418b791dSBob Badour  *      with the distribution.
13*418b791dSBob Badour  *    * Neither the name of The Linux Foundation nor the names of its
14*418b791dSBob Badour  *      contributors may be used to endorse or promote products derived
15*418b791dSBob Badour  *      from this software without specific prior written permission.
16*418b791dSBob Badour  *
17*418b791dSBob Badour  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18*418b791dSBob Badour  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*418b791dSBob Badour  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20*418b791dSBob Badour  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21*418b791dSBob Badour  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*418b791dSBob Badour  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*418b791dSBob Badour  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24*418b791dSBob Badour  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25*418b791dSBob Badour  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26*418b791dSBob Badour  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*418b791dSBob Badour  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*418b791dSBob Badour  */
29*418b791dSBob Badour #include "AEEstd.h"
30*418b791dSBob Badour #include "AEEsmath.h"
31*418b791dSBob Badour 
32*418b791dSBob Badour 
33*418b791dSBob Badour 
xMinSize(int a,int b)34*418b791dSBob Badour static int xMinSize(int a, int b)
35*418b791dSBob Badour {
36*418b791dSBob Badour    if (b < a) {
37*418b791dSBob Badour       a = b;
38*418b791dSBob Badour    }
39*418b791dSBob Badour    return (a >= 0 ? a : 0);
40*418b791dSBob Badour }
41*418b791dSBob Badour 
42*418b791dSBob Badour 
xMoveBytes(byte * pbDest,const byte * pbSrc,int cb)43*418b791dSBob Badour static void xMoveBytes(byte *pbDest, const byte *pbSrc, int cb)
44*418b791dSBob Badour {
45*418b791dSBob Badour    if (pbDest != pbSrc) {
46*418b791dSBob Badour       (void) std_memmove(pbDest, pbSrc, cb);
47*418b791dSBob Badour    }
48*418b791dSBob Badour }
49*418b791dSBob Badour 
50*418b791dSBob Badour 
51*418b791dSBob Badour #ifdef AEE_BIGENDIAN
52*418b791dSBob Badour #  define STD_COPY       std_CopyBE
53*418b791dSBob Badour #  define STD_COPY_SWAP  std_CopyLE
54*418b791dSBob Badour #else
55*418b791dSBob Badour #  define STD_COPY       std_CopyLE
56*418b791dSBob Badour #  define STD_COPY_SWAP  std_CopyBE
57*418b791dSBob Badour #endif
58*418b791dSBob Badour 
59*418b791dSBob Badour 
60*418b791dSBob Badour // See std_CopyLE/BE for documentation.  This function implements the case
61*418b791dSBob Badour // where host ordering != target byte ordering.
62*418b791dSBob Badour //
STD_COPY_SWAP(void * pvDest,int nDestSize,const void * pvSrc,int nSrcSize,const char * pszFields)63*418b791dSBob Badour int STD_COPY_SWAP(void *      pvDest, int nDestSize,
64*418b791dSBob Badour                   const void *pvSrc,  int nSrcSize,
65*418b791dSBob Badour                   const char *pszFields)
66*418b791dSBob Badour {
67*418b791dSBob Badour    byte* pbDest = (byte*)pvDest;
68*418b791dSBob Badour    byte* pbSrc  = (byte*)pvSrc;
69*418b791dSBob Badour    int cbCopied = xMinSize(nDestSize, nSrcSize);
70*418b791dSBob Badour    const char * pszNextField;
71*418b791dSBob Badour    int cb, nSize;
72*418b791dSBob Badour 
73*418b791dSBob Badour    nSize = 0;  // avoid warning when using RVCT2.2 with -O1
74*418b791dSBob Badour 
75*418b791dSBob Badour    pszNextField = pszFields;
76*418b791dSBob Badour 
77*418b791dSBob Badour    for (cb = cbCopied; cb > 0; cb -= nSize) {
78*418b791dSBob Badour       char  ch;
79*418b791dSBob Badour 
80*418b791dSBob Badour       ch = *pszNextField++;
81*418b791dSBob Badour       if ('\0' == ch) {
82*418b791dSBob Badour          ch = *pszFields;
83*418b791dSBob Badour          pszNextField = pszFields+1;
84*418b791dSBob Badour       }
85*418b791dSBob Badour 
86*418b791dSBob Badour       if (ch == 'S') {
87*418b791dSBob Badour 
88*418b791dSBob Badour          // S = 2 bytes
89*418b791dSBob Badour 
90*418b791dSBob Badour          nSize = 2;
91*418b791dSBob Badour          if (cb < nSize) {
92*418b791dSBob Badour             break;
93*418b791dSBob Badour          } else {
94*418b791dSBob Badour             byte by   = pbSrc[0];
95*418b791dSBob Badour             pbDest[0] = pbSrc[1];
96*418b791dSBob Badour             pbDest[1] = by;
97*418b791dSBob Badour          }
98*418b791dSBob Badour       } else if (ch == 'L') {
99*418b791dSBob Badour 
100*418b791dSBob Badour          // L = 4 bytes
101*418b791dSBob Badour 
102*418b791dSBob Badour          nSize = 4;
103*418b791dSBob Badour          if (cb < nSize) {
104*418b791dSBob Badour             break;
105*418b791dSBob Badour          } else {
106*418b791dSBob Badour             byte by   = pbSrc[0];
107*418b791dSBob Badour             pbDest[0] = pbSrc[3];
108*418b791dSBob Badour             pbDest[3] = by;
109*418b791dSBob Badour             by        = pbSrc[1];
110*418b791dSBob Badour             pbDest[1] = pbSrc[2];
111*418b791dSBob Badour             pbDest[2] = by;
112*418b791dSBob Badour          }
113*418b791dSBob Badour       } else if (ch == 'Q') {
114*418b791dSBob Badour 
115*418b791dSBob Badour          // Q = 8 bytes
116*418b791dSBob Badour 
117*418b791dSBob Badour          nSize = 8;
118*418b791dSBob Badour          if (cb < nSize) {
119*418b791dSBob Badour             break;
120*418b791dSBob Badour          } else {
121*418b791dSBob Badour             byte by   = pbSrc[0];
122*418b791dSBob Badour             pbDest[0] = pbSrc[7];
123*418b791dSBob Badour             pbDest[7] = by;
124*418b791dSBob Badour             by        = pbSrc[1];
125*418b791dSBob Badour             pbDest[1] = pbSrc[6];
126*418b791dSBob Badour             pbDest[6] = by;
127*418b791dSBob Badour             by        = pbSrc[2];
128*418b791dSBob Badour             pbDest[2] = pbSrc[5];
129*418b791dSBob Badour             pbDest[5] = by;
130*418b791dSBob Badour             by        = pbSrc[3];
131*418b791dSBob Badour             pbDest[3] = pbSrc[4];
132*418b791dSBob Badour             pbDest[4] = by;
133*418b791dSBob Badour          }
134*418b791dSBob Badour       } else {
135*418b791dSBob Badour 
136*418b791dSBob Badour          // None of the above => read decimal and copy without swap
137*418b791dSBob Badour 
138*418b791dSBob Badour          if (ch >= '0' && ch <= '9') {
139*418b791dSBob Badour             nSize = (int) (ch - '0');
140*418b791dSBob Badour             while ( (ch = *pszNextField) >= '0' && ch <= '9') {
141*418b791dSBob Badour                nSize = nSize*10 + (int)(ch - '0');
142*418b791dSBob Badour                ++pszNextField;
143*418b791dSBob Badour             }
144*418b791dSBob Badour             // Check bounds & ensure progress
145*418b791dSBob Badour             if (nSize > cb || nSize <= 0) {
146*418b791dSBob Badour                nSize = cb;
147*418b791dSBob Badour             }
148*418b791dSBob Badour          } else {
149*418b791dSBob Badour             // Unexpected character: copy rest of data
150*418b791dSBob Badour             nSize = cb;
151*418b791dSBob Badour          }
152*418b791dSBob Badour 
153*418b791dSBob Badour          xMoveBytes(pbDest, pbSrc, nSize);
154*418b791dSBob Badour       }
155*418b791dSBob Badour 
156*418b791dSBob Badour       pbDest += nSize;
157*418b791dSBob Badour       pbSrc += nSize;
158*418b791dSBob Badour    }
159*418b791dSBob Badour 
160*418b791dSBob Badour    if (cb > 0) {
161*418b791dSBob Badour 
162*418b791dSBob Badour       // Swap could not be completed:  0 < cb < nSize <= 8
163*418b791dSBob Badour 
164*418b791dSBob Badour       byte byBuf[8];
165*418b791dSBob Badour 
166*418b791dSBob Badour       // If entire value is available in source, use swapped version
167*418b791dSBob Badour       if (nSrcSize - (pbSrc - (byte*)pvSrc) >= nSize) {
168*418b791dSBob Badour          int i;
169*418b791dSBob Badour          for (i=0; i<cb; ++i) {
170*418b791dSBob Badour             byBuf[i] = pbSrc[nSize-1-i];
171*418b791dSBob Badour          }
172*418b791dSBob Badour          pbSrc = byBuf;
173*418b791dSBob Badour       }
174*418b791dSBob Badour       std_memmove(pbDest, pbSrc, cb);
175*418b791dSBob Badour    }
176*418b791dSBob Badour 
177*418b791dSBob Badour    return cbCopied;
178*418b791dSBob Badour }
179*418b791dSBob Badour 
180*418b791dSBob Badour 
181*418b791dSBob Badour // See std_CopyLE/BE for documentation.  This function implements the case
182*418b791dSBob Badour // where host ordering == target byte ordering.
183*418b791dSBob Badour //
STD_COPY(void * pvDest,int nDestSize,const void * pvSrc,int nSrcSize,const char * pszFields)184*418b791dSBob Badour int STD_COPY(void *pvDest, int nDestSize,
185*418b791dSBob Badour              const void *pvSrc,  int nSrcSize,
186*418b791dSBob Badour              const char *pszFields)
187*418b791dSBob Badour {
188*418b791dSBob Badour    int cb = xMinSize(nDestSize, nSrcSize);
189*418b791dSBob Badour    (void)pszFields;
190*418b791dSBob Badour    xMoveBytes(pvDest, pvSrc, cb);
191*418b791dSBob Badour    return cb;
192*418b791dSBob Badour }
193*418b791dSBob Badour 
194*418b791dSBob Badour 
195