[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-devel] Changes to qemacs/util.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-devel] Changes to qemacs/util.c |
Date: |
Fri, 13 May 2005 05:56:47 -0400 |
Index: qemacs/util.c
diff -u qemacs/util.c:1.10 qemacs/util.c:1.11
--- qemacs/util.c:1.10 Tue May 10 18:53:04 2005
+++ qemacs/util.c Fri May 13 09:56:44 2005
@@ -916,3 +916,87 @@
memmove(dest, src, len * sizeof(unsigned int));
}
+/* copy the n first char of a string and truncate it. */
+char *pstrncpy(char *buf, int buf_size, const char *s, int len)
+{
+ char *q;
+ int c;
+
+ if (buf_size > 0) {
+ q = buf;
+ if (len >= buf_size)
+ len = buf_size - 1;
+ while (len > 0) {
+ c = *s++;
+ if (c == '\0')
+ break;
+ *q++ = c;
+ len--;
+ }
+ *q = '\0';
+ }
+ return buf;
+}
+
+/**
+ * Add a memory region to a dynamic string. In case of allocation
+ * failure, the data is not added. The dynamic string is guaranted to
+ * be 0 terminated, although it can be longer if it contains zeros.
+ *
+ * @return 0 if OK, -1 if allocation error.
+ */
+int qmemcat(QString *q, const unsigned char *data1, int len1)
+{
+ int new_len, len, alloc_size;
+ unsigned char *data;
+
+ data = q->data;
+ len = q->len;
+ new_len = len + len1;
+ /* see if we got a new power of two */
+ /* NOTE: we got this trick from the excellent 'links' browser */
+ if ((len ^ new_len) >= len) {
+ /* find immediately bigger 2^n - 1 */
+ alloc_size = new_len;
+ alloc_size |= (alloc_size >> 1);
+ alloc_size |= (alloc_size >> 2);
+ alloc_size |= (alloc_size >> 4);
+ alloc_size |= (alloc_size >> 8);
+ alloc_size |= (alloc_size >> 16);
+ /* allocate one more byte for end of string marker */
+ data = realloc(data, alloc_size + 1);
+ if (!data)
+ return -1;
+ q->data = data;
+ }
+ memcpy(data + len, data1, len1);
+ data[new_len] = '\0'; /* we force a trailing '\0' */
+ q->len = new_len;
+ return 0;
+}
+
+/*
+ * add a string to a dynamic string
+ */
+int qstrcat(QString *q, const char *str)
+{
+ return qmemcat(q, str, strlen(str));
+}
+
+/* XXX: we use a fixed size buffer */
+int qprintf(QString *q, const char *fmt, ...)
+{
+ char buf[4096];
+ va_list ap;
+ int len, ret;
+
+ va_start(ap, fmt);
+ len = vsnprintf(buf, sizeof(buf), fmt, ap);
+ /* avoid problems for non C99 snprintf() which can return -1 if overflow */
+ if (len < 0)
+ len = strlen(buf);
+ ret = qmemcat(q, buf, len);
+ va_end(ap);
+ return ret;
+}
+