Compare commits
No commits in common. "master" and "1.1.2" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
|
*.o
|
||||||
kwh-cost
|
kwh-cost
|
||||||
.vscode
|
.vscode
|
28
Makefile
28
Makefile
@ -1,29 +1,27 @@
|
|||||||
TARGET := kwh-cost
|
TARGET=kwh-cost
|
||||||
|
|
||||||
DESTDIR ?=
|
DESTDIR:=
|
||||||
PREFIX ?= /usr/local
|
PREFIX:=/usr/local
|
||||||
|
|
||||||
CC ?= cc
|
CFLAGS=--std=c99 -O3 -Wall -Werror -Wextra -pedantic
|
||||||
CFLAGS := -std=c99 -O3 -Wall -Werror -Wextra -pedantic
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: clean install uninstall test
|
.PHONY: clean install uninstall test
|
||||||
|
|
||||||
${TARGET}: ${TARGET}.c
|
${TARGET}: main.c
|
||||||
${CC} ${CFLAGS} $< -o $@
|
${CC} ${CFLAGS} ${LDFLAGS} $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ${TARGET}
|
rm ${TARGET}
|
||||||
|
|
||||||
install: | ${TARGET}
|
install:
|
||||||
install -spDm755 ${TARGET} ${DESTDIR}${PREFIX}/bin/${TARGET}
|
install -Dm755 ${TARGET} ${DESTDIR}${PREFIX}/bin/${TARGET}
|
||||||
install -pDm644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
|
install -Dm644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -f ${DESTDIR}${PREFIX}/bin/${TARGET}
|
rm -f ${DESTDIR}${PREFIX}/bin/${TARGET}
|
||||||
rm -f ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
|
rm -rf ${DESTDIR}${PREFIX}/share/licenses/${TARGET}
|
||||||
rmdir ${DESTDIR}${PREFIX}/share/licenses/${TARGET}
|
|
||||||
|
|
||||||
test: | ${TARGET}
|
test:
|
||||||
@echo -en "Does input \e[36m\"3.68 120 30d\"\e[0m gives 317.95? "
|
@echo -n "Does input \"3.68 120 30d\" gives 317.95? "
|
||||||
@test "${shell ./kwh-cost 3.68 120 30d}" = "317.95" && { echo -e "\e[32mYES\e[0m"; } || { echo -e "\e[31mNO\e[0m"; }
|
@test "${shell ./kwh-cost 3.68 120 30d}" = "317.95" && { echo -e "\e[32mYES\e[0m"; } || { echo -e "\e[31mNO\e[0m"; }
|
3
PKGBUILD
3
PKGBUILD
@ -1,11 +1,12 @@
|
|||||||
# Maintainer: Alexander "Arav" Andreev <me@arav.su>
|
# Maintainer: Alexander "Arav" Andreev <me@arav.su>
|
||||||
pkgname=kwh-cost
|
pkgname=kwh-cost
|
||||||
pkgver=1.2.0
|
pkgver=1.1.2
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Calculates cost of electricity."
|
pkgdesc="Calculates cost of electricity."
|
||||||
arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64')
|
arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64')
|
||||||
url="https://git.arav.su/Arav/kwh-cost"
|
url="https://git.arav.su/Arav/kwh-cost"
|
||||||
license=('MIT')
|
license=('MIT')
|
||||||
|
options=('strip')
|
||||||
source=("${pkgver}.tar.gz::https://git.arav.su/Arav/kwh-cost/archive/${pkgver}.tar.gz")
|
source=("${pkgver}.tar.gz::https://git.arav.su/Arav/kwh-cost/archive/${pkgver}.tar.gz")
|
||||||
md5sums=('SKIP')
|
md5sums=('SKIP')
|
||||||
|
|
||||||
|
14
README.md
14
README.md
@ -8,14 +8,12 @@ Calculates cost of electricity.
|
|||||||
$ kwh-cost [OPTIONS] price wattage interval [interval ..]
|
$ kwh-cost [OPTIONS] price wattage interval [interval ..]
|
||||||
```
|
```
|
||||||
|
|
||||||
Options are `-v` to show program's version; and `-h` to show usage of a program.
|
Options are `-v, --version` to show program's version; and `-h, --help` to show usage of a program.
|
||||||
|
|
||||||
`price` is a price per kWh. `wattage` is how many Watts being consumed. `interval` is for how long.
|
`price` is a price per kWh. `wattage` is how many Watts being consumed. `interval` is for how long.
|
||||||
|
|
||||||
`wattage` is in Watts, but it can come with following units: `m`, `k|K`, `M`, `G`, `T`.
|
`interval` is in seconds, but you can specify a unit. Units are the following:
|
||||||
|
`m|M` for minutes; `h|H` for hours; and `d|D` for days. There could be as many `interval`s passed as you need.
|
||||||
`interval` is in seconds, but the following units are supported: `m|M` for minutes; `h|H` for hours;
|
|
||||||
and `d|D` for days. Also, there could be as many `interval`s passed as you need.
|
|
||||||
|
|
||||||
Here is an example:
|
Here is an example:
|
||||||
|
|
||||||
@ -29,11 +27,9 @@ Will give 348.29.
|
|||||||
|
|
||||||
### Manually
|
### Manually
|
||||||
|
|
||||||
Just run `make install` to build and copy executable in `/usr/local/bin/`, set a `PREFIX=` variable to change a default `/usr/local` path. Or just run `make` to only build an executable.
|
First run `make` to build a program, and then `make install` to copy executable in `/usr/local/bin/`. Later, use `make uninstall` to delete it, or just delete `/usr/local/bin/kwh-cost`.
|
||||||
|
|
||||||
Use `make uninstall` to delete it (don't forget about the `PREFIX=` variable if you previously set it), or just delete `${PREFIX}/bin/kwh-cost` by hand.
|
A `LICENSE` file is also being copied to `/usr/local/share/licenses/kwh-cost/LICENSE`.
|
||||||
|
|
||||||
A `LICENSE` file is also being copied to `${PREFIX}/share/licenses/kwh-cost/LICENSE`.
|
|
||||||
|
|
||||||
### For ArchLinux
|
### For ArchLinux
|
||||||
|
|
||||||
|
@ -2,12 +2,66 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define VERSION "1.2.0"
|
#define VERSION "1.1.2"
|
||||||
|
|
||||||
typedef long double price_t;
|
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;
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
int main(const int argc, const char *const *const argv) {
|
||||||
|
price_t price = 0;
|
||||||
|
wattage_t wattage = 0;
|
||||||
|
interval_t interval = 0;
|
||||||
|
|
||||||
|
switch (parse_arguments(argc, argv, &price, &wattage, &interval)) {
|
||||||
|
case 1: print_usage(); exit(0);
|
||||||
|
case 2: print_version(); exit(0);
|
||||||
|
case 99: fputs("Unknown flag provided.\n", stderr); print_usage(); exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%.2Lf\n", (price * wattage) * interval);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
for (int i = 1, pos = 0; i < argc; ++i)
|
||||||
|
if (argv[i][0] == '-') {
|
||||||
|
size_t l = strlen(argv[i]);
|
||||||
|
if (l < 2)
|
||||||
|
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]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
interval_t interval_to_seconds(const char *const interval) {
|
interval_t interval_to_seconds(const char *const interval) {
|
||||||
interval_t intrvl = (interval_t)atol(interval);
|
interval_t intrvl = (interval_t)atol(interval);
|
||||||
|
|
||||||
@ -26,88 +80,28 @@ interval_t interval_to_seconds(const char *const interval) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wattage_t wattage_to_watts(const char *const wattage) {
|
|
||||||
wattage_t wattg = (wattage_t)atof(wattage);
|
|
||||||
|
|
||||||
switch (wattage[strlen(wattage)-1]) {
|
|
||||||
case 'm':
|
|
||||||
return wattg / 1000.;
|
|
||||||
case 'k':
|
|
||||||
case 'K':
|
|
||||||
return wattg * 1000.;
|
|
||||||
case 'M':
|
|
||||||
return wattg * 1000000.;
|
|
||||||
case 'G':
|
|
||||||
return wattg * 1000000000.;
|
|
||||||
case 'T':
|
|
||||||
return wattg * 1000000000000.;
|
|
||||||
default:
|
|
||||||
return wattg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
price_t price_kwh_to_wattsecond(const price_t price) {
|
price_t price_kwh_to_wattsecond(const price_t price) {
|
||||||
return price / 1000.f / 3600.f;
|
return price / 1000.f / 3600.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
for (int i = 1, pos = 0; i < argc; ++i)
|
|
||||||
if (argv[i][0] == '-') {
|
|
||||||
if (strlen(argv[i]) < 2) return 99;
|
|
||||||
switch (argv[i][1]) {
|
|
||||||
case 'h': return 1;
|
|
||||||
case 'v': return 2;
|
|
||||||
default: 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_to_watts(argv[2]);
|
|
||||||
++pos;
|
|
||||||
} else
|
|
||||||
*interval += interval_to_seconds(argv[i]);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_version(void) {
|
void print_version(void) {
|
||||||
fputs("kwh-cost Ver. " VERSION "\n"
|
fputs("kwh-cost Ver. " VERSION "\n"
|
||||||
"Copyright (C) 2021-2024 Alexander \"Arav\" Andreev <me@arav.su>. All rights reserved.\n"
|
"Copyright (C) 2021-2024 Alexander \"Arav\" Andreev <me@arav.su>. All rights reserved.\n"
|
||||||
"This program is distributed under the terms of MIT+NIGGER license.\n"
|
"This program is distributed under the terms of MIT+NIGGER licence.\n"
|
||||||
"A license for this program is placed in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
|
"You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_usage(void) {
|
void print_usage(void) {
|
||||||
fputs("Usage: kwh-cost [OPTIONS] price wattage interval [interval ...]\n"
|
fputs("Usage: kwh-cost [OPTIONS] price wattage interval [interval ...]\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -h display this usage information.\n"
|
" --help, -h display this usage information.\n"
|
||||||
" -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 power usage in Watts (m, K, M, G, T).\n"
|
" wattage power usage in Watts.\n"
|
||||||
" interval time interval in seconds (m'inutes, h'ours, d'ays,\n"
|
" interval time interval in seconds during which\n"
|
||||||
" like 5d 3h) during which given power is constantly used.\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);
|
" All given intervals will be summed up.\n", stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(const int argc, const char *const *const argv) {
|
|
||||||
price_t price = 0;
|
|
||||||
wattage_t wattage = 0;
|
|
||||||
interval_t interval = 0;
|
|
||||||
|
|
||||||
switch (parse_arguments(argc, argv, &price, &wattage, &interval)) {
|
|
||||||
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);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user