Code

Include config.h in source files.
[sysdb.git] / src / core / data.c
index a0c2be11014d7de81b6aa1e12f9e31a39871f595..4e0fd779580f9dd734bf1211dc2769ca326a179f 100644 (file)
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if HAVE_CONFIG_H
+#      include "config.h"
+#endif /* HAVE_CONFIG_H */
+
 #include "core/data.h"
 
 #include <inttypes.h>
@@ -115,28 +119,28 @@ sdb_data_strlen(sdb_data_t *datum)
 } /* sdb_data_strlen */
 
 int
-sdb_data_format(sdb_data_t *datum, char *buf, size_t buflen)
+sdb_data_format(sdb_data_t *datum, char *buf, size_t buflen, int quoted)
 {
+       char tmp[sdb_data_strlen(datum) + 1];
+       char *data = NULL;
+       int ret = -1;
+
+       size_t i, pos;
+
        if ((! datum) || (! buf))
                return -1;
 
        switch (datum->type) {
                case SDB_TYPE_INTEGER:
-                       snprintf(buf, buflen, "%"PRIi64, datum->data.integer);
+                       ret = snprintf(buf, buflen, "%"PRIi64, datum->data.integer);
                        break;
                case SDB_TYPE_DECIMAL:
-                       snprintf(buf, buflen, "%a", datum->data.decimal);
+                       ret = snprintf(buf, buflen, "%a", datum->data.decimal);
                        break;
                case SDB_TYPE_STRING:
-                       if (! datum->data.string) {
-                               strncpy(buf, "\"NULL\"", buflen);
-                               buf[buflen - 1] = '\0';
-                               return 0;
-                       }
-                       {
-                               char tmp[2 * strlen(datum->data.string) + 1];
-                               size_t i, pos;
-
+                       if (! datum->data.string)
+                               data = "NULL";
+                       else {
                                pos = 0;
                                for (i = 0; i < strlen(datum->data.string); ++i) {
                                        char byte = datum->data.string[i];
@@ -149,50 +153,49 @@ sdb_data_format(sdb_data_t *datum, char *buf, size_t buflen)
                                        ++pos;
                                }
                                tmp[pos] = '\0';
-                               snprintf(buf, buflen, "\"%s\"", tmp);
+                               data = tmp;
                        }
                        break;
                case SDB_TYPE_DATETIME:
-                       {
-                               char tmp[64];
-                               if (! sdb_strftime(tmp, sizeof(tmp), "%F %T %z",
-                                                       datum->data.datetime))
-                                       return -1;
-                               tmp[sizeof(tmp) - 1] = '\0';
-                               snprintf(buf, buflen, "\"%s\"", tmp);
-                       }
+                       if (! sdb_strftime(tmp, sizeof(tmp), "%F %T %z",
+                                               datum->data.datetime))
+                               return -1;
+                       tmp[sizeof(tmp) - 1] = '\0';
+                       data = tmp;
                        break;
                case SDB_TYPE_BINARY:
-                       {
-                               char tmp[4 * datum->data.binary.length + 1];
-                               size_t i, pos;
-
-                               pos = 0;
-                               for (i = 0; i < datum->data.binary.length; ++i) {
-                                       int byte = (int)datum->data.binary.datum[i];
-                                       char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
-                                               '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
-
-                                       tmp[pos] = '\\';
-                                       tmp[pos + 1] = 'x';
-                                       pos += 2;
-
-                                       if (byte > 0xf) {
-                                               tmp[pos] = hex[byte >> 4];
-                                               ++pos;
-                                       }
-                                       tmp[pos] = hex[byte & 0xf];
+                       pos = 0;
+                       for (i = 0; i < datum->data.binary.length; ++i) {
+                               int byte = (int)datum->data.binary.datum[i];
+                               char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
+                                       '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+                               tmp[pos] = '\\';
+                               tmp[pos + 1] = 'x';
+                               pos += 2;
+
+                               if (byte > 0xf) {
+                                       tmp[pos] = hex[byte >> 4];
                                        ++pos;
                                }
-                               tmp[pos] = '\0';
-                               snprintf(buf, buflen, "\"%s\"", tmp);
+                               tmp[pos] = hex[byte & 0xf];
+                               ++pos;
                        }
+                       tmp[pos] = '\0';
+                       data = tmp;
                        break;
-               default:
-                       return -1;
+       }
+
+       if (data) {
+               if (quoted == SDB_UNQUOTED)
+                       ret = snprintf(buf, buflen, "%s", data);
+               else if (quoted == SDB_SINGLE_QUOTED)
+                       ret = snprintf(buf, buflen, "'%s'", data);
+               else
+                       ret = snprintf(buf, buflen, "\"%s\"", data);
        }
        buf[buflen - 1] = '\0';
-       return 0;
+       return ret;
 } /* sdb_data_format */
 
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */