LCOV - code coverage report
Current view: top level - src/core - pii_redact.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 91.3 % 23 21
Test Date: 2026-04-20 19:54:22 Functions: 100.0 % 1 1

            Line data    Source code
       1              : /* SPDX-License-Identifier: GPL-3.0-or-later */
       2              : /* Copyright 2026 Peter Csaszar */
       3              : 
       4              : #include "pii_redact.h"
       5              : #include <string.h>
       6              : #include <stdio.h>
       7              : 
       8            5 : void redact_phone(const char *phone, char *out, size_t cap) {
       9            5 :     if (!out || cap == 0) return;
      10            5 :     if (!phone || phone[0] == '\0') {
      11            2 :         snprintf(out, cap, "(null)");
      12            2 :         return;
      13              :     }
      14              : 
      15              :     /* Skip leading '+' for length accounting */
      16            3 :     const char *digits = phone;
      17            3 :     int has_plus = (phone[0] == '+');
      18            3 :     if (has_plus) digits++;
      19              : 
      20            3 :     size_t dlen = strlen(digits);
      21              : 
      22              :     /* If too short to redact meaningfully, mask entirely */
      23            3 :     if (dlen < 5) {
      24            1 :         snprintf(out, cap, "+****");
      25            1 :         return;
      26              :     }
      27              : 
      28              :     /* Show last 4 digits, mask the rest with '*' */
      29            2 :     size_t keep = 4;
      30            2 :     size_t mask = dlen - keep;
      31              : 
      32              :     /* +  <mask stars>  <last 4>  NUL */
      33            2 :     size_t needed = 1 + mask + keep + 1;
      34            2 :     if (needed > cap) {
      35              :         /* Not enough room — full mask */
      36            0 :         snprintf(out, cap, "+****");
      37            0 :         return;
      38              :     }
      39              : 
      40            2 :     size_t pos = 0;
      41            2 :     out[pos++] = '+';
      42           17 :     for (size_t i = 0; i < mask; i++) out[pos++] = '*';
      43              :     /* copy last 4 digits */
      44           10 :     for (size_t i = 0; i < keep; i++) out[pos++] = digits[mask + i];
      45            2 :     out[pos] = '\0';
      46              : }
        

Generated by: LCOV version 2.0-1