// SPDX-License-Identifier: GPL-2.0
 #define _GNU_SOURCE
 
-#include <stdio.h>
+#include <err.h>
+#include <getopt.h>
 #include <stdbool.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <getopt.h>
 
 #define ARRAY_SIZE(x)  (sizeof(x) / sizeof((x)[0]))
 #define min(a, b)      (((a) < (b)) ? (a) : (b))
        if (!func->leafs) {
                func->leafs = malloc(sizeof(struct subleaf));
                if (!func->leafs)
-                       perror("malloc func leaf");
+                       err(EXIT_FAILURE, NULL);
 
                func->nr = 1;
        } else {
                s = func->nr;
                func->leafs = realloc(func->leafs, (s + 1) * sizeof(*leaf));
                if (!func->leafs)
-                       perror("realloc f->leafs");
+                       err(EXIT_FAILURE, NULL);
 
                func->nr++;
        }
 
        range = malloc(sizeof(struct cpuid_range));
        if (!range)
-               perror("malloc range");
+               err(EXIT_FAILURE, NULL);
 
        if (input_eax & 0x80000000)
                range->is_ext = true;
 
        range->funcs = malloc(sizeof(struct cpuid_func) * idx_func);
        if (!range->funcs)
-               perror("malloc range->funcs");
+               err(EXIT_FAILURE, NULL);
 
        range->nr = idx_func;
        memset(range->funcs, 0, sizeof(struct cpuid_func) * idx_func);
        return 0;
 
 err_exit:
-       printf("Warning: wrong line format:\n");
-       printf("\tline[%d]: %s\n", flines, line);
+       warnx("Wrong line format:\n"
+             "\tline[%d]: %s", flines, line);
        return -1;
 }
 
                file = fopen("./cpuid.csv", "r");
        }
 
-       if (!file) {
-               printf("Fail to open '%s'\n", filename);
-               return;
-       }
+       if (!file)
+               err(EXIT_FAILURE, "%s", filename);
 
        while (1) {
                ret = getline(&line, &len, file);
        func_idx = index & 0xffff;
 
        if ((func_idx + 1) > (u32)range->nr) {
-               printf("ERR: invalid input index (0x%x)\n", index);
+               warnx("Invalid input index (0x%x)", index);
                return NULL;
        }
        return &range->funcs[func_idx];
                                return;
                        }
 
-                       printf("ERR: invalid input subleaf (0x%x)\n", user_sub);
+                       warnx("Invalid input subleaf (0x%x)", user_sub);
                }
 
                show_func(func);
 
 static void usage(void)
 {
-       printf("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n"
-               "\t-a|--all             Show both bit flags and complex bit fields info\n"
-               "\t-b|--bitflags        Show boolean flags only\n"
-               "\t-d|--detail          Show details of the flag/fields (default)\n"
-               "\t-f|--flags           Specify the cpuid csv file\n"
-               "\t-h|--help            Show usage info\n"
-               "\t-l|--leaf=index      Specify the leaf you want to check\n"
-               "\t-r|--raw             Show raw cpuid data\n"
-               "\t-s|--subleaf=sub     Specify the subleaf you want to check\n"
+       warnx("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n"
+             "\t-a|--all             Show both bit flags and complex bit fields info\n"
+             "\t-b|--bitflags        Show boolean flags only\n"
+             "\t-d|--detail          Show details of the flag/fields (default)\n"
+             "\t-f|--flags           Specify the CPUID CSV file\n"
+             "\t-h|--help            Show usage info\n"
+             "\t-l|--leaf=index      Specify the leaf you want to check\n"
+             "\t-r|--raw             Show raw CPUID data\n"
+             "\t-s|--subleaf=sub     Specify the subleaf you want to check"
        );
 }
 
                        user_sub = strtoul(optarg, NULL, 0);
                        break;
                default:
-                       printf("%s: Invalid option '%c'\n", argv[0], optopt);
+                       warnx("Invalid option '%c'", optopt);
                        return -1;
        }