qemacs-devel
[Top][All Lists]
Advanced

[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;
+}
+




reply via email to

[Prev in Thread] Current Thread [Next in Thread]