From fc555594c636e87ffe2384e6b5240cfa934c6cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=8C=20=EA=A6=AB=EA=A6=B6=20=EA=A6=8F=EA=A7=80?= =?UTF-8?q?=EA=A6=A6=EA=A6=BF=20=EA=A6=A7=20=EA=A6=AE=20=EA=A6=91=20?= =?UTF-8?q?=EA=A6=A9=20=EA=A6=AD=EA=A7=80?= Date: Sun, 6 Oct 2019 18:23:44 +0800 Subject: Order function --- client.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++---- icclient/client.h | 3 +++ icclient/ord.h | 4 +++- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/client.c b/client.c index 94de4c9..6726fe6 100644 --- a/client.c +++ b/client.c @@ -1,11 +1,16 @@ #include #include +#include #include "login.h" #include "icclient/product.h" #include "icclient/catalog.h" +#include "icclient/ord.h" #include "icclient/client.h" +typedef struct icclient_product icclient_product; typedef struct icclient_catalog icclient_catalog; +typedef struct icclient_ord_item icclient_ord_item; +typedef struct icclient_ord_order icclient_ord_order; CURL *curl = NULL; char *server_url = NULL; @@ -19,9 +24,6 @@ bool icclient_init(const char *url, const char *certificate) curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); if (certificate) curl_easy_setopt(curl, CURLOPT_CAINFO, certificate); -#ifdef DEBUG - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); -#endif size_t length = strlen(url); bool append = !(bool)(url[length - 1] == '/'); server_url = malloc(length + (size_t)append + 1); @@ -40,6 +42,57 @@ void icclient_allproducts(size_t (*handler)(void *, size_t, size_t, void *) request(handler, (void *)catalogptr, NULL, "%s", "All-Products"); } +static int prodcmp(const void *product1, const void *product2) +{ + return strcmp(((icclient_product *)product1)->sku + , ((icclient_product *)product2)->sku); +} + +static int itemcmp(const void *item1, const void *item2) +{ + return strcmp(((icclient_ord_item *)item1)->product->sku + , ((icclient_ord_item *)item2)->product->sku); +} + +void icclient_order(icclient_ord_order **orderptr, const char *sku + , icclient_catalog *catalog) +{ + if (!*orderptr) { + (*orderptr) = malloc(sizeof(icclient_ord_order)); + (*orderptr)->subtotal = .0; + (*orderptr)->shipping = .0; + (*orderptr)->subtotal = .0; + (*orderptr)->nitems = 0; + } + icclient_ord_order *order = *orderptr; + + qsort(catalog->products, catalog->length, sizeof(icclient_product) + , prodcmp); + icclient_product *product = bsearch(sku, catalog->products + , catalog->length, sizeof(icclient_product), prodcmp); + + qsort(order->items, order->nitems, sizeof(icclient_ord_item), itemcmp); + icclient_ord_item *item = bsearch(sku, order->items, order->nitems + , sizeof(icclient_ord_item), itemcmp); + + if (item) + item->quantity++; + else { + item = malloc(sizeof(icclient_ord_item)); + item->product = product; + item->quantity = 1; + *orderptr = realloc(*orderptr, sizeof(*orderptr) + + sizeof(icclient_ord_item)); + (*orderptr)->items[(*orderptr)->nitems++] = item; + order = *orderptr; + } + + order->subtotal += item->product->price; + order->total_cost += item->product->price; + + request(NULL, NULL, NULL, "%s%s", "order?mv_arg=", sku); +} + void icclient_newaccount(const char *username, const char *password , const char *verify, const char *successpage, const char *nextpage , const char *failpage) @@ -66,7 +119,7 @@ void icclient_page(const char *path, size_t (*handler)(void *, size_t, size_t request(handler, (void *)dataptr, NULL, "%s", path); } -void icclient_freeproduct(struct icclient_product *product) +void icclient_freeproduct(icclient_product *product) { if (product->image) free(product->image); diff --git a/icclient/client.h b/icclient/client.h index e49af36..db38926 100644 --- a/icclient/client.h +++ b/icclient/client.h @@ -3,6 +3,7 @@ struct icclient_product; struct icclient_catalog; +struct icclient_ord_order; #ifdef __cplusplus extern "C" { @@ -12,6 +13,8 @@ extern "C" { void icclient_allproducts(size_t (*handler)(void *contents, size_t size , size_t nmemb, void *userdata) , struct icclient_catalog **catalogptr); + void icclient_order(struct icclient_ord_order **orderptr, const char *sku + , struct icclient_catalog *catalog); void icclient_newaccount(const char *username, const char *password , const char *verify, const char *successpage , const char *nextpage, const char *failpage); diff --git a/icclient/ord.h b/icclient/ord.h index 0cd0e75..5632ffe 100644 --- a/icclient/ord.h +++ b/icclient/ord.h @@ -7,7 +7,9 @@ struct icclient_ord_item { }; struct icclient_ord_order { - double subtotal, shipping, total_cost; + double subtotal; + double shipping; + double total_cost; size_t nitems; struct icclient_ord_item *items[]; }; -- cgit v1.2.3