summaryrefslogtreecommitdiffstats
path: root/libasm/asm_addstrz.c
diff options
context:
space:
mode:
Diffstat (limited to 'libasm/asm_addstrz.c')
-rw-r--r--libasm/asm_addstrz.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/libasm/asm_addstrz.c b/libasm/asm_addstrz.c
new file mode 100644
index 00000000..e183b0b5
--- /dev/null
+++ b/libasm/asm_addstrz.c
@@ -0,0 +1,113 @@
+/* Add string to a section.
+ Copyright (C) 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <[email protected]>, 2002.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <libasmP.h>
+
+
+/* Add zero terminated string STR of size LEN to (sub)section ASMSCN. */
+int
+asm_addstrz (asmscn, str, len)
+ AsmScn_t *asmscn;
+ const char *str;
+ size_t len;
+{
+ if (asmscn == NULL)
+ return -1;
+
+ if (unlikely (asmscn->type == SHT_NOBITS))
+ {
+ if (len == 0)
+ {
+ if (str[0] != '\0')
+ {
+ __libasm_seterrno (ASM_E_TYPE);
+ return -1;
+ }
+ }
+ else
+ {
+ size_t cnt;
+
+ for (cnt = 0; cnt < len; ++cnt)
+ if (str[cnt] != '\0')
+ {
+ __libasm_seterrno (ASM_E_TYPE);
+ return -1;
+ }
+ }
+ }
+
+ if (len == 0)
+ len = strlen (str) + 1;
+
+ if (unlikely (asmscn->ctx->textp))
+ {
+ bool nextline = true;
+
+ do
+ {
+ if (nextline)
+ {
+ fputs ("\t.string\t\"", asmscn->ctx->out.file);
+ nextline = false;
+ }
+
+ if (*str == '\0')
+ fputs ("\\000", asmscn->ctx->out.file);
+ else if (! isascii (*str))
+ fprintf (asmscn->ctx->out.file, "\\%03o",
+ (unsigned int) *((unsigned char *)str));
+ else if (*str == '\\')
+ fputs ("\\\\", asmscn->ctx->out.file);
+ else if (*str == '\n')
+ {
+ fputs ("\\n\"", asmscn->ctx->out.file);
+ nextline = true;
+ }
+ else
+ fputc (*str, asmscn->ctx->out.file);
+
+ ++str;
+ }
+ while (--len > 0 && (len > 1 || *str != '\0'));
+
+ if (! nextline)
+ fputs ("\"\n", asmscn->ctx->out.file);
+ }
+ else
+ {
+ /* Make sure there is enough room. */
+ if (__libasm_ensure_section_space (asmscn, len) != 0)
+ return -1;
+
+ /* Copy the string. */
+ memcpy (&asmscn->content->data[asmscn->content->len], str, len);
+
+ /* Adjust the pointer in the data buffer. */
+ asmscn->content->len += len;
+
+ /* Increment the offset in the (sub)section. */
+ asmscn->offset += len;
+ }
+
+ return 0;
+}