Branch data Line data Source code
1 : : /* Add string to a section.
2 : : Copyright (C) 2002 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : : Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5 : :
6 : : This file is free software; you can redistribute it and/or modify
7 : : it under the terms of either
8 : :
9 : : * the GNU Lesser General Public License as published by the Free
10 : : Software Foundation; either version 3 of the License, or (at
11 : : your option) any later version
12 : :
13 : : or
14 : :
15 : : * the GNU General Public License as published by the Free
16 : : Software Foundation; either version 2 of the License, or (at
17 : : your option) any later version
18 : :
19 : : or both in parallel, as here.
20 : :
21 : : elfutils is distributed in the hope that it will be useful, but
22 : : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : : General Public License for more details.
25 : :
26 : : You should have received copies of the GNU General Public License and
27 : : the GNU Lesser General Public License along with this program. If
28 : : not, see <http://www.gnu.org/licenses/>. */
29 : :
30 : : #ifdef HAVE_CONFIG_H
31 : : # include <config.h>
32 : : #endif
33 : :
34 : : #include <ctype.h>
35 : : #include <stdio.h>
36 : : #include <string.h>
37 : :
38 : : #include <libasmP.h>
39 : :
40 : :
41 : : /* Add zero terminated string STR of size LEN to (sub)section ASMSCN. */
42 : : int
43 : 6 : asm_addstrz (asmscn, str, len)
44 : : AsmScn_t *asmscn;
45 : : const char *str;
46 : : size_t len;
47 : : {
48 [ + - ]: 6 : if (asmscn == NULL)
49 : : return -1;
50 : :
51 [ - + ]: 6 : if (unlikely (asmscn->type == SHT_NOBITS))
52 : : {
53 [ # # ]: 0 : if (len == 0)
54 : : {
55 [ # # ]: 0 : if (str[0] != '\0')
56 : : {
57 : 0 : __libasm_seterrno (ASM_E_TYPE);
58 : 0 : return -1;
59 : : }
60 : : }
61 : : else
62 : : {
63 : : size_t cnt;
64 : :
65 [ # # ]: 0 : for (cnt = 0; cnt < len; ++cnt)
66 [ # # ]: 0 : if (str[cnt] != '\0')
67 : : {
68 : 0 : __libasm_seterrno (ASM_E_TYPE);
69 : 0 : return -1;
70 : : }
71 : : }
72 : : }
73 : :
74 [ + + ]: 6 : if (len == 0)
75 : 2 : len = strlen (str) + 1;
76 : :
77 [ - + ]: 6 : if (unlikely (asmscn->ctx->textp))
78 : : {
79 : : bool nextline = true;
80 : :
81 : : do
82 : : {
83 [ # # ]: 0 : if (nextline)
84 : : {
85 : 0 : fputs ("\t.string\t\"", asmscn->ctx->out.file);
86 : 0 : nextline = false;
87 : : }
88 : :
89 [ # # ]: 0 : if (*str == '\0')
90 : 0 : fputs ("\\000", asmscn->ctx->out.file);
91 [ # # ]: 0 : else if (! isascii (*str))
92 : 0 : fprintf (asmscn->ctx->out.file, "\\%03o",
93 : : (unsigned int) *((unsigned char *)str));
94 [ # # ]: 0 : else if (*str == '\\')
95 : 0 : fputs ("\\\\", asmscn->ctx->out.file);
96 [ # # ]: 0 : else if (*str == '\n')
97 : : {
98 : 0 : fputs ("\\n\"", asmscn->ctx->out.file);
99 : 0 : nextline = true;
100 : : }
101 : : else
102 : 0 : fputc (*str, asmscn->ctx->out.file);
103 : :
104 : 0 : ++str;
105 : : }
106 [ # # ][ # # ]: 0 : while (--len > 0 && (len > 1 || *str != '\0'));
[ # # ]
107 : :
108 [ # # ]: 0 : if (! nextline)
109 : 0 : fputs ("\"\n", asmscn->ctx->out.file);
110 : : }
111 : : else
112 : : {
113 : : /* Make sure there is enough room. */
114 [ + - ]: 6 : if (__libasm_ensure_section_space (asmscn, len) != 0)
115 : : return -1;
116 : :
117 : : /* Copy the string. */
118 : 6 : memcpy (&asmscn->content->data[asmscn->content->len], str, len);
119 : :
120 : : /* Adjust the pointer in the data buffer. */
121 : 6 : asmscn->content->len += len;
122 : :
123 : : /* Increment the offset in the (sub)section. */
124 : 6 : asmscn->offset += len;
125 : : }
126 : :
127 : : return 0;
128 : : }
|