chiark / gitweb /
Add xcalloc_noptr(), which allows uaudio-thread.c to ask for
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 1 Mar 2009 19:13:49 +0000 (19:13 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sun, 1 Mar 2009 19:13:49 +0000 (19:13 +0000)
pointerless buffers.  Also convenient for unicode.c.

lib/mem.c
lib/mem.h
lib/uaudio-thread.c
lib/unicode.c

index 5f08b90..89570ab 100644 (file)
--- a/lib/mem.c
+++ b/lib/mem.c
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -136,6 +136,20 @@ void *xmalloc_noptr(size_t n) {
   return ptr;
 }
 
+/** @brief Allocate memory
+ * @param count Number of objects to allocate
+ * @param size Size of one object
+ * @return Pointer to allocated memory
+ *
+ * Terminates the process on error.  IMPORTANT: the allocated memory is NOT
+ * 0-filled (unlike @c calloc()).
+ */
+void *xcalloc_noptr(size_t count, size_t size) {
+  if(count > SIZE_MAX / size)
+    fatal(0, "excessively large calloc");
+  return xmalloc_noptr(count * size);
+}
+
 /** @brief Reallocate memory
  * @param ptr Block to reallocated
  * @param n Bytes to allocate
@@ -196,5 +210,7 @@ void xfree(void *ptr) {
 Local Variables:
 c-basic-offset:2
 comment-column:40
+fill-column:79
+indent-tabs-mode:nil
 End:
 */
index 2aa70aa..46412eb 100644 (file)
--- a/lib/mem.h
+++ b/lib/mem.h
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,6 +42,7 @@ void *xcalloc(size_t count, size_t size);
 
 void *xmalloc_noptr(size_t);
 void *xrealloc_noptr(void *, size_t);
+void *xcalloc_noptr(size_t count, size_t size);
 char *xstrdup(const char *);
 char *xstrndup(const char *, size_t);
 /* As malloc/realloc/strdup, but
index 3253a1d..cd0d727 100644 (file)
@@ -208,7 +208,8 @@ void uaudio_thread_start(uaudio_callback *callback,
   uaudio_thread_max = max;
   uaudio_thread_started = 1;
   for(int n = 0; n < UAUDIO_THREAD_BUFFERS; ++n)
-    uaudio_buffers[n].samples = xcalloc(uaudio_thread_max, uaudio_sample_size);
+    uaudio_buffers[n].samples = xcalloc_noptr(uaudio_thread_max,
+                                              uaudio_sample_size);
   uaudio_collect_buffer = uaudio_play_buffer = 0;
   if((e = pthread_create(&uaudio_collect_thread,
                          NULL,
index 3adbea0..55390eb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -1358,8 +1358,10 @@ uint32_t **utf32_word_split(const uint32_t *s, size_t ns, size_t *nwp,
       }
       /* If it's a word add it to the list of results */
       if(isword) {
-        w = xcalloc(b2 - b1 + 1, sizeof(uint32_t));
-        memcpy(w, it->s + b1, (b2 - b1) * sizeof (uint32_t));
+        const size_t len = b2 - b1;
+        w = xcalloc_noptr(len + 1, sizeof(uint32_t));
+        memcpy(w, it->s + b1, len * sizeof (uint32_t));
+        w[len] = 0;
         vector32_append(v32, w);
       }
     }