1 /* Add string to a section.
2 Copyright (C) 2002 Red Hat, Inc.
3 Written by Ulrich Drepper <drepper@redhat.com>, 2002.
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 <ctype.h>
20 #include <stdio.h>
21 #include <string.h>
22
23 #include <libasmP.h>
24
25
26 /* Add zero terminated string STR of size LEN to (sub)section ASMSCN. */
27 int
asm_addstrz(asmscn,str,len)28 asm_addstrz (asmscn, str, len)
29 AsmScn_t *asmscn;
30 const char *str;
31 size_t len;
32 {
33 if (asmscn == NULL)
34 return -1;
35
36 if (unlikely (asmscn->type == SHT_NOBITS))
37 {
38 if (len == 0)
39 {
40 if (str[0] != '\0')
41 {
42 __libasm_seterrno (ASM_E_TYPE);
43 return -1;
44 }
45 }
46 else
47 {
48 size_t cnt;
49
50 for (cnt = 0; cnt < len; ++cnt)
51 if (str[cnt] != '\0')
52 {
53 __libasm_seterrno (ASM_E_TYPE);
54 return -1;
55 }
56 }
57 }
58
59 if (len == 0)
60 len = strlen (str) + 1;
61
62 if (unlikely (asmscn->ctx->textp))
63 {
64 bool nextline = true;
65
66 do
67 {
68 if (nextline)
69 {
70 fputs ("\t.string\t\"", asmscn->ctx->out.file);
71 nextline = false;
72 }
73
74 if (*str == '\0')
75 fputs ("\\000", asmscn->ctx->out.file);
76 else if (! isascii (*str))
77 fprintf (asmscn->ctx->out.file, "\\%03o",
78 (unsigned int) *((unsigned char *)str));
79 else if (*str == '\\')
80 fputs ("\\\\", asmscn->ctx->out.file);
81 else if (*str == '\n')
82 {
83 fputs ("\\n\"", asmscn->ctx->out.file);
84 nextline = true;
85 }
86 else
87 fputc (*str, asmscn->ctx->out.file);
88
89 ++str;
90 }
91 while (--len > 0 && (len > 1 || *str != '\0'));
92
93 if (! nextline)
94 fputs ("\"\n", asmscn->ctx->out.file);
95 }
96 else
97 {
98 /* Make sure there is enough room. */
99 if (__libasm_ensure_section_space (asmscn, len) != 0)
100 return -1;
101
102 /* Copy the string. */
103 memcpy (&asmscn->content->data[asmscn->content->len], str, len);
104
105 /* Adjust the pointer in the data buffer. */
106 asmscn->content->len += len;
107
108 /* Increment the offset in the (sub)section. */
109 asmscn->offset += len;
110 }
111
112 return 0;
113 }
114