| /* |
| * Copyright © 2006 Keith Packard |
| * Copyright © 2005 Patrick Lam |
| * |
| * Permission to use, copy, modify, distribute, and sell this software and its |
| * documentation for any purpose is hereby granted without fee, provided that |
| * the above copyright notice appear in all copies and that both that copyright |
| * notice and this permission notice appear in supporting documentation, and |
| * that the name of the copyright holders not be used in advertising or |
| * publicity pertaining to distribution of the software without specific, |
| * written prior permission. The copyright holders make no representations |
| * about the suitability of this software for any purpose. It is provided "as |
| * is" without express or implied warranty. |
| * |
| * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
| * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
| * OF THIS SOFTWARE. |
| */ |
| |
| #include "fcint.h" |
| #include <ctype.h> |
| |
| #define ENDIAN_TEST 0x12345678 |
| #define MACHINE_SIGNATURE_SIZE (9*21 + 1) |
| |
| static char * |
| FcCacheMachineSignature (void) |
| { |
| static char buf[MACHINE_SIGNATURE_SIZE]; |
| int32_t magic = ENDIAN_TEST; |
| char * m = (char *)&magic; |
| |
| sprintf (buf, "%2x%2x%2x%2x_" |
| "%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_" |
| "%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x", |
| m[0], m[1], m[2], m[3], |
| (unsigned int)sizeof (char), |
| (unsigned int)sizeof (char *), |
| (unsigned int)sizeof (int), |
| (unsigned int)sizeof (intptr_t), |
| (unsigned int)sizeof (FcPattern), |
| (unsigned int)sizeof (FcPatternEltPtr), |
| (unsigned int)sizeof (struct FcPatternElt *), |
| (unsigned int)sizeof (FcPatternElt), |
| (unsigned int)sizeof (FcObject), |
| (unsigned int)sizeof (FcValueListPtr), |
| (unsigned int)sizeof (FcValue), |
| (unsigned int)sizeof (FcValueBinding), |
| (unsigned int)sizeof (struct FcValueList *), |
| (unsigned int)sizeof (FcCharSet), |
| (unsigned int)sizeof (FcCharLeaf **), |
| (unsigned int)sizeof (FcChar16 *), |
| (unsigned int)sizeof (FcChar16), |
| (unsigned int)sizeof (FcCharLeaf), |
| (unsigned int)sizeof (FcChar32), |
| (unsigned int)sizeof (FcCache)); |
| |
| return buf; |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| static char line[1024]; |
| char *signature; |
| int signature_length; |
| char *space; |
| char *arch = NULL; |
| int lineno = 0; |
| |
| if (argc != 2) |
| fprintf (stderr, "Usage: %s <architecture>|auto < fcarch.tmpl.h > fcarch.h\n", |
| argv[0]); |
| arch = argv[1]; |
| /* |
| * Scan the input until the marker is found |
| */ |
| |
| while (fgets (line, sizeof (line), stdin)) |
| { |
| lineno++; |
| if (!strncmp (line, "@@@", 3)) |
| break; |
| fputs (line, stdout); |
| } |
| signature = FcCacheMachineSignature(); |
| signature_length = strlen (signature); |
| |
| if (strcmp (arch, "auto") == 0) |
| { |
| arch = NULL; |
| /* |
| * Search for signature |
| */ |
| while (fgets (line, sizeof (line), stdin)) |
| { |
| lineno++; |
| /* |
| * skip comments |
| */ |
| if (!strncmp (line, "@@@", 3)) |
| continue; |
| space = line; |
| while (*space && !isspace (*space)) |
| space++; |
| if (!space) |
| { |
| fprintf (stderr, "%s: malformed input on line %d\n", |
| argv[0], lineno); |
| exit (1); |
| } |
| *space++ = '\0'; |
| while (isspace (*space)) |
| space++; |
| if (!strncmp (space, signature, signature_length)) |
| { |
| arch = line; |
| break; |
| } |
| } |
| } |
| if (!arch) |
| { |
| fprintf (stderr, "%s: unknown signature \"%s\"\n", argv[0], signature); |
| fprintf (stderr, "\tPlease update fcarch.tmpl.h and rebuild\n"); |
| exit (1); |
| } |
| printf ("#define FC_ARCHITECTURE \"%s\"\n", arch); |
| fflush (stdout); |
| exit (ferror (stdout)); |
| } |
| |