LCOV - code coverage report
Current view: top level - tests - test-util.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 734 773 95.0 %
Date: 2016-09-14 01:02:56 Functions: 31 32 96.9 %
Branches: 608 1160 52.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
       3                 :            :  *
       4                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       5                 :            :  * you may not use this file except in compliance with the License.
       6                 :            :  * You may obtain a copy of the License at:
       7                 :            :  *
       8                 :            :  *     http://www.apache.org/licenses/LICENSE-2.0
       9                 :            :  *
      10                 :            :  * Unless required by applicable law or agreed to in writing, software
      11                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      12                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13                 :            :  * See the License for the specific language governing permissions and
      14                 :            :  * limitations under the License.
      15                 :            :  */
      16                 :            : 
      17                 :            : #include <config.h>
      18                 :            : #undef NDEBUG
      19                 :            : #include "util.h"
      20                 :            : #include <assert.h>
      21                 :            : #include <getopt.h>
      22                 :            : #include <inttypes.h>
      23                 :            : #include <limits.h>
      24                 :            : #include <stdio.h>
      25                 :            : #include <stdlib.h>
      26                 :            : #include "byte-order.h"
      27                 :            : #include "command-line.h"
      28                 :            : #include "ovstest.h"
      29                 :            : #include "random.h"
      30                 :            : #include "openvswitch/vlog.h"
      31                 :            : 
      32                 :            : static void
      33                 :         96 : check_log_2_floor(uint32_t x, int n)
      34                 :            : {
      35         [ -  + ]:         96 :     if (log_2_floor(x) != n) {
      36                 :          0 :         fprintf(stderr, "log_2_floor(%"PRIu32") is %d but should be %d\n",
      37                 :            :                 x, log_2_floor(x), n);
      38                 :          0 :         abort();
      39                 :            :     }
      40                 :         96 : }
      41                 :            : 
      42                 :            : static void
      43                 :          1 : test_log_2_floor(struct ovs_cmdl_context *ctx OVS_UNUSED)
      44                 :            : {
      45                 :            :     int n;
      46                 :            : 
      47         [ +  + ]:         33 :     for (n = 0; n < 32; n++) {
      48                 :            :         /* Check minimum x such that f(x) == n. */
      49                 :         32 :         check_log_2_floor(1 << n, n);
      50                 :            : 
      51                 :            :         /* Check maximum x such that f(x) == n. */
      52                 :         32 :         check_log_2_floor((1 << n) | ((1 << n) - 1), n);
      53                 :            : 
      54                 :            :         /* Check a random value in the middle. */
      55                 :         32 :         check_log_2_floor((random_uint32() & ((1 << n) - 1)) | (1 << n), n);
      56                 :            :     }
      57                 :            : 
      58                 :            :     /* log_2_floor(0) is undefined, so don't check it. */
      59                 :          1 : }
      60                 :            : 
      61                 :            : static void
      62                 :         97 : check_ctz32(uint32_t x, int n)
      63                 :            : {
      64         [ -  + ]:         97 :     if (ctz32(x) != n) {
      65                 :          0 :         fprintf(stderr, "ctz32(%"PRIu32") is %d but should be %d\n",
      66                 :            :                 x, ctz32(x), n);
      67                 :          0 :         abort();
      68                 :            :     }
      69                 :         97 : }
      70                 :            : 
      71                 :            : static void
      72                 :        193 : check_ctz64(uint64_t x, int n)
      73                 :            : {
      74         [ -  + ]:        193 :     if (ctz64(x) != n) {
      75                 :          0 :         fprintf(stderr, "ctz64(%"PRIu64") is %d but should be %d\n",
      76                 :            :                 x, ctz64(x), n);
      77                 :          0 :         abort();
      78                 :            :     }
      79                 :        193 : }
      80                 :            : 
      81                 :            : static void
      82                 :          1 : test_ctz(struct ovs_cmdl_context *ctx OVS_UNUSED)
      83                 :            : {
      84                 :            :     int n;
      85                 :            : 
      86         [ +  + ]:         33 :     for (n = 0; n < 32; n++) {
      87                 :            :         /* Check minimum x such that f(x) == n. */
      88                 :         32 :         check_ctz32(1 << n, n);
      89                 :            : 
      90                 :            :         /* Check maximum x such that f(x) == n. */
      91                 :         32 :         check_ctz32(UINT32_MAX << n, n);
      92                 :            : 
      93                 :            :         /* Check a random value in the middle. */
      94                 :         32 :         check_ctz32((random_uint32() | 1) << n, n);
      95                 :            :     }
      96                 :            : 
      97                 :            : 
      98         [ +  + ]:         65 :     for (n = 0; n < 64; n++) {
      99                 :            :         /* Check minimum x such that f(x) == n. */
     100                 :         64 :         check_ctz64(UINT64_C(1) << n, n);
     101                 :            : 
     102                 :            :         /* Check maximum x such that f(x) == n. */
     103                 :         64 :         check_ctz64(UINT64_MAX << n, n);
     104                 :            : 
     105                 :            :         /* Check a random value in the middle. */
     106                 :         64 :         check_ctz64((random_uint64() | UINT64_C(1)) << n, n);
     107                 :            :     }
     108                 :            : 
     109                 :            :     /* Check ctz(0). */
     110                 :          1 :     check_ctz32(0, 32);
     111                 :          1 :     check_ctz64(0, 64);
     112                 :          1 : }
     113                 :            : 
     114                 :            : static void
     115                 :         97 : check_clz32(uint32_t x, int n)
     116                 :            : {
     117         [ -  + ]:         97 :     if (clz32(x) != n) {
     118                 :          0 :         fprintf(stderr, "clz32(%"PRIu32") is %d but should be %d\n",
     119                 :            :                 x, clz32(x), n);
     120                 :          0 :         abort();
     121                 :            :     }
     122                 :         97 : }
     123                 :            : 
     124                 :            : static void
     125                 :        193 : check_clz64(uint64_t x, int n)
     126                 :            : {
     127         [ -  + ]:        193 :     if (clz64(x) != n) {
     128                 :          0 :         fprintf(stderr, "clz64(%"PRIu64") is %d but should be %d\n",
     129                 :            :                 x, clz64(x), n);
     130                 :          0 :         abort();
     131                 :            :     }
     132                 :        193 : }
     133                 :            : 
     134                 :            : static void
     135                 :          1 : test_clz(struct ovs_cmdl_context *ctx OVS_UNUSED)
     136                 :            : {
     137                 :            :     int n;
     138                 :            : 
     139         [ +  + ]:         33 :     for (n = 0; n < 32; n++) {
     140                 :            :         /* Check minimum x such that f(x) == n. */
     141                 :         32 :         check_clz32((1u << 31) >> n, n);
     142                 :            : 
     143                 :            :         /* Check maximum x such that f(x) == n. */
     144                 :         32 :         check_clz32(UINT32_MAX >> n, n);
     145                 :            : 
     146                 :            :         /* Check a random value in the middle. */
     147                 :         32 :         check_clz32((random_uint32() | 1u << 31) >> n, n);
     148                 :            :     }
     149                 :            : 
     150         [ +  + ]:         65 :     for (n = 0; n < 64; n++) {
     151                 :            :         /* Check minimum x such that f(x) == n. */
     152                 :         64 :         check_clz64((UINT64_C(1) << 63) >> n, n);
     153                 :            : 
     154                 :            :         /* Check maximum x such that f(x) == n. */
     155                 :         64 :         check_clz64(UINT64_MAX >> n, n);
     156                 :            : 
     157                 :            :         /* Check a random value in the middle. */
     158                 :         64 :         check_clz64((random_uint64() | UINT64_C(1) << 63) >> n, n);
     159                 :            :     }
     160                 :            : 
     161                 :            :     /* Check clz(0). */
     162                 :          1 :     check_clz32(0, 32);
     163                 :          1 :     check_clz64(0, 64);
     164                 :          1 : }
     165                 :            : 
     166                 :            : /* Returns a random number in the range 'min'...'max' inclusive. */
     167                 :            : static uint32_t
     168                 :         64 : random_in_range(uint32_t min, uint32_t max)
     169                 :            : {
     170         [ +  + ]:         64 :     return min == max ? min : min + random_range(max - min + 1);
     171                 :            : }
     172                 :            : 
     173                 :            : static void
     174                 :         97 : check_rup2(uint32_t x, int n)
     175                 :            : {
     176                 :         97 :     uint32_t rup2 = ROUND_UP_POW2(x);
     177         [ -  + ]:         97 :     if (rup2 != n) {
     178                 :          0 :         fprintf(stderr, "ROUND_UP_POW2(%#"PRIx32") is %#"PRIx32" "
     179                 :            :                 "but should be %#"PRIx32"\n", x, rup2, n);
     180                 :          0 :         abort();
     181                 :            :     }
     182                 :         97 : }
     183                 :            : 
     184                 :            : static void
     185                 :          1 : test_round_up_pow2(struct ovs_cmdl_context *ctx OVS_UNUSED)
     186                 :            : {
     187                 :            :     int n;
     188                 :            : 
     189         [ +  + ]:         33 :     for (n = 0; n < 32; n++) {
     190                 :            :         /* Min, max value for which ROUND_UP_POW2 should yield (1 << n). */
     191                 :         32 :         uint32_t min = ((1u << n) >> 1) + 1;
     192                 :         32 :         uint32_t max = 1u << n;
     193                 :            : 
     194                 :         32 :         check_rup2(min, 1u << n);
     195                 :         32 :         check_rup2(max, 1u << n);
     196                 :         32 :         check_rup2(random_in_range(min, max), 1u << n);
     197                 :            :     }
     198                 :          1 :     check_rup2(0, 0);
     199                 :          1 : }
     200                 :            : 
     201                 :            : static void
     202                 :         97 : check_rdp2(uint32_t x, int n)
     203                 :            : {
     204                 :         97 :     uint32_t rdp2 = ROUND_DOWN_POW2(x);
     205         [ -  + ]:         97 :     if (rdp2 != n) {
     206                 :          0 :         fprintf(stderr, "ROUND_DOWN_POW2(%#"PRIx32") is %#"PRIx32" "
     207                 :            :                 "but should be %#"PRIx32"\n", x, rdp2, n);
     208                 :          0 :         abort();
     209                 :            :     }
     210                 :         97 : }
     211                 :            : 
     212                 :            : static void
     213                 :          1 : test_round_down_pow2(struct ovs_cmdl_context *ctx OVS_UNUSED)
     214                 :            : {
     215                 :            :     int n;
     216                 :            : 
     217         [ +  + ]:         33 :     for (n = 0; n < 32; n++) {
     218                 :            :         /* Min, max value for which ROUND_DOWN_POW2 should yield (1 << n). */
     219                 :         32 :         uint32_t min = 1u << n;
     220                 :         32 :         uint32_t max = ((1u << n) << 1) - 1;
     221                 :            : 
     222                 :         32 :         check_rdp2(min, 1u << n);
     223                 :         32 :         check_rdp2(max, 1u << n);
     224                 :         32 :         check_rdp2(random_in_range(min, max), 1u << n);
     225                 :            :     }
     226                 :          1 :     check_rdp2(0, 0);
     227                 :          1 : }
     228                 :            : 
     229                 :            : static void
     230                 :       2000 : shuffle(uint64_t *p, size_t n)
     231                 :            : {
     232         [ +  + ]:     128000 :     for (; n > 1; n--, p++) {
     233                 :     126000 :         uint64_t *q = &p[random_range(n)];
     234                 :     126000 :         uint64_t tmp = *p;
     235                 :     126000 :         *p = *q;
     236                 :     126000 :         *q = tmp;
     237                 :            :     }
     238                 :       2000 : }
     239                 :            : 
     240                 :            : static void
     241                 :     128001 : check_count_1bits(uint64_t x, int n)
     242                 :            : {
     243         [ -  + ]:     128001 :     if (count_1bits(x) != n) {
     244                 :          0 :         fprintf(stderr, "count_1bits(%#"PRIx64") is %d but should be %d\n",
     245                 :            :                 x, count_1bits(x), n);
     246                 :          0 :         abort();
     247                 :            :     }
     248                 :     128001 : }
     249                 :            : 
     250                 :            : static void
     251                 :          1 : test_count_1bits(struct ovs_cmdl_context *ctx OVS_UNUSED)
     252                 :            : {
     253                 :            :     uint64_t bits[64];
     254                 :            :     int i;
     255                 :            : 
     256         [ +  + ]:         65 :     for (i = 0; i < ARRAY_SIZE(bits); i++) {
     257                 :         64 :         bits[i] = UINT64_C(1) << i;
     258                 :            :     }
     259                 :            : 
     260                 :          1 :     check_count_1bits(0, 0);
     261                 :            : 
     262         [ +  + ]:       1001 :     for (i = 0; i < 1000; i++) {
     263                 :       1000 :         uint64_t x = 0;
     264                 :            :         int j;
     265                 :            : 
     266                 :       1000 :         shuffle(bits, ARRAY_SIZE(bits));
     267         [ +  + ]:      65000 :         for (j = 0; j < 64; j++) {
     268                 :      64000 :             x |= bits[j];
     269                 :      64000 :             check_count_1bits(x, j + 1);
     270                 :            :         }
     271         [ -  + ]:       1000 :         assert(x == UINT64_MAX);
     272                 :            : 
     273                 :       1000 :         shuffle(bits, ARRAY_SIZE(bits));
     274         [ +  + ]:      65000 :         for (j = 63; j >= 0; j--) {
     275                 :      64000 :             x &= ~bits[j];
     276                 :      64000 :             check_count_1bits(x, j);
     277                 :            :         }
     278         [ -  + ]:       1000 :         assert(x == 0);
     279                 :            :     }
     280                 :          1 : }
     281                 :            : 
     282                 :            : /* Returns the sum of the squares of the first 'n' positive integers. */
     283                 :            : static unsigned int
     284                 :          1 : sum_of_squares(int n)
     285                 :            : {
     286                 :          1 :     return n * (n + 1) * (2 * n + 1) / 6;
     287                 :            : }
     288                 :            : 
     289                 :            : static void
     290                 :          1 : test_bitwise_copy(struct ovs_cmdl_context *ctx OVS_UNUSED)
     291                 :            : {
     292                 :            :     unsigned int n_loops;
     293                 :            :     int src_ofs;
     294                 :            :     int dst_ofs;
     295                 :            :     int n_bits;
     296                 :            : 
     297                 :          1 :     n_loops = 0;
     298         [ +  + ]:         66 :     for (n_bits = 0; n_bits <= 64; n_bits++) {
     299         [ +  + ]:       2145 :         for (src_ofs = 0; src_ofs < 64 - n_bits; src_ofs++) {
     300         [ +  + ]:      91520 :             for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
     301                 :      89440 :                 ovs_be64 src = htonll(random_uint64());
     302                 :      89440 :                 ovs_be64 dst = htonll(random_uint64());
     303                 :      89440 :                 ovs_be64 orig_dst = dst;
     304                 :            :                 ovs_be64 expect;
     305                 :            : 
     306         [ -  + ]:      89440 :                 if (n_bits == 64) {
     307                 :          0 :                     expect = dst;
     308                 :            :                 } else {
     309                 :      89440 :                     uint64_t mask = (UINT64_C(1) << n_bits) - 1;
     310                 :      89440 :                     expect = orig_dst & ~htonll(mask << dst_ofs);
     311                 :      89440 :                     expect |= htonll(((ntohll(src) >> src_ofs) & mask)
     312                 :            :                                      << dst_ofs);
     313                 :            :                 }
     314                 :            : 
     315                 :      89440 :                 bitwise_copy(&src, sizeof src, src_ofs,
     316                 :            :                              &dst, sizeof dst, dst_ofs,
     317                 :            :                              n_bits);
     318         [ -  + ]:      89440 :                 if (expect != dst) {
     319                 :          0 :                     fprintf(stderr,"copy_bits(0x%016"PRIx64",8,%d, "
     320                 :            :                             "0x%016"PRIx64",8,%d, %d) yielded 0x%016"PRIx64" "
     321                 :            :                             "instead of the expected 0x%016"PRIx64"\n",
     322                 :            :                             ntohll(src), src_ofs,
     323                 :            :                             ntohll(orig_dst), dst_ofs,
     324                 :            :                             n_bits,
     325                 :            :                             ntohll(dst), ntohll(expect));
     326                 :          0 :                     abort();
     327                 :            :                 }
     328                 :            : 
     329                 :      89440 :                 n_loops++;
     330                 :            :             }
     331                 :            :         }
     332                 :            :     }
     333                 :            : 
     334         [ -  + ]:          1 :     if (n_loops != sum_of_squares(64)) {
     335                 :          0 :         abort();
     336                 :            :     }
     337                 :          1 : }
     338                 :            : 
     339                 :            : static void
     340                 :          1 : test_bitwise_zero(struct ovs_cmdl_context *ctx OVS_UNUSED)
     341                 :            : {
     342                 :            :     unsigned int n_loops;
     343                 :            :     int dst_ofs;
     344                 :            :     int n_bits;
     345                 :            : 
     346                 :          1 :     n_loops = 0;
     347         [ +  + ]:         66 :     for (n_bits = 0; n_bits <= 64; n_bits++) {
     348         [ +  + ]:       2145 :         for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
     349                 :       2080 :             ovs_be64 dst = htonll(random_uint64());
     350                 :       2080 :             ovs_be64 orig_dst = dst;
     351                 :            :             ovs_be64 expect;
     352                 :            : 
     353         [ -  + ]:       2080 :             if (n_bits == 64) {
     354                 :          0 :                 expect = htonll(0);
     355                 :            :             } else {
     356                 :       2080 :                 uint64_t mask = (UINT64_C(1) << n_bits) - 1;
     357                 :       2080 :                 expect = orig_dst & ~htonll(mask << dst_ofs);
     358                 :            :             }
     359                 :            : 
     360                 :       2080 :             bitwise_zero(&dst, sizeof dst, dst_ofs, n_bits);
     361         [ -  + ]:       2080 :             if (expect != dst) {
     362                 :          0 :                 fprintf(stderr,"bitwise_zero(0x%016"PRIx64",8,%d, %d) "
     363                 :            :                         "yielded 0x%016"PRIx64" "
     364                 :            :                         "instead of the expected 0x%016"PRIx64"\n",
     365                 :            :                         ntohll(orig_dst), dst_ofs,
     366                 :            :                         n_bits,
     367                 :            :                         ntohll(dst), ntohll(expect));
     368                 :          0 :                 abort();
     369                 :            :             }
     370                 :            : 
     371                 :       2080 :             n_loops++;
     372                 :            :         }
     373                 :            :     }
     374                 :            : 
     375         [ -  + ]:          1 :     if (n_loops != 64 * (64 + 1) / 2) {
     376                 :          0 :         abort();
     377                 :            :     }
     378                 :          1 : }
     379                 :            : 
     380                 :            : static void
     381                 :          1 : test_bitwise_one(struct ovs_cmdl_context *ctx OVS_UNUSED)
     382                 :            : {
     383                 :            :     unsigned int n_loops;
     384                 :            :     int dst_ofs;
     385                 :            :     int n_bits;
     386                 :            : 
     387                 :          1 :     n_loops = 0;
     388         [ +  + ]:         66 :     for (n_bits = 0; n_bits <= 64; n_bits++) {
     389         [ +  + ]:       2145 :         for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
     390                 :       2080 :             ovs_be64 dst = htonll(random_uint64());
     391                 :       2080 :             ovs_be64 orig_dst = dst;
     392                 :            :             ovs_be64 expect;
     393                 :            : 
     394         [ -  + ]:       2080 :             if (n_bits == 64) {
     395                 :          0 :                 expect = OVS_BE64_MAX;
     396                 :            :             } else {
     397                 :       2080 :                 uint64_t mask = (UINT64_C(1) << n_bits) - 1;
     398                 :       2080 :                 expect = orig_dst | htonll(mask << dst_ofs);
     399                 :            :             }
     400                 :            : 
     401                 :       2080 :             bitwise_one(&dst, sizeof dst, dst_ofs, n_bits);
     402         [ -  + ]:       2080 :             if (expect != dst) {
     403                 :          0 :                 fprintf(stderr,"bitwise_one(0x%016"PRIx64",8,%d, %d) "
     404                 :            :                         "yielded 0x%016"PRIx64" "
     405                 :            :                         "instead of the expected 0x%016"PRIx64"\n",
     406                 :            :                         ntohll(orig_dst), dst_ofs,
     407                 :            :                         n_bits,
     408                 :            :                         ntohll(dst), ntohll(expect));
     409                 :          0 :                 abort();
     410                 :            :             }
     411                 :            : 
     412                 :       2080 :             n_loops++;
     413                 :            :         }
     414                 :            :     }
     415                 :            : 
     416         [ -  + ]:          1 :     if (n_loops != 64 * (64 + 1) / 2) {
     417                 :          0 :         abort();
     418                 :            :     }
     419                 :          1 : }
     420                 :            : 
     421                 :            : static void
     422                 :          1 : test_bitwise_is_all_zeros(struct ovs_cmdl_context *ctx OVS_UNUSED)
     423                 :            : {
     424                 :            :     int n_loops;
     425                 :            : 
     426         [ +  + ]:        101 :     for (n_loops = 0; n_loops < 100; n_loops++) {
     427                 :        100 :         ovs_be64 x = htonll(0);
     428                 :            :         int i;
     429                 :            : 
     430         [ +  + ]:       6500 :         for (i = 0; i < 64; i++) {
     431                 :            :             ovs_be64 bit;
     432                 :            :             int ofs, n;
     433                 :            : 
     434                 :            :             /* Change a random 0-bit into a 1-bit. */
     435                 :            :             do {
     436                 :      31644 :                 bit = htonll(UINT64_C(1) << (random_range(64)));
     437         [ +  + ]:      31644 :             } while (x & bit);
     438                 :       6400 :             x |= bit;
     439                 :            : 
     440         [ +  + ]:     416000 :             for (ofs = 0; ofs < 64; ofs++) {
     441         [ +  + ]:   14131200 :                 for (n = 0; n <= 64 - ofs; n++) {
     442                 :            :                     bool expect;
     443                 :            :                     bool answer;
     444                 :            : 
     445                 :   13721600 :                     expect = (n == 64
     446                 :            :                               ? x == 0
     447         [ +  + ]:   13721600 :                               : !(x & htonll(((UINT64_C(1) << n) - 1)
     448                 :            :                                              << ofs)));
     449                 :   13721600 :                     answer = bitwise_is_all_zeros(&x, sizeof x, ofs, n);
     450         [ -  + ]:   13721600 :                     if (expect != answer) {
     451 [ #  # ][ #  # ]:          0 :                         fprintf(stderr,
     452                 :            :                                 "bitwise_is_all_zeros(0x%016"PRIx64",8,%d,%d "
     453                 :            :                                 "returned %s instead of %s\n",
     454                 :            :                                 ntohll(x), ofs, n,
     455                 :            :                                 answer ? "true" : "false",
     456                 :            :                                 expect ? "true" : "false");
     457                 :          0 :                         abort();
     458                 :            :                     }
     459                 :            :                 }
     460                 :            :             }
     461                 :            :         }
     462                 :            :     }
     463                 :          1 : }
     464                 :            : 
     465                 :            : static int
     466                 :   27456000 : trivial_bitwise_rscan(const void *p, unsigned int len, bool target,
     467                 :            :                       int start, int end)
     468                 :            : {
     469                 :            :     int ofs;
     470                 :            : 
     471         [ +  + ]:   89869341 :     for (ofs = start; ofs > end; ofs--) {
     472         [ +  + ]:   86846964 :         if (bitwise_get_bit(p, len, ofs) == target) {
     473                 :   24433623 :             break;
     474                 :            :         }
     475                 :            :     }
     476                 :   27456000 :     return ofs;
     477                 :            : }
     478                 :            : 
     479                 :            : static void
     480                 :          1 : test_bitwise_rscan(struct ovs_cmdl_context *ctx OVS_UNUSED)
     481                 :            : {
     482                 :            :     /* All 1s */
     483                 :          1 :     uint8_t s1[3] = {0xff, 0xff, 0xff};
     484                 :            :     /* Target is the first bit */
     485         [ -  + ]:          1 :     ovs_assert(23 == bitwise_rscan(s1, 3, 1, 23, -1));
     486                 :            :     /* Target is not found, return -1 */
     487         [ -  + ]:          1 :     ovs_assert(-1 == bitwise_rscan(s1, 3, 0, 23, -1));
     488                 :            :     /* Target is not found and end != -1, return end */
     489         [ -  + ]:          1 :     ovs_assert(20 == bitwise_rscan(s1, 3, 0, 23, 20));
     490                 :            : 
     491                 :            :     /* bit 20 - 23 are 0s */
     492                 :          1 :     uint8_t s2[3] = {0x0f, 0xff, 0xff};
     493                 :            :     /* Target is in the first byte but not the first bit */
     494         [ -  + ]:          1 :     ovs_assert(19 == bitwise_rscan(s2, 3, 1, 23, -1));
     495                 :            :     /* Target exists before the start postion */
     496         [ -  + ]:          1 :     ovs_assert(18 == bitwise_rscan(s2, 3, 1, 18, -1));
     497                 :            :     /* Target exists after the end postion, return end */
     498         [ -  + ]:          1 :     ovs_assert(20 == bitwise_rscan(s2, 3, 1, 23, 20));
     499                 :            :     /* Target is at the end postion, return end */
     500         [ -  + ]:          1 :     ovs_assert(19 == bitwise_rscan(s2, 3, 1, 23, 19));
     501                 :            :     /* start == end, target at start */
     502         [ -  + ]:          1 :     ovs_assert(19 == bitwise_rscan(s2, 3, 1, 19, 19));
     503                 :            :     /* start == end, target not at start */
     504         [ -  + ]:          1 :     ovs_assert(20 == bitwise_rscan(s2, 3, 1, 20, 20));
     505                 :            :     /* Target is 0 ... */
     506         [ -  + ]:          1 :     ovs_assert(22 == bitwise_rscan(s2, 3, 0, 22, -1));
     507                 :            : 
     508                 :            :     /* bit 4 - 23 are 0s */
     509                 :          1 :     uint8_t s3[3] = {0x00, 0x00, 0x0f};
     510                 :            :     /* Target is in the end byte */
     511         [ -  + ]:          1 :     ovs_assert(3 == bitwise_rscan(s3, 3, 1, 16, -1));
     512                 :            :     /* Target exists after the end byte, return end */
     513         [ -  + ]:          1 :     ovs_assert(15 == bitwise_rscan(s3, 3, 1, 23, 15));
     514                 :            :     /* Target exists in end byte but after the end bit, return end */
     515         [ -  + ]:          1 :     ovs_assert(4 == bitwise_rscan(s3, 3, 1, 23, 4));
     516                 :            :     /* Target is 0 ... */
     517         [ -  + ]:          1 :     ovs_assert(12 == bitwise_rscan(s3, 3, 0, 12, -1));
     518                 :            : 
     519                 :            :     /* All 0s */
     520                 :          1 :     uint8_t s4[3] = {0x00, 0x00, 0x00};
     521                 :            :     /* Target not found */
     522         [ -  + ]:          1 :     ovs_assert(-1 == bitwise_rscan(s4, 3, 1, 23, -1));
     523                 :            :     /* Target is 0 ..., start is 0 */
     524         [ -  + ]:          1 :     ovs_assert(0 == bitwise_rscan(s4, 3, 0, 0, -1));
     525                 :            : 
     526                 :            :     int n_loops;
     527         [ +  + ]:        101 :     for (n_loops = 0; n_loops < 100; n_loops++) {
     528                 :        100 :         ovs_be64 x = htonll(0);
     529                 :            :         int i;
     530                 :            : 
     531         [ +  + ]:       6500 :         for (i = 0; i < 64; i++) {
     532                 :            :             ovs_be64 bit;
     533                 :            : 
     534                 :            :             /* Change a random 0-bit into a 1-bit. */
     535                 :            :             do {
     536                 :      28835 :                 bit = htonll(UINT64_C(1) << (random_range(64)));
     537         [ +  + ]:      28835 :             } while (x & bit);
     538                 :       6400 :             x |= bit;
     539                 :            : 
     540         [ +  + ]:     422400 :             for (int end = -1; end <= 63; end++) {
     541         [ +  + ]:   14144000 :                 for (int start = end; start <= 63; start++) {
     542         [ +  + ]:   41184000 :                     for (int target = 0; target < 2; target++) {
     543                 :   27456000 :                         bool expect = trivial_bitwise_rscan(
     544                 :            :                             &x, sizeof x, target, start, end);
     545                 :   27456000 :                         bool answer = bitwise_rscan(
     546                 :            :                             &x, sizeof x, target, start, end);
     547         [ -  + ]:   27456000 :                         if (expect != answer) {
     548 [ #  # ][ #  # ]:          0 :                             fprintf(stderr,
                 [ #  # ]
     549                 :            :                                     "bitwise_rscan(0x%016"PRIx64",8,%s,%d,%d) "
     550                 :            :                                     "returned %s instead of %s\n",
     551                 :            :                                     ntohll(x),
     552                 :            :                                     target ? "true" : "false",
     553                 :            :                                     start, end,
     554                 :            :                                     answer ? "true" : "false",
     555                 :            :                                     expect ? "true" : "false");
     556                 :          0 :                             abort();
     557                 :            :                         }
     558                 :            :                     }
     559                 :            :                 }
     560                 :            :             }
     561                 :            :         }
     562                 :            :     }
     563                 :          1 : }
     564                 :            : 
     565                 :            : static void
     566                 :         20 : test_follow_symlinks(struct ovs_cmdl_context *ctx)
     567                 :            : {
     568                 :            :     int i;
     569                 :            : 
     570         [ +  + ]:         40 :     for (i = 1; i < ctx->argc; i++) {
     571                 :         20 :         char *target = follow_symlinks(ctx->argv[i]);
     572                 :         20 :         puts(target);
     573                 :         20 :         free(target);
     574                 :            :     }
     575                 :         20 : }
     576                 :            : 
     577                 :            : static void
     578                 :          0 : test_assert(struct ovs_cmdl_context *ctx OVS_UNUSED)
     579                 :            : {
     580                 :          0 :     ovs_assert(false);
     581                 :            : }
     582                 :            : 
     583                 :            : static void
     584                 :          1 : test_ovs_scan(struct ovs_cmdl_context *ctx OVS_UNUSED)
     585                 :            : {
     586                 :            :     char str[16], str2[16], str3[16];
     587                 :            :     long double ld, ld2;
     588                 :            :     long long ll, ll2;
     589                 :            :     signed char c, c2;
     590                 :            :     ptrdiff_t pd, pd2;
     591                 :            :     intmax_t im, im2;
     592                 :            :     size_t sz, sz2;
     593                 :            :     int n, n2, n3;
     594                 :            :     double d, d2;
     595                 :            :     short s, s2;
     596                 :            :     float f, f2;
     597                 :            :     long l, l2;
     598                 :            :     int i, i2;
     599                 :            : 
     600         [ -  + ]:          1 :     ovs_assert(ovs_scan("", " "));
     601         [ -  + ]:          1 :     ovs_assert(ovs_scan(" ", " "));
     602         [ -  + ]:          1 :     ovs_assert(ovs_scan("  ", " "));
     603         [ -  + ]:          1 :     ovs_assert(ovs_scan(" \t ", " "));
     604                 :            : 
     605         [ -  + ]:          1 :     ovs_assert(ovs_scan("xyzzy", "xyzzy"));
     606         [ -  + ]:          1 :     ovs_assert(ovs_scan("xy%zzy", "xy%%zzy"));
     607         [ -  + ]:          1 :     ovs_assert(!ovs_scan(" xy%zzy", "xy%%zzy"));
     608         [ -  + ]:          1 :     ovs_assert(ovs_scan("    xy%\tzzy", " xy%% zzy"));
     609                 :            : 
     610         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%d", &i));
     611         [ -  + ]:          1 :     ovs_assert(i == 123);
     612         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%d", &i));
     613         [ -  + ]:          1 :     ovs_assert(i == 0);
     614         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%d%d", &i, &i2));
     615         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%d", &i));
     616         [ -  + ]:          1 :     ovs_assert(i == 123);
     617         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%d", &i));
     618         [ -  + ]:          1 :     ovs_assert(i == -123);
     619         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%d", &i));
     620         [ -  + ]:          1 :     ovs_assert(i == 123);
     621         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%d", &i));
     622         [ -  + ]:          1 :     ovs_assert(i == 123);
     623         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%d", &i));
     624         [ -  + ]:          1 :     ovs_assert(i == 0);
     625         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2d %d", &i, &i2));
     626         [ -  + ]:          1 :     ovs_assert(i == 12);
     627         [ -  + ]:          1 :     ovs_assert(i2 == 3);
     628         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2d %d", &i, &i2));
     629         [ -  + ]:          1 :     ovs_assert(i == 1);
     630         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     631         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2d %d", &i, &i2));
     632         [ -  + ]:          1 :     ovs_assert(i == -1);
     633         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     634         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2d %d", &i, &i2));
     635         [ -  + ]:          1 :     ovs_assert(i == 1);
     636         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     637         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%*2d %d", &i));
     638         [ -  + ]:          1 :     ovs_assert(i == 3);
     639         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2d %*d", &i));
     640         [ -  + ]:          1 :     ovs_assert(i == 1);
     641         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     642         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%*2d %*d"));
     643                 :            : 
     644         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%u", &i));
     645         [ -  + ]:          1 :     ovs_assert(i == 123);
     646         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%u", &i));
     647         [ -  + ]:          1 :     ovs_assert(i == 0);
     648         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%u%u", &i, &i2));
     649         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%u", &i));
     650         [ -  + ]:          1 :     ovs_assert(i == 123);
     651         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%u", &i));
     652         [ -  + ]:          1 :     ovs_assert(i == -123);
     653         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%u", &i));
     654         [ -  + ]:          1 :     ovs_assert(i == 123);
     655         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%u", &i));
     656         [ -  + ]:          1 :     ovs_assert(i == 123);
     657         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%u", &i));
     658         [ -  + ]:          1 :     ovs_assert(i == 0);
     659         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2u %u", &i, &i2));
     660         [ -  + ]:          1 :     ovs_assert(i == 12);
     661         [ -  + ]:          1 :     ovs_assert(i2 == 3);
     662         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2u %u", &i, &i2));
     663         [ -  + ]:          1 :     ovs_assert(i == 1);
     664         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     665         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2u %u", &i, &i2));
     666         [ -  + ]:          1 :     ovs_assert(i == -1);
     667         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     668         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2u %u", &i, &i2));
     669         [ -  + ]:          1 :     ovs_assert(i == 1);
     670         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     671         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%*2u %u", &i));
     672         [ -  + ]:          1 :     ovs_assert(i == 3);
     673         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2u %*u", &i));
     674         [ -  + ]:          1 :     ovs_assert(i == 1);
     675         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     676         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%*2u %*u"));
     677                 :            : 
     678         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%i", &i));
     679         [ -  + ]:          1 :     ovs_assert(i == 123);
     680         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%i", &i));
     681         [ -  + ]:          1 :     ovs_assert(i == 0);
     682         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%i%i", &i, &i2));
     683         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%i", &i));
     684         [ -  + ]:          1 :     ovs_assert(i == 123);
     685         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%i", &i));
     686         [ -  + ]:          1 :     ovs_assert(i == -123);
     687         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%i", &i));
     688         [ -  + ]:          1 :     ovs_assert(i == 0123);
     689         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%i", &i));
     690         [ -  + ]:          1 :     ovs_assert(i == 123);
     691         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%i", &i));
     692         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     693         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2i %i", &i, &i2));
     694         [ -  + ]:          1 :     ovs_assert(i == 12);
     695         [ -  + ]:          1 :     ovs_assert(i2 == 3);
     696         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2i %i", &i, &i2));
     697         [ -  + ]:          1 :     ovs_assert(i == 1);
     698         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     699         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2i %i", &i, &i2));
     700         [ -  + ]:          1 :     ovs_assert(i == -1);
     701         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     702         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2i %i", &i, &i2));
     703         [ -  + ]:          1 :     ovs_assert(i == 1);
     704         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     705         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%*2i %i", &i));
     706         [ -  + ]:          1 :     ovs_assert(i == 3);
     707         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2i %*i", &i));
     708         [ -  + ]:          1 :     ovs_assert(i == 1);
     709         [ -  + ]:          1 :     ovs_assert(i2 == 23);
     710         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%*2i %*i"));
     711                 :            : 
     712         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%o", &i));
     713         [ -  + ]:          1 :     ovs_assert(i == 0123);
     714         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%o", &i));
     715         [ -  + ]:          1 :     ovs_assert(i == 0);
     716         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%o%o", &i, &i2));
     717         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%o", &i));
     718         [ -  + ]:          1 :     ovs_assert(i == 0123);
     719         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%o", &i));
     720         [ -  + ]:          1 :     ovs_assert(i == -0123);
     721         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%o", &i));
     722         [ -  + ]:          1 :     ovs_assert(i == 0123);
     723         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%o", &i));
     724         [ -  + ]:          1 :     ovs_assert(i == 0123);
     725         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%o", &i));
     726         [ -  + ]:          1 :     ovs_assert(i == 0);
     727         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2o %o", &i, &i2));
     728         [ -  + ]:          1 :     ovs_assert(i == 012);
     729         [ -  + ]:          1 :     ovs_assert(i2 == 3);
     730         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2o %o", &i, &i2));
     731         [ -  + ]:          1 :     ovs_assert(i == 1);
     732         [ -  + ]:          1 :     ovs_assert(i2 == 023);
     733         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2o %o", &i, &i2));
     734         [ -  + ]:          1 :     ovs_assert(i == -1);
     735         [ -  + ]:          1 :     ovs_assert(i2 == 023);
     736         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2o %o", &i, &i2));
     737         [ -  + ]:          1 :     ovs_assert(i == 1);
     738         [ -  + ]:          1 :     ovs_assert(i2 == 023);
     739         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%*2o %o", &i));
     740         [ -  + ]:          1 :     ovs_assert(i == 3);
     741         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2o %*o", &i));
     742         [ -  + ]:          1 :     ovs_assert(i == 1);
     743         [ -  + ]:          1 :     ovs_assert(i2 == 023);
     744         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%*2o %*o"));
     745                 :            : 
     746         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%x", &i));
     747         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     748         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%x", &i));
     749         [ -  + ]:          1 :     ovs_assert(i == 0);
     750         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%x%x", &i, &i2));
     751         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%x", &i));
     752         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     753         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%x", &i));
     754         [ -  + ]:          1 :     ovs_assert(i == -0x123);
     755         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%x", &i));
     756         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     757         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%x", &i));
     758         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     759         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%x", &i));
     760         [ -  + ]:          1 :     ovs_assert(i == 0x123);
     761         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2x %x", &i, &i2));
     762         [ -  + ]:          1 :     ovs_assert(i == 0x12);
     763         [ -  + ]:          1 :     ovs_assert(i2 == 3);
     764         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2x %x", &i, &i2));
     765         [ -  + ]:          1 :     ovs_assert(i == 1);
     766         [ -  + ]:          1 :     ovs_assert(i2 == 0x23);
     767         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2x %x", &i, &i2));
     768         [ -  + ]:          1 :     ovs_assert(i == -1);
     769         [ -  + ]:          1 :     ovs_assert(i2 == 0x23);
     770         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2x %x", &i, &i2));
     771         [ -  + ]:          1 :     ovs_assert(i == 1);
     772         [ -  + ]:          1 :     ovs_assert(i2 == 0x23);
     773         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%*2x %x", &i));
     774         [ -  + ]:          1 :     ovs_assert(i == 3);
     775         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2x %*x", &i));
     776         [ -  + ]:          1 :     ovs_assert(i == 1);
     777         [ -  + ]:          1 :     ovs_assert(i2 == 0x23);
     778         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%*2x %*x"));
     779                 :            : 
     780         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%hd", &s));
     781         [ -  + ]:          1 :     ovs_assert(s == 123);
     782         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%hd%hd", &s, &s2));
     783         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%hd", &s));
     784         [ -  + ]:          1 :     ovs_assert(s == 123);
     785         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%hd", &s));
     786         [ -  + ]:          1 :     ovs_assert(s == -123);
     787         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%hd", &s));
     788         [ -  + ]:          1 :     ovs_assert(s == 123);
     789         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%hd", &s));
     790         [ -  + ]:          1 :     ovs_assert(s == 123);
     791         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%hd", &s));
     792         [ -  + ]:          1 :     ovs_assert(s == 0);
     793         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2hd %hd", &s, &s2));
     794         [ -  + ]:          1 :     ovs_assert(s == 12);
     795         [ -  + ]:          1 :     ovs_assert(s2 == 3);
     796         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2hd %hd", &s, &s2));
     797         [ -  + ]:          1 :     ovs_assert(s == 1);
     798         [ -  + ]:          1 :     ovs_assert(s2 == 23);
     799         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2hd %hd", &s, &s2));
     800         [ -  + ]:          1 :     ovs_assert(s == -1);
     801         [ -  + ]:          1 :     ovs_assert(s2 == 23);
     802         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2hd %hd", &s, &s2));
     803         [ -  + ]:          1 :     ovs_assert(s == 1);
     804         [ -  + ]:          1 :     ovs_assert(s2 == 23);
     805                 :            : 
     806         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%hhd", &c));
     807         [ -  + ]:          1 :     ovs_assert(c == 123);
     808         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%hhd", &c));
     809         [ -  + ]:          1 :     ovs_assert(c == 0);
     810         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%hhd%hhd", &c, &c2));
     811         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%hhd", &c));
     812         [ -  + ]:          1 :     ovs_assert(c == 123);
     813         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%hhd", &c));
     814         [ -  + ]:          1 :     ovs_assert(c == -123);
     815         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%hhd", &c));
     816         [ -  + ]:          1 :     ovs_assert(c == 123);
     817         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%hhd", &c));
     818         [ -  + ]:          1 :     ovs_assert(c == 123);
     819         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%hhd", &c));
     820         [ -  + ]:          1 :     ovs_assert(c == 0);
     821         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2hhd %hhd", &c, &c2));
     822         [ -  + ]:          1 :     ovs_assert(c == 12);
     823         [ -  + ]:          1 :     ovs_assert(c2 == 3);
     824         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2hhd %hhd", &c, &c2));
     825         [ -  + ]:          1 :     ovs_assert(c == 1);
     826         [ -  + ]:          1 :     ovs_assert(c2 == 23);
     827         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2hhd %hhd", &c, &c2));
     828         [ -  + ]:          1 :     ovs_assert(c == -1);
     829         [ -  + ]:          1 :     ovs_assert(c2 == 23);
     830         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2hhd %hhd", &c, &c2));
     831         [ -  + ]:          1 :     ovs_assert(c == 1);
     832         [ -  + ]:          1 :     ovs_assert(c2 == 23);
     833                 :            : 
     834         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%ld", &l));
     835         [ -  + ]:          1 :     ovs_assert(l == 123);
     836         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%ld", &l));
     837         [ -  + ]:          1 :     ovs_assert(l == 0);
     838         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%ld%ld", &l, &l2));
     839         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%ld", &l));
     840         [ -  + ]:          1 :     ovs_assert(l == 123);
     841         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%ld", &l));
     842         [ -  + ]:          1 :     ovs_assert(l == -123);
     843         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%ld", &l));
     844         [ -  + ]:          1 :     ovs_assert(l == 123);
     845         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%ld", &l));
     846         [ -  + ]:          1 :     ovs_assert(l == 123);
     847         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%ld", &l));
     848         [ -  + ]:          1 :     ovs_assert(l == 0);
     849         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2ld %ld", &l, &l2));
     850         [ -  + ]:          1 :     ovs_assert(l == 12);
     851         [ -  + ]:          1 :     ovs_assert(l2 == 3);
     852         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2ld %ld", &l, &l2));
     853         [ -  + ]:          1 :     ovs_assert(l == 1);
     854         [ -  + ]:          1 :     ovs_assert(l2 == 23);
     855         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2ld %ld", &l, &l2));
     856         [ -  + ]:          1 :     ovs_assert(l == -1);
     857         [ -  + ]:          1 :     ovs_assert(l2 == 23);
     858         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2ld %ld", &l, &l2));
     859         [ -  + ]:          1 :     ovs_assert(l == 1);
     860         [ -  + ]:          1 :     ovs_assert(l2 == 23);
     861                 :            : 
     862         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%lld", &ll));
     863         [ -  + ]:          1 :     ovs_assert(ll == 123);
     864         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%lld", &ll));
     865         [ -  + ]:          1 :     ovs_assert(ll == 0);
     866         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%lld%lld", &ll, &ll2));
     867         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%lld", &ll));
     868         [ -  + ]:          1 :     ovs_assert(ll == 123);
     869         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%lld", &ll));
     870         [ -  + ]:          1 :     ovs_assert(ll == -123);
     871         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%lld", &ll));
     872         [ -  + ]:          1 :     ovs_assert(ll == 123);
     873         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%lld", &ll));
     874         [ -  + ]:          1 :     ovs_assert(ll == 123);
     875         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%lld", &ll));
     876         [ -  + ]:          1 :     ovs_assert(ll == 0);
     877         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2lld %lld", &ll, &ll2));
     878         [ -  + ]:          1 :     ovs_assert(ll == 12);
     879         [ -  + ]:          1 :     ovs_assert(ll2 == 3);
     880         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2lld %lld", &ll, &ll2));
     881         [ -  + ]:          1 :     ovs_assert(ll == 1);
     882         [ -  + ]:          1 :     ovs_assert(ll2 == 23);
     883         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2lld %lld", &ll, &ll2));
     884         [ -  + ]:          1 :     ovs_assert(ll == -1);
     885         [ -  + ]:          1 :     ovs_assert(ll2 == 23);
     886         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2lld %lld", &ll, &ll2));
     887         [ -  + ]:          1 :     ovs_assert(ll == 1);
     888         [ -  + ]:          1 :     ovs_assert(ll2 == 23);
     889                 :            : 
     890         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%jd", &im));
     891         [ -  + ]:          1 :     ovs_assert(im == 123);
     892         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%jd", &im));
     893         [ -  + ]:          1 :     ovs_assert(im == 0);
     894         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%jd%jd", &im, &im2));
     895         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%jd", &im));
     896         [ -  + ]:          1 :     ovs_assert(im == 123);
     897         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%jd", &im));
     898         [ -  + ]:          1 :     ovs_assert(im == -123);
     899         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%jd", &im));
     900         [ -  + ]:          1 :     ovs_assert(im == 123);
     901         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%jd", &im));
     902         [ -  + ]:          1 :     ovs_assert(im == 123);
     903         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%jd", &im));
     904         [ -  + ]:          1 :     ovs_assert(im == 0);
     905         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2jd %jd", &im, &im2));
     906         [ -  + ]:          1 :     ovs_assert(im == 12);
     907         [ -  + ]:          1 :     ovs_assert(im2 == 3);
     908         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2jd %jd", &im, &im2));
     909         [ -  + ]:          1 :     ovs_assert(im == 1);
     910         [ -  + ]:          1 :     ovs_assert(im2 == 23);
     911         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2jd %jd", &im, &im2));
     912         [ -  + ]:          1 :     ovs_assert(im == -1);
     913         [ -  + ]:          1 :     ovs_assert(im2 == 23);
     914         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2jd %jd", &im, &im2));
     915         [ -  + ]:          1 :     ovs_assert(im == 1);
     916         [ -  + ]:          1 :     ovs_assert(im2 == 23);
     917                 :            : 
     918         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%td", &pd));
     919         [ -  + ]:          1 :     ovs_assert(pd == 123);
     920         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%td", &pd));
     921         [ -  + ]:          1 :     ovs_assert(pd == 0);
     922         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%td%td", &pd, &pd2));
     923         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%td", &pd));
     924         [ -  + ]:          1 :     ovs_assert(pd == 123);
     925         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%td", &pd));
     926         [ -  + ]:          1 :     ovs_assert(pd == -123);
     927         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%td", &pd));
     928         [ -  + ]:          1 :     ovs_assert(pd == 123);
     929         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%td", &pd));
     930         [ -  + ]:          1 :     ovs_assert(pd == 123);
     931         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%td", &pd));
     932         [ -  + ]:          1 :     ovs_assert(pd == 0);
     933         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2td %td", &pd, &pd2));
     934         [ -  + ]:          1 :     ovs_assert(pd == 12);
     935         [ -  + ]:          1 :     ovs_assert(pd2 == 3);
     936         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2td %td", &pd, &pd2));
     937         [ -  + ]:          1 :     ovs_assert(pd == 1);
     938         [ -  + ]:          1 :     ovs_assert(pd2 == 23);
     939         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2td %td", &pd, &pd2));
     940         [ -  + ]:          1 :     ovs_assert(pd == -1);
     941         [ -  + ]:          1 :     ovs_assert(pd2 == 23);
     942         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2td %td", &pd, &pd2));
     943         [ -  + ]:          1 :     ovs_assert(pd == 1);
     944         [ -  + ]:          1 :     ovs_assert(pd2 == 23);
     945                 :            : 
     946         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%zd", &sz));
     947         [ -  + ]:          1 :     ovs_assert(sz == 123);
     948         [ -  + ]:          1 :     ovs_assert(ovs_scan("0", "%zd", &sz));
     949         [ -  + ]:          1 :     ovs_assert(sz == 0);
     950         [ -  + ]:          1 :     ovs_assert(!ovs_scan("123", "%zd%zd", &sz, &sz2));
     951         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%zd", &sz));
     952         [ -  + ]:          1 :     ovs_assert(sz == 123);
     953         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%zd", &sz));
     954         [ -  + ]:          1 :     ovs_assert(sz == -123);
     955         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%zd", &sz));
     956         [ -  + ]:          1 :     ovs_assert(sz == 123);
     957         [ -  + ]:          1 :     ovs_assert(ovs_scan(" 123", "%zd", &sz));
     958         [ -  + ]:          1 :     ovs_assert(sz == 123);
     959         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123", "%zd", &sz));
     960         [ -  + ]:          1 :     ovs_assert(sz == 0);
     961         [ -  + ]:          1 :     ovs_assert(ovs_scan("123", "%2zd %zd", &sz, &sz2));
     962         [ -  + ]:          1 :     ovs_assert(sz == 12);
     963         [ -  + ]:          1 :     ovs_assert(sz2 == 3);
     964         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123", "%2zd %zd", &sz, &sz2));
     965         [ -  + ]:          1 :     ovs_assert(sz == 1);
     966         [ -  + ]:          1 :     ovs_assert(sz2 == 23);
     967         [ -  + ]:          1 :     ovs_assert(ovs_scan("-123", "%2zd %zd", &sz, &sz2));
     968         [ -  + ]:          1 :     ovs_assert(sz == -1);
     969         [ -  + ]:          1 :     ovs_assert(sz2 == 23);
     970         [ -  + ]:          1 :     ovs_assert(ovs_scan("0123", "%2zd %zd", &sz, &sz2));
     971         [ -  + ]:          1 :     ovs_assert(sz == 1);
     972         [ -  + ]:          1 :     ovs_assert(sz2 == 23);
     973                 :            : 
     974         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%f", &f));
     975         [ -  + ]:          1 :     ovs_assert(f == 0.25);
     976         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%f", &f));
     977         [ -  + ]:          1 :     ovs_assert(f == 1.0);
     978         [ -  + ]:          1 :     ovs_assert(ovs_scan("-5", "%f", &f));
     979         [ -  + ]:          1 :     ovs_assert(f == -5.0);
     980         [ -  + ]:          1 :     ovs_assert(ovs_scan("+6", "%f", &f));
     981         [ -  + ]:          1 :     ovs_assert(f == 6.0);
     982         [ -  + ]:          1 :     ovs_assert(ovs_scan("-1e5", "%f", &f));
     983         [ -  + ]:          1 :     ovs_assert(f == -1e5);
     984         [ -  + ]:          1 :     ovs_assert(ovs_scan("-.25", "%f", &f));
     985         [ -  + ]:          1 :     ovs_assert(f == -.25);
     986         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123.e1", "%f", &f));
     987         [ -  + ]:          1 :     ovs_assert(f == 1230.0);
     988         [ -  + ]:          1 :     ovs_assert(ovs_scan("25e-2", "%f", &f));
     989         [ -  + ]:          1 :     ovs_assert(f == 0.25);
     990         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%1f %f", &f, &f2));
     991         [ -  + ]:          1 :     ovs_assert(f == 0);
     992         [ -  + ]:          1 :     ovs_assert(f2 == 0.25);
     993         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%2f %f", &f, &f2));
     994         [ -  + ]:          1 :     ovs_assert(f == 1.0);
     995         [ -  + ]:          1 :     ovs_assert(f2 == 0.0);
     996         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-5", "%1f", &f));
     997         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+6", "%1f", &f));
     998         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-1e5", "%2f %*f", &f));
     999         [ -  + ]:          1 :     ovs_assert(f == -1);
    1000         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-.25", "%2f", &f));
    1001         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+123.e1", "%6f", &f));
    1002         [ -  + ]:          1 :     ovs_assert(!ovs_scan("25e-2", "%4f", &f));
    1003                 :            : 
    1004         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%lf", &d));
    1005         [ -  + ]:          1 :     ovs_assert(d == 0.25);
    1006         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%lf", &d));
    1007         [ -  + ]:          1 :     ovs_assert(d == 1.0);
    1008         [ -  + ]:          1 :     ovs_assert(ovs_scan("-5", "%lf", &d));
    1009         [ -  + ]:          1 :     ovs_assert(d == -5.0);
    1010         [ -  + ]:          1 :     ovs_assert(ovs_scan("+6", "%lf", &d));
    1011         [ -  + ]:          1 :     ovs_assert(d == 6.0);
    1012         [ -  + ]:          1 :     ovs_assert(ovs_scan("-1e5", "%lf", &d));
    1013         [ -  + ]:          1 :     ovs_assert(d == -1e5);
    1014         [ -  + ]:          1 :     ovs_assert(ovs_scan("-.25", "%lf", &d));
    1015         [ -  + ]:          1 :     ovs_assert(d == -.25);
    1016         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123.e1", "%lf", &d));
    1017         [ -  + ]:          1 :     ovs_assert(d == 1230.0);
    1018         [ -  + ]:          1 :     ovs_assert(ovs_scan("25e-2", "%lf", &d));
    1019         [ -  + ]:          1 :     ovs_assert(d == 0.25);
    1020         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%1lf %lf", &d, &d2));
    1021         [ -  + ]:          1 :     ovs_assert(d == 0);
    1022         [ -  + ]:          1 :     ovs_assert(d2 == 0.25);
    1023         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%2lf %lf", &d, &d2));
    1024         [ -  + ]:          1 :     ovs_assert(d == 1.0);
    1025         [ -  + ]:          1 :     ovs_assert(d2 == 0.0);
    1026         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-5", "%1lf", &d));
    1027         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+6", "%1lf", &d));
    1028         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-1e5", "%2lf %*f", &d));
    1029         [ -  + ]:          1 :     ovs_assert(d == -1);
    1030         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-.25", "%2lf", &d));
    1031         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+123.e1", "%6lf", &d));
    1032         [ -  + ]:          1 :     ovs_assert(!ovs_scan("25e-2", "%4lf", &d));
    1033                 :            : 
    1034         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%Lf", &ld));
    1035         [ -  + ]:          1 :     ovs_assert(ld == 0.25);
    1036         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%Lf", &ld));
    1037         [ -  + ]:          1 :     ovs_assert(ld == 1.0);
    1038         [ -  + ]:          1 :     ovs_assert(ovs_scan("-5", "%Lf", &ld));
    1039         [ -  + ]:          1 :     ovs_assert(ld == -5.0);
    1040         [ -  + ]:          1 :     ovs_assert(ovs_scan("+6", "%Lf", &ld));
    1041         [ -  + ]:          1 :     ovs_assert(ld == 6.0);
    1042         [ -  + ]:          1 :     ovs_assert(ovs_scan("-1e5", "%Lf", &ld));
    1043         [ -  + ]:          1 :     ovs_assert(ld == -1e5);
    1044         [ -  + ]:          1 :     ovs_assert(ovs_scan("-.25", "%Lf", &ld));
    1045         [ -  + ]:          1 :     ovs_assert(ld == -.25);
    1046         [ -  + ]:          1 :     ovs_assert(ovs_scan("+123.e1", "%Lf", &ld));
    1047         [ -  + ]:          1 :     ovs_assert(ld == 1230.0);
    1048         [ -  + ]:          1 :     ovs_assert(ovs_scan("25e-2", "%Lf", &ld));
    1049         [ -  + ]:          1 :     ovs_assert(ld == 0.25);
    1050         [ -  + ]:          1 :     ovs_assert(ovs_scan("0.25", "%1Lf %Lf", &ld, &ld2));
    1051         [ -  + ]:          1 :     ovs_assert(ld == 0);
    1052         [ -  + ]:          1 :     ovs_assert(ld2 == 0.25);
    1053         [ -  + ]:          1 :     ovs_assert(ovs_scan("1.0", "%2Lf %Lf", &ld, &ld2));
    1054         [ -  + ]:          1 :     ovs_assert(ld == 1.0);
    1055         [ -  + ]:          1 :     ovs_assert(ld2 == 0.0);
    1056         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-5", "%1Lf", &ld));
    1057         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+6", "%1Lf", &ld));
    1058         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-1e5", "%2Lf %*f", &ld));
    1059         [ -  + ]:          1 :     ovs_assert(ld == -1);
    1060         [ -  + ]:          1 :     ovs_assert(!ovs_scan("-.25", "%2Lf", &ld));
    1061         [ -  + ]:          1 :     ovs_assert(!ovs_scan("+123.e1", "%6Lf", &ld));
    1062         [ -  + ]:          1 :     ovs_assert(!ovs_scan("25e-2", "%4Lf", &ld));
    1063                 :            : 
    1064         [ -  + ]:          1 :     ovs_assert(ovs_scan(" Hello,\tworld ", "%*s%n%*s%n", &n, &n2));
    1065         [ -  + ]:          1 :     ovs_assert(n == 7);
    1066         [ -  + ]:          1 :     ovs_assert(n2 == 13);
    1067         [ -  + ]:          1 :     ovs_assert(!ovs_scan(" Hello,\tworld ", "%*s%*s%*s"));
    1068         [ -  + ]:          1 :     ovs_assert(ovs_scan(" Hello,\tworld ", "%6s%n%5s%n", str, &n, str2, &n2));
    1069         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "Hello,"));
    1070         [ -  + ]:          1 :     ovs_assert(n == 7);
    1071         [ -  + ]:          1 :     ovs_assert(!strcmp(str2, "world"));
    1072         [ -  + ]:          1 :     ovs_assert(n2 == 13);
    1073         [ -  + ]:          1 :     ovs_assert(ovs_scan(" Hello,\tworld ", "%5s%5s%5s", str, str2, str3));
    1074         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "Hello"));
    1075         [ -  + ]:          1 :     ovs_assert(!strcmp(str2, ","));
    1076         [ -  + ]:          1 :     ovs_assert(!strcmp(str3, "world"));
    1077         [ -  + ]:          1 :     ovs_assert(!ovs_scan(" ", "%*s"));
    1078                 :            : 
    1079         [ -  + ]:          1 :     ovs_assert(ovs_scan(" Hello,\tworld ", "%*c%n%*c%n%c%n",
    1080                 :            :                         &n, &n2, &c, &n3));
    1081         [ -  + ]:          1 :     ovs_assert(n == 1);
    1082         [ -  + ]:          1 :     ovs_assert(n2 == 2);
    1083         [ -  + ]:          1 :     ovs_assert(c == 'e');
    1084         [ -  + ]:          1 :     ovs_assert(n3 == 3);
    1085         [ -  + ]:          1 :     ovs_assert(ovs_scan(" Hello,\tworld ", "%*5c%5c", str));
    1086         [ -  + ]:          1 :     ovs_assert(!memcmp(str, "o,\two", 5));
    1087         [ -  + ]:          1 :     ovs_assert(!ovs_scan(" Hello,\tworld ", "%*15c"));
    1088                 :            : 
    1089         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x1234xyzzy", "%9[x0-9a-fA-F]%n", str, &n));
    1090         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "0x1234x"));
    1091         [ -  + ]:          1 :     ovs_assert(n == 7);
    1092         [ -  + ]:          1 :     ovs_assert(ovs_scan("foo:bar=baz", "%5[^:=]%n:%5[^:=]%n=%5[^:=]%n",
    1093                 :            :                         str, &n, str2, &n2, str3, &n3));
    1094         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "foo"));
    1095         [ -  + ]:          1 :     ovs_assert(n == 3);
    1096         [ -  + ]:          1 :     ovs_assert(!strcmp(str2, "bar"));
    1097         [ -  + ]:          1 :     ovs_assert(n2 == 7);
    1098         [ -  + ]:          1 :     ovs_assert(!strcmp(str3, "baz"));
    1099         [ -  + ]:          1 :     ovs_assert(n3 == 11);
    1100         [ -  + ]:          1 :     ovs_assert(!ovs_scan(" ", "%*[0-9]"));
    1101         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x123a]4xyzzy-", "%[]x0-9a-fA-F]", str));
    1102         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "0x123a]4x"));
    1103         [ -  + ]:          1 :     ovs_assert(ovs_scan("abc]xyz","%[^]xyz]", str));
    1104         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "abc"));
    1105         [ -  + ]:          1 :     ovs_assert(!ovs_scan("0x123a]4xyzzy-", "%[x0-9]a-fA-F]", str));
    1106         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x12-3]xyz", "%[x0-9a-f-]", str));
    1107         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "0x12-3"));
    1108         [ -  + ]:          1 :     ovs_assert(ovs_scan("0x12-3]xyz", "%[^a-f-]", str));
    1109         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "0x12"));
    1110         [ -  + ]:          1 :     ovs_assert(sscanf("0x12-3]xyz", "%[^-a-f]", str));
    1111         [ -  + ]:          1 :     ovs_assert(!strcmp(str, "0x12"));
    1112                 :          1 : }
    1113                 :            : 
    1114                 :            : static void
    1115                 :          1 : test_snprintf(struct ovs_cmdl_context *ctx OVS_UNUSED)
    1116                 :            : {
    1117                 :            :     char s[16];
    1118                 :            : 
    1119         [ -  + ]:          1 :     ovs_assert(snprintf(s, 4, "abcde") == 5);
    1120         [ -  + ]:          1 :     ovs_assert(!strcmp(s, "abc"));
    1121                 :            : 
    1122         [ -  + ]:          1 :     ovs_assert(snprintf(s, 5, "abcde") == 5);
    1123         [ -  + ]:          1 :     ovs_assert(!strcmp(s, "abcd"));
    1124                 :            : 
    1125         [ -  + ]:          1 :     ovs_assert(snprintf(s, 6, "abcde") == 5);
    1126         [ -  + ]:          1 :     ovs_assert(!strcmp(s, "abcde"));
    1127                 :            : 
    1128         [ -  + ]:          1 :     ovs_assert(snprintf(NULL, 0, "abcde") == 5);
    1129                 :          1 : }
    1130                 :            : 
    1131                 :            : #ifndef _WIN32
    1132                 :            : static void
    1133                 :         13 : test_file_name(struct ovs_cmdl_context *ctx)
    1134                 :            : {
    1135                 :            :     int i;
    1136                 :            : 
    1137         [ +  + ]:         26 :     for (i = 1; i < ctx->argc; i++) {
    1138                 :            :         char *dir, *base;
    1139                 :            : 
    1140                 :         13 :         dir = dir_name(ctx->argv[i]);
    1141                 :         13 :         puts(dir);
    1142                 :         13 :         free(dir);
    1143                 :            : 
    1144                 :         13 :         base = base_name(ctx->argv[i]);
    1145                 :         13 :         puts(base);
    1146                 :         13 :         free(base);
    1147                 :            :     }
    1148                 :         13 : }
    1149                 :            : #endif /* _WIN32 */
    1150                 :            : 
    1151                 :            : static const struct ovs_cmdl_command commands[] = {
    1152                 :            :     {"ctz", NULL, 0, 0, test_ctz, OVS_RO},
    1153                 :            :     {"clz", NULL, 0, 0, test_clz, OVS_RO},
    1154                 :            :     {"round_up_pow2", NULL, 0, 0, test_round_up_pow2, OVS_RO},
    1155                 :            :     {"round_down_pow2", NULL, 0, 0, test_round_down_pow2, OVS_RO},
    1156                 :            :     {"count_1bits", NULL, 0, 0, test_count_1bits, OVS_RO},
    1157                 :            :     {"log_2_floor", NULL, 0, 0, test_log_2_floor, OVS_RO},
    1158                 :            :     {"bitwise_copy", NULL, 0, 0, test_bitwise_copy, OVS_RO},
    1159                 :            :     {"bitwise_zero", NULL, 0, 0, test_bitwise_zero, OVS_RO},
    1160                 :            :     {"bitwise_one", NULL, 0, 0, test_bitwise_one, OVS_RO},
    1161                 :            :     {"bitwise_is_all_zeros", NULL, 0, 0, test_bitwise_is_all_zeros, OVS_RO},
    1162                 :            :     {"bitwise_rscan", NULL, 0, 0, test_bitwise_rscan, OVS_RO},
    1163                 :            :     {"follow-symlinks", NULL, 1, INT_MAX, test_follow_symlinks, OVS_RO},
    1164                 :            :     {"assert", NULL, 0, 0, test_assert, OVS_RO},
    1165                 :            :     {"ovs_scan", NULL, 0, 0, test_ovs_scan, OVS_RO},
    1166                 :            :     {"snprintf", NULL, 0, 0, test_snprintf, OVS_RO},
    1167                 :            : #ifndef _WIN32
    1168                 :            :     {"file_name", NULL, 1, INT_MAX, test_file_name, OVS_RO},
    1169                 :            : #endif
    1170                 :            :     {NULL, NULL, 0, 0, NULL, OVS_RO},
    1171                 :            : };
    1172                 :            : 
    1173                 :            : static void
    1174                 :         46 : parse_options(int argc, char *argv[])
    1175                 :            : {
    1176                 :            :     enum {
    1177                 :            :         VLOG_OPTION_ENUMS
    1178                 :            :     };
    1179                 :            :     static const struct option long_options[] = {
    1180                 :            :         VLOG_LONG_OPTIONS,
    1181                 :            :         {NULL, 0, NULL, 0},
    1182                 :            :     };
    1183                 :         46 :     char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
    1184                 :            : 
    1185                 :            :     for (;;) {
    1186                 :         46 :         int c = getopt_long(argc, argv, short_options, long_options, NULL);
    1187         [ +  - ]:         46 :         if (c == -1) {
    1188                 :         46 :             break;
    1189                 :            :         }
    1190                 :            : 
    1191   [ #  #  #  #  :          0 :         switch (c) {
                   #  # ]
    1192                 :          0 :         VLOG_OPTION_HANDLERS
    1193                 :            : 
    1194                 :            :         case '?':
    1195                 :          0 :             exit(EXIT_FAILURE);
    1196                 :            : 
    1197                 :            :         default:
    1198                 :          0 :             abort();
    1199                 :            :         }
    1200                 :          0 :     }
    1201                 :         46 :     free(short_options);
    1202                 :         46 : }
    1203                 :            : 
    1204                 :            : static void
    1205                 :         46 : test_util_main(int argc, char *argv[])
    1206                 :            : {
    1207                 :         46 :     struct ovs_cmdl_context ctx = { .argc = 0, };
    1208                 :         46 :     set_program_name(argv[0]);
    1209                 :         46 :     parse_options(argc, argv);
    1210                 :            :     /* On Windows, stderr is fully buffered if connected to a pipe.
    1211                 :            :      * Make it _IONBF so that an abort does not miss log contents.
    1212                 :            :      * POSIX doesn't define the circumstances in which stderr is
    1213                 :            :      * fully buffered either. */
    1214                 :         46 :     setvbuf(stderr, NULL, _IONBF, 0);
    1215                 :         46 :     ctx.argc = argc - optind;
    1216                 :         46 :     ctx.argv = argv + optind;
    1217                 :         46 :     ovs_cmdl_run_command(&ctx, commands);
    1218                 :         46 : }
    1219                 :            : 
    1220                 :       1266 : OVSTEST_REGISTER("test-util", test_util_main);

Generated by: LCOV version 1.12