1
0
Fork 0

Compare commits

...

3 Commits

Author SHA1 Message Date
Alexander Andreev 485f69d1e5
[main.h] Renoved struct arguments_t.
Changed definition of `parse_arguments`.
`to_seconds` -> `interval_to_seconds`, and inlined.
`print_version` and `print_usage` are inlined.
2021-12-25 23:29:38 +04:00
Alexander Andreev b457c60f75
[main.c] Structure arguments_t removed. Use ptrs to vars instead. `parse_arguments` now returns status codes instead of printing stuff and closing program.
`to_wattpersecond` is now `to_wattspersecond`.
Fixed typo in usage, capitalised `options` word. Rephrased `print_version` text.
Removed unnecessary check from `interval_to_seconds` (former `to_seconds`) function.
2021-12-25 23:27:53 +04:00
Alexander Andreev 1799c62c48
[Makefile] Added .PHONY. Removed object compilation. This project won't get extra .c files anyway, so let's compile directly into executable. 2021-12-25 23:22:32 +04:00
3 changed files with 71 additions and 89 deletions

View File

@ -7,17 +7,14 @@ OBJ_DIR=obj
DESTDIR=/ DESTDIR=/
.PHONY: all ${TARGET} clean install uninstall
all: ${TARGET} all: ${TARGET}
${TARGET}: ${OBJ_DIR}/main.o ${TARGET}: ${SRC_DIR}/main.c ${SRC_DIR}/main.h
${CC} ${CFLAGS} $< -o $@ ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@
${OBJ_DIR}/main.o: ${SRC_DIR}/main.c ${SRC_DIR}/main.h
@mkdir -p ${OBJ_DIR}
${CC} ${CFLAGS} -c $< -o $@
clean: clean:
rm -r ${OBJ_DIR}
rm ${TARGET} rm ${TARGET}
install: install:

View File

@ -5,91 +5,85 @@
#include "main.h" #include "main.h"
int main(int argc, char **argv) { int main(int argc, char **argv) {
arguments_t * args = parse_arguments(argc, argv); price_t price;
wattage_t wattage;
interval_t interval = 0;
printf("%.2Lf\n", (args->price * args->wattage) * args->interval); int res = parse_arguments(argc, argv, &price, &wattage, &interval);
if (res != 0) {
free(args); if (res == 1)
return 0; print_usage();
} else if (res == 2)
print_version();
arguments_t * parse_arguments(int argc, char **argv) {
if (argc == 1) {
print_usage();
exit(0); exit(0);
} }
arguments_t *args = (arguments_t *)calloc(1, sizeof(arguments_t)); printf("%.2Lf\n", (price * wattage) * interval);
int pos_args_pos = 0;
for (int i = 1; i < argc; ++i) { return 0;
}
int parse_arguments(int argc, char **argv, price_t *price, wattage_t *wattage, interval_t *interval) {
if (argc < 2) return 1;
for (int i = 1, pos = 0; i < argc; ++i)
if (argv[i][0] == '-') { if (argv[i][0] == '-') {
if (argv[i][1] == 'h' || argv[i][2] == 'h') { if (argv[i][1] == 'h' || argv[i][2] == 'h')
print_usage(); return 1;
exit(0); else if (argv[i][1] == 'v' || argv[i][2] == 'v')
} else if (argv[i][1] == 'v' || argv[i][2] == 'v') { return 2;
print_version(); } else if (argc < 4) {
exit(0); return 1;
} } else if (pos == 0) {
} else if (pos_args_pos == 0) { *price = to_wattspersecond((price_t)atof(argv[i]));
args->price = to_wattpersecond((price_t)atof(argv[i])); ++pos;
pos_args_pos++; } else if (pos == 1) {
} else if (pos_args_pos == 1) { *wattage = (wattage_t)atof(argv[2]);
args->wattage = atof(argv[i]); ++pos;
pos_args_pos++; } else
} else if (pos_args_pos > 1) { *interval += (interval_t)interval_to_seconds(argv[i]);
args->interval += to_seconds(argv[i]);
pos_args_pos++;
}
}
if (pos_args_pos < 3) { return 0;
print_usage();
exit(1);
}
return args;
} }
interval_t to_seconds(char *interval) { inline interval_t interval_to_seconds(char *interval) {
interval_t intrvl = (interval_t)atol(interval); interval_t intrvl = (interval_t)atol(interval);
char unit = interval[strlen(interval) - 1];
if (!(unit >= '0' && unit <= '9')) switch (interval[strlen(interval) - 1]) {
switch (unit) { case 'm':
case 'm': case 'M':
case 'M': return intrvl * 60;
return intrvl * 60; case 'h':
case 'h': case 'H':
case 'H': return intrvl * 60 * 60;
return intrvl * 60 * 60; case 'd':
case 'd': case 'D':
case 'D': return intrvl * 60 * 60 * 24;
return intrvl * 60 * 60 * 24; default:
} return intrvl;
return intrvl; }
} }
inline price_t to_wattpersecond(price_t price) { inline price_t to_wattspersecond(price_t price) {
return price / 1000.f / 3600.f; return price / 1000.f / 3600.f;
} }
void print_version() { inline void print_version() {
puts("kwh-cost Ver. " VERSION "\n" puts("kwh-cost Ver. " VERSION "\n"
"Copyright (C) 2021 Alexander \"Arav\" Andreev <me@arav.top>. All rights reserved.\n" "Copyright (C) 2021 Alexander \"Arav\" Andreev <me@arav.top>. All rights reserved.\n"
"License for this program is stored in /usr/share/licenses/kwh-cost/LICENSE."); "You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.");
} }
void print_usage() { inline void print_usage() {
puts("Usage: kwh-cost [options] price wattage interval [interval ...]\n" puts("Usage: kwh-cost [OPTIONS] price wattage interval [interval ...]\n"
"Options:\n" "Options:\n"
" --help, -h Display this usage information.\n" " --help, -h Display this usage information.\n"
" --version, -v Display program version.\n" " --version, -v Display program version.\n"
"Arguments:\n" "Arguments:\n"
" price Price per kWh.\n" " price Price per kWh.\n"
" wattage Specify power usage in Watts.\n" " wattage Specify power usage in Watts.\n"
" interval Time interval in seconds total cost to be calculated for.\n" " interval Time interval in seconds total cost to be calculated for.\n"
" You may specify other time units such as:\n" " You may specify other time units such as:\n"
" m'imute, h'our, d'ay. Example: 5d 3h.\n" " m'inute, h'our, d'ay. Example: 5d 3h.\n"
" All given intervals will be summed up."); " All given intervals will be summed up.");
} }

View File

@ -7,21 +7,12 @@ typedef long double price_t;
typedef long double wattage_t; typedef long double wattage_t;
typedef unsigned long interval_t; typedef unsigned long interval_t;
typedef struct { int parse_arguments(int argc, char **argv, price_t *price, wattage_t *wattage, interval_t *interval);
price_t price;
wattage_t wattage;
interval_t interval;
} arguments_t;
arguments_t *parse_arguments(int argc, char **argv); inline interval_t interval_to_seconds(char *interval);
inline price_t to_wattspersecond(price_t price);
interval_t to_seconds(char *interval);
inline price_t to_wattpersecond(price_t price);
void print_version();
void print_usage();
inline void print_version();
inline void print_usage();
#endif #endif