From 1264915af1cd1f47a34873360c4e88ae73a1bd33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=8C=EA=A6=AB=EA=A6=B6=EA=A6=8F=EA=A7=80=EA=A6=A6?= =?UTF-8?q?=EA=A6=BF=EA=A6=A7=EA=A6=AE=EA=A6=91=EA=A6=A9=EA=A6=AD=EA=A7=80?= Date: Tue, 20 Jul 2021 00:11:56 +0800 Subject: Function to get list of just the service codes --- pikul.c | 15 +++++++++++++++ pikul.h | 1 + pikul.i | 16 ++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/pikul.c b/pikul.c index df1662e..2255081 100644 --- a/pikul.c +++ b/pikul.c @@ -174,6 +174,21 @@ static int servicecmp(const void *service1, const void *service2) (*(struct pikul_service * const *)service2)->code); } +char **pikul_codes(const char *origin, const char *destination, double weight) +{ + char **codes = malloc(sizeof(char *)); + codes[0] = NULL; + struct pikul_services *services = pikul_services(origin, destination, weight); + if (!services || !services->length) + return codes; + codes = realloc(codes, (services->length + 1) * sizeof(char *)); + size_t i = 0; + for (i = 0; i < services->length; i++) + codes[i] = services->list[i]->code; + codes[i] = NULL; + return codes; +} + double pikul_cost(const char *origin, const char *destination, double weight, const char *code) { struct pikul_services *services = pikul_services(origin, destination, weight); diff --git a/pikul.h b/pikul.h index fde0483..07c6880 100644 --- a/pikul.h +++ b/pikul.h @@ -24,6 +24,7 @@ extern "C" { void pikul_init(enum pikul_company company, char *provisions[]); struct pikul_services *pikul_services(const char *origin, const char *destination, double weight); void pikul_free_services(struct pikul_services *services); +char **pikul_codes(const char *origin, const char *destination, double weight); double pikul_cost(const char *origin, const char *destination, double weight, const char *service); char *pikul_order(const char *order_number, const char *service, const char *sender_name, const char *sender_phone, const char *origin, const char *sender_address, diff --git a/pikul.i b/pikul.i index 331cfcb..fca870a 100644 --- a/pikul.i +++ b/pikul.i @@ -17,6 +17,21 @@ %typemap(freearg) char *[] { free($1); } +%typemap(out) char ** { + int len = 0; + while ($1[len]) + len++; + SV **svs = malloc(len * sizeof(SV *)); + for (int i = 0; i < len; i++) { + svs[i] = sv_newmortal(); + sv_setpv((SV *)svs[i], $1[i]); + }; + AV *myav = av_make(len, svs); + free(svs); + $result = newRV_noinc((SV *)myav); + sv_2mortal($result); + argvi++; +} %typemap(in) char **[] { AV *items = (AV *)SvRV($input); @@ -43,6 +58,7 @@ %rename("%(strip:[pikul_])s") ""; void pikul_init(enum pikul_company, char *[]); +char **pikul_codes(const char *, const char *, double); double pikul_cost(const char *, const char *, double, const char *); char *pikul_order(const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, int, -- cgit v1.2.3