145 lines
4.1 KiB
C
145 lines
4.1 KiB
C
/*
|
|
* 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)
|
|
#define MACHINE_ARCH_SIZE 32
|
|
/* for when we don't have sysconf: */
|
|
#define FC_HARDCODED_PAGESIZE 8192
|
|
|
|
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 (FcPattern),
|
|
(unsigned int)sizeof (FcPatternEltPtr),
|
|
(unsigned int)sizeof (struct FcPatternElt *),
|
|
(unsigned int)sizeof (FcPatternElt),
|
|
(unsigned int)sizeof (FcObjectPtr),
|
|
(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),
|
|
#if defined (HAVE_SYSCONF)
|
|
(unsigned int)sysconf(_SC_PAGESIZE)
|
|
#else
|
|
(unsigned int)FC_HARDCODED_PAGESIZE
|
|
#endif
|
|
);
|
|
|
|
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));
|
|
}
|
|
|