kwh-cost/kwh-cost.c

108 lines
3.5 KiB
C
Raw Permalink Normal View History

2021-12-23 23:59:00 +04:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2024-05-19 21:57:38 +04:00
#define VERSION "1.1.3"
typedef long double price_t;
typedef long double wattage_t;
typedef unsigned long interval_t;
int parse_arguments(const int argc, const char *const *const argv,
price_t *const price, wattage_t *const wattage, interval_t *const interval);
interval_t interval_to_seconds(const char *const interval);
price_t price_kwh_to_wattsecond(const price_t price);
void print_version(void);
void print_usage(void);
2021-12-23 23:59:00 +04:00
int main(const int argc, const char *const *const argv) {
2024-04-27 02:15:34 +04:00
price_t price = 0;
wattage_t wattage = 0;
interval_t interval = 0;
2021-12-23 23:59:00 +04:00
switch (parse_arguments(argc, argv, &price, &wattage, &interval)) {
2024-05-19 05:21:35 +04:00
case 1: print_usage(); return 0;
case 2: print_version(); return 0;
case 99: fputs("Unknown flag provided.\n", stderr); print_usage(); return 1;
}
printf("%.2Lf\n", (price * wattage) * interval);
2021-12-23 23:59:00 +04:00
return 0;
}
int parse_arguments(const int argc, const char *const *const argv,
price_t *const price, wattage_t *const wattage, interval_t *const interval) {
if (argc < 2) return 1;
2021-12-23 23:59:00 +04:00
for (int i = 1, pos = 0; i < argc; ++i)
2021-12-23 23:59:00 +04:00
if (argv[i][0] == '-') {
size_t l = strlen(argv[i]);
if (l == 1)
return 99;
if (argv[i][1] == 'h' || (argv[i][1] == '-' && l > 2 && argv[i][2] == 'h'))
return 1;
else if (argv[i][1] == 'v' || (argv[i][1] == '-' && l > 2 && argv[i][2] == 'v'))
return 2;
else
return 99;
} else if (argc < 4) {
return 1;
} else if (pos == 0) {
*price = price_kwh_to_wattsecond((price_t)atof(argv[i]));
++pos;
} else if (pos == 1) {
*wattage = (wattage_t)atof(argv[2]);
++pos;
} else
*interval += interval_to_seconds(argv[i]);
2021-12-23 23:59:00 +04:00
return 0;
2021-12-23 23:59:00 +04:00
}
interval_t interval_to_seconds(const char *const interval) {
2021-12-23 23:59:00 +04:00
interval_t intrvl = (interval_t)atol(interval);
switch (interval[strlen(interval) - 1]) {
case 'm':
case 'M':
return intrvl * 60;
case 'h':
case 'H':
return intrvl * 60 * 60;
case 'd':
case 'D':
return intrvl * 60 * 60 * 24;
default:
return intrvl;
}
2021-12-23 23:59:00 +04:00
}
price_t price_kwh_to_wattsecond(const price_t price) {
2021-12-23 23:59:00 +04:00
return price / 1000.f / 3600.f;
}
void print_version(void) {
fputs("kwh-cost Ver. " VERSION "\n"
"Copyright (C) 2021-2024 Alexander \"Arav\" Andreev <me@arav.su>. All rights reserved.\n"
2024-05-19 21:57:18 +04:00
"This program is distributed under the terms of MIT+NIGGER license.\n"
"You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
2021-12-23 23:59:00 +04:00
}
void print_usage(void) {
fputs("Usage: kwh-cost [OPTIONS] price wattage interval [interval ...]\n"
"Options:\n"
" --help, -h display this usage information.\n"
" --version, -v display program version.\n"
"Arguments:\n"
" price price per kWh.\n"
" wattage power usage in Watts.\n"
" interval time interval in seconds during which\n"
" this much power to be constantly used.\n"
" You may specify other time units such as:\n"
" m'inute, h'our, d'ay. Example: 5d 3h.\n"
" All given intervals will be summed up.\n", stderr);
}