Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / features / align.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: align.c /main/2 1996/05/08 19:41:16 drk $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 union _u_
94 {
95         long            u1;
96         char*           u2;
97         double          u3;
98         char            u4[1024];
99 };
100
101 struct _s_
102 {
103         char            s1;
104         union _u_       s2;
105 };
106
107 #define roundof(x,y)    (((x)+((y)-1))&~((y)-1))
108
109 extern __MANGLE__ int           printf __PROTO__((const char*, ...));
110
111 main()
112 {
113         register int    i;
114         register int    j;
115         register int    k;
116
117         int             align0;
118         int             align1;
119         int             align2;
120         unsigned long   bit1;
121         unsigned long   bit2;
122         unsigned long   bits0;
123         unsigned long   bits1;
124         unsigned long   bits2;
125         union _u_       u;
126         union _u_       v;
127
128         u.u2 = u.u4;
129         v.u2 = u.u2 + 1;
130         bit1 = u.u1 ^ v.u1;
131         v.u2 = u.u2 + 2;
132         bit2 = u.u1 ^ v.u1;
133         align0 = sizeof(struct _s_) - sizeof(union _u_);
134         bits0 = 0;
135         k = 0;
136         for (j = 0; j < align0; j++)
137         {
138                 u.u2 = u.u4 + j;
139                 bits1 = 0;
140                 for (i = 0; i < align0; i++)
141                 {
142                         v.u2 = u.u2 + i;
143                         bits1 |= u.u1 ^ v.u1;
144                 }
145                 if (!bits0 || bits1 < bits0)
146                 {
147                         bits0 = bits1;
148                         k = j;
149                 }
150         }
151         align1 = roundof(align0, 2);
152         u.u2 = u.u4 + k;
153         for (bits1 = bits0; i < align1; i++)
154         {
155                 v.u2 = u.u2 + i;
156                 bits1 |= u.u1 ^ v.u1;
157         }
158         align2 = roundof(align0, 4);
159         for (bits2 = bits1; i < align2; i++)
160         {
161                 v.u2 = u.u2 + i;
162                 bits2 |= u.u1 ^ v.u1;
163         }
164         printf("typedef unsigned %s ALIGN_INTEGRAL;\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
165         printf("\n");
166         printf("#define ALIGN_CHUNK             %d\n", sizeof(char*) >= 4 ? 8192 : 1024);
167         printf("#define ALIGN_INTEGRAL          %s\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
168         printf("#define ALIGN_INTEGER(x)        ((ALIGN_INTEGRAL)(x))\n");
169         printf("#define ALIGN_POINTER(x)        ((char*)(x))\n");
170         if (bits2 == (align2 - 1)) printf("#define ALIGN_ROUND(x,y)     ALIGN_POINTER(ALIGN_INTEGER((x)+(y)-1)&~((y)-1))\n");
171         else printf("#define ALIGN_ROUND(x,y)   ALIGN_POINTER(ALIGN_INTEGER(ALIGN_ALIGN(x)+(((y)+%d)/%d)-1)&~((((y)+%d)/%d)-1))\n", align0, align0, align0, align0);
172         printf("\n");
173         if (align0 == align2)
174         {
175                 printf("#define ALIGN_BOUND             ALIGN_BOUND2\n");
176                 printf("#define ALIGN_ALIGN(x)          ALIGN_ALIGN2(x)\n");
177                 printf("#define ALIGN_TRUNC(x)          ALIGN_TRUNC2(x)\n");
178         }
179         else if (align0 == align1)
180         {
181                 printf("#define ALIGN_BOUND             ALIGN_BOUND1\n");
182                 printf("#define ALIGN_ALIGN(x)          ALIGN_ALIGN1(x)\n");
183                 printf("#define ALIGN_TRUNC(x)          ALIGN_TRUNC1(x)\n");
184         }
185         else
186         {
187                 printf("#define ALIGN_BOUND             1\n");
188                 printf("#define ALIGN_ALIGN(x)          ALIGN_POINTER(x)\n");
189                 printf("#define ALIGN_TRUNC(x)          ALIGN_POINTER(x)\n");
190         }
191         printf("\n");
192         printf("#define ALIGN_BIT1              0x%lx\n", bit1);
193         if (align1 == align2)
194         {
195                 printf("#define ALIGN_BOUND1            ALIGN_BOUND2\n");
196                 printf("#define ALIGN_ALIGN1(x)         ALIGN_ALIGN2(x)\n");
197                 printf("#define ALIGN_TRUNC1(x)         ALIGN_TRUNC2(x)\n");
198         }
199         else
200         {
201                 printf("#define ALIGN_BOUND1            %d\n", align1);
202                 printf("#define ALIGN_ALIGN1(x)         ALIGN_TRUNC1((x)+%d)\n", align1 - 1);
203                 printf("#define ALIGN_TRUNC1(x)         ALIGN_POINTER(ALIGN_INTEGER((x)+%d)&0x%lx)\n", align1 - 1, ~(bits0|bits1));
204         }
205         printf("#define ALIGN_CLRBIT1(x)        ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit1);
206         printf("#define ALIGN_SETBIT1(x)        ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit1);
207         printf("#define ALIGN_TSTBIT1(x)        ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit1);
208         printf("\n");
209         printf("#define ALIGN_BIT2              0x%lx\n", bit2);
210         printf("#define ALIGN_BOUND2            %d\n", align2);
211         printf("#define ALIGN_ALIGN2(x)         ALIGN_TRUNC2((x)+%d)\n", align2 - 1);
212         printf("#define ALIGN_TRUNC2(x)         ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~(bits0|bits1|bits2));
213         printf("#define ALIGN_CLRBIT2(x)        ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit2);
214         printf("#define ALIGN_SETBIT2(x)        ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit2);
215         printf("#define ALIGN_TSTBIT2(x)        ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit2);
216         printf("\n");
217         return(0);
218 }