From 3022d16de40870c66c891a4aa75280e194ddf89f Mon Sep 17 00:00:00 2001 From: Dan Good Date: Tue, 5 Jan 2016 01:07:19 +0000 Subject: [PATCH] deque: check HAVE_STATEMENT_EXPR, tweaks from feedback Thanks to the detailed feedback from David Gibson, I made the following improvements: * add missing includes * check for statement expression support, give an error if absent * ccanlint directive to skip "without features" steps * add license ref to top of source files * rename run1.c test to api1.c Signed-off-by: Dan Good --- ccan/deque/_info | 8 +++++++- ccan/deque/deque.c | 2 ++ ccan/deque/deque.h | 14 ++++++++++---- ccan/deque/test/{run1.c => api1.c} | 2 -- ccan/deque/test/run2.c | 5 ++++- 5 files changed, 23 insertions(+), 8 deletions(-) rename ccan/deque/test/{run1.c => api1.c} (98%) diff --git a/ccan/deque/_info b/ccan/deque/_info index b1a47bbb..63687b74 100644 --- a/ccan/deque/_info +++ b/ccan/deque/_info @@ -16,7 +16,7 @@ * Example: * // Evaluates arithmetic expressions using Dijkstra's two-stack algorithm. * // Original: http://algs4.cs.princeton.edu/13stacks/EvaluateDeluxe.java.html - * #define _XOPEN_SOURCE 700 + * #define _XOPEN_SOURCE 700 // only for getline(3) in this demo * #include * #include * #include @@ -122,6 +122,12 @@ * * License: APACHE-2 * Author: Dan Good + * + * Ccanlint: + * // uses statement expressions + * // supported by gcc, clang, icc, and some others, but not msvc + * // (see https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html) + * objects_build_without_features FAIL */ int main(int argc, char *argv[]) { diff --git a/ccan/deque/deque.c b/ccan/deque/deque.c index cb628d37..548b4efa 100644 --- a/ccan/deque/deque.c +++ b/ccan/deque/deque.c @@ -1,3 +1,5 @@ +/* Licensed under Apache License v2.0 - see LICENSE file for details */ +#include "config.h" #include #include #include diff --git a/ccan/deque/deque.h b/ccan/deque/deque.h index 1e5b4e8e..ffd6c2a5 100644 --- a/ccan/deque/deque.h +++ b/ccan/deque/deque.h @@ -1,7 +1,13 @@ -#ifndef _DEQUE_H -#define _DEQUE_H - +/* Licensed under Apache License v2.0 - see LICENSE file for details */ +#ifndef CCAN_DEQUE_H +#define CCAN_DEQUE_H +#include "config.h" +#if !HAVE_STATEMENT_EXPR +#error "This code needs compiler support for statement expressions. Try using gcc or clang." +#endif #include +#include +#include /** * struct deq - deque metadata @@ -87,7 +93,7 @@ int deq_resize_(struct deq *q, unsigned n); * //later * deq_free(z); * - * Returns: pointer on success, NULL on error + * Returns: 0 on success, -1 on error */ #define deq_new(w, min, shrink) ({ \ w = malloc(sizeof(*w)); \ diff --git a/ccan/deque/test/run1.c b/ccan/deque/test/api1.c similarity index 98% rename from ccan/deque/test/run1.c rename to ccan/deque/test/api1.c index 8d953ea4..faa87248 100644 --- a/ccan/deque/test/run1.c +++ b/ccan/deque/test/api1.c @@ -1,6 +1,4 @@ #include -/* Include the C files directly. */ -#include #include int main(void) diff --git a/ccan/deque/test/run2.c b/ccan/deque/test/run2.c index 92502104..fba83f9a 100644 --- a/ccan/deque/test/run2.c +++ b/ccan/deque/test/run2.c @@ -12,7 +12,7 @@ int main(void) struct quad { int w, x, y, z; } p, q, r, s, *save; assert(sizeof(struct quad) == sizeof(int) * 4); - plan_tests(19); + plan_tests(20); typedef DEQ_WRAP(struct quad) qd_t; qd_t a_, *a = &a_; @@ -52,6 +52,9 @@ int main(void) deq_push(a, q); ok1(a->v != save && a->deq.head == 0 && a->deq.tail == 5 && a->deq.len == 5 && a->deq.cap == 8); ok1(malloc_sz == sizeof(struct quad) * 8); + save = a->v; + deq_unshift(a, r); + ok1(a->v == save && a->deq.head == 7 && a->deq.tail == 5 && a->deq.len == 6 && a->deq.cap == 8); deq_reset(a); -- 2.39.2