1/* Return machine flag names.
2   Copyright (C) 2001, 2002 Red Hat, Inc.
3   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
4
5   This program is Open Source software; you can redistribute it and/or
6   modify it under the terms of the Open Software License version 1.0 as
7   published by the Open Source Initiative.
8
9   You should have received a copy of the Open Software License along
10   with this program; if not, you may obtain a copy of the Open Software
11   License version 1.0 from http://www.opensource.org/licenses/osl.php or
12   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13   3001 King Ranch Road, Ukiah, CA 95482.   */
14
15#ifdef HAVE_CONFIG_H
16# include <config.h>
17#endif
18
19#include <stdio.h>
20#include <string.h>
21#include <libeblP.h>
22
23
24const char *
25ebl_machine_flag_name (ebl, flags, buf, len)
26     Ebl *ebl;
27     Elf64_Word flags;
28     char *buf;
29     size_t len;
30{
31  const char *res;
32
33  if (flags == 0)
34    res = "";
35  else
36    {
37      char *cp = buf;
38      int first = 1;
39      const char *machstr;
40      size_t machstrlen;
41
42      do
43	{
44	  if (! first)
45	    {
46	      if (cp + 1 >= buf + len)
47		break;
48	      *cp++ = ',';
49	    }
50
51	  machstr = ebl != NULL ? ebl->machine_flag_name (&flags) : NULL;
52	  if (machstr == NULL)
53	    {
54	      /* No more known flag.  */
55	      snprintf (cp, buf + len - cp, "%#x", flags);
56	      break;
57	    }
58
59	  machstrlen = strlen (machstr) + 1;
60	  if ((size_t) (buf + len - cp) < machstrlen)
61	    {
62	      *((char *) mempcpy (cp, machstr, buf + len - cp - 1)) = '\0';
63	      break;
64	    }
65
66	  cp = mempcpy (cp, machstr, machstrlen);
67
68	  first = 0;
69	}
70      while (flags != 0);
71
72      res = buf;
73    }
74
75  return res;
76}
77