1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24  * Glenn Fowler
25  * AT&T Research
26  *
27  * internal representation conversion support
28  */
29 
30 #include <ast.h>
31 #include <swap.h>
32 
33 /*
34  * return the swap operation for external to internal conversion
35  * if size<0 then (-size) used and (-size==4)&&(op==3) => op=7
36  * this is a workaround for 4 byte magic predicting 8 byte swap
37  */
38 
39 int
swapop(const void * internal,const void * external,int size)40 swapop(const void* internal, const void* external, int size)
41 {
42 	register int	op;
43 	register int	z;
44 	char		tmp[sizeof(intmax_t)];
45 
46 	if ((z = size) < 0)
47 		z = -z;
48 	if (z <= 1)
49 		return 0;
50 	if (z <= sizeof(intmax_t))
51 		for (op = 0; op < z; op++)
52 			if (!memcmp(internal, swapmem(op, external, tmp, z), z))
53 			{
54 				if (size < 0 && z == 4 && op == 3)
55 					op = 7;
56 				return op;
57 			}
58 	return -1;
59 }
60