summaryrefslogtreecommitdiff
path: root/build/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'build/misc.c')
-rw-r--r--build/misc.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/build/misc.c b/build/misc.c
new file mode 100644
index 0000000..06fd110
--- /dev/null
+++ b/build/misc.c
@@ -0,0 +1,103 @@
+/** \ingroup rpmbuild
+ * \file build/misc.c
+ */
+#include "system.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <rpm/rpmstring.h>
+#include "build/rpmbuild_misc.h"
+#include "debug.h"
+
+#define BUF_CHUNK 1024
+
+struct StringBufRec {
+ char *buf;
+ char *tail; /* Points to first "free" char */
+ int allocated;
+ int free;
+};
+
+StringBuf newStringBuf(void)
+{
+ StringBuf sb = xmalloc(sizeof(*sb));
+
+ sb->free = sb->allocated = BUF_CHUNK;
+ sb->buf = xcalloc(sb->allocated, sizeof(*sb->buf));
+ sb->buf[0] = '\0';
+ sb->tail = sb->buf;
+
+ return sb;
+}
+
+StringBuf freeStringBuf(StringBuf sb)
+{
+ if (sb) {
+ sb->buf = _free(sb->buf);
+ sb = _free(sb);
+ }
+ return sb;
+}
+
+void stripTrailingBlanksStringBuf(StringBuf sb)
+{
+ while (sb->free != sb->allocated) {
+ if (! risspace(*(sb->tail - 1)))
+ break;
+ sb->free++;
+ sb->tail--;
+ }
+ sb->tail[0] = '\0';
+}
+
+const char * getStringBuf(StringBuf sb)
+{
+ return (sb != NULL) ? sb->buf : NULL;
+}
+
+void appendStringBufAux(StringBuf sb, const char *s, int nl)
+{
+ int l;
+
+ l = strlen(s);
+ /* If free == l there is no room for NULL terminator! */
+ while ((l + nl + 1) > sb->free) {
+ sb->allocated += BUF_CHUNK;
+ sb->free += BUF_CHUNK;
+ sb->buf = xrealloc(sb->buf, sb->allocated);
+ sb->tail = sb->buf + (sb->allocated - sb->free);
+ }
+
+ /* FIX: shrug */
+ strcpy(sb->tail, s);
+ sb->tail += l;
+ sb->free -= l;
+ if (nl) {
+ sb->tail[0] = '\n';
+ sb->tail[1] = '\0';
+ sb->tail++;
+ sb->free--;
+ }
+}
+
+uint32_t parseUnsignedNum(const char * line, uint32_t * res)
+{
+ char * s1 = NULL;
+ unsigned long rc;
+ uint32_t result;
+
+ if (line == NULL) return 1;
+
+ while (isspace(*line)) line++;
+ if (!isdigit(*line)) return 1;
+
+ rc = strtoul(line, &s1, 10);
+
+ if (*s1 || s1 == line || rc == ULONG_MAX || rc > UINT_MAX)
+ return 1;
+
+ result = (uint32_t)rc;
+ if (res) *res = result;
+
+ return 0;
+}