moved the slist-functions here from FTP since they're more generic than simply
authorDaniel Stenberg <daniel@haxx.se>
Fri, 2 Mar 2001 07:42:11 +0000 (07:42 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 2 Mar 2001 07:42:11 +0000 (07:42 +0000)
for FTP-stuff

lib/sendf.c

index c296af2..ccae992 100644 (file)
 #include "memdebug.h"
 #endif
 
+/* returns last node in linked list */
+static struct curl_slist *slist_get_last(struct curl_slist *list)
+{
+       struct curl_slist       *item;
+
+       /* if caller passed us a NULL, return now */
+       if (!list)
+               return NULL;
+
+       /* loop through to find the last item */
+       item = list;
+       while (item->next) {
+               item = item->next;
+       }
+       return item;
+}
+
+/* append a struct to the linked list. It always retunrs the address of the
+ * first record, so that you can sure this function as an initialization
+ * function as well as an append function. If you find this bothersome,
+ * then simply create a separate _init function and call it appropriately from
+ * within the proram. */
+struct curl_slist *curl_slist_append(struct curl_slist *list,
+                                     const char *data)
+{
+       struct curl_slist       *last;
+       struct curl_slist       *new_item;
+
+       new_item = (struct curl_slist *) malloc(sizeof(struct curl_slist));
+       if (new_item) {
+               new_item->next = NULL;
+               new_item->data = strdup(data);
+       }
+       else {
+               fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
+               return NULL;
+       }
+
+       if (list) {
+               last = slist_get_last(list);
+               last->next = new_item;
+               return list;
+       }
+
+       /* if this is the first item, then new_item *is* the list */
+       return new_item;
+}
+
+/* be nice and clean up resources */
+void curl_slist_free_all(struct curl_slist *list)
+{
+       struct curl_slist       *next;
+       struct curl_slist       *item;
+
+       if (!list)
+               return;
+
+       item = list;
+       do {
+               next = item->next;
+               
+               if (item->data) {
+                       free(item->data);
+               }
+               free(item);
+               item = next;
+       } while (next);
+}
+
+
 /* infof() is for info message along the way */
 
 void Curl_infof(struct UrlData *data, char *fmt, ...)
@@ -72,8 +142,11 @@ void Curl_failf(struct UrlData *data, char *fmt, ...)
   va_start(ap, fmt);
   if(data->errorbuffer)
     vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap);
-  else /* no errorbuffer receives this, write to data->err instead */
+  else {
+    /* no errorbuffer receives this, write to data->err instead */
     vfprintf(data->err, fmt, ap);
+    fprintf(data->err, "\n");
+  }
   va_end(ap);
 }