Compare commits

...

17 Commits

Author SHA1 Message Date
241ebf7fb4
README was updated. 2024-11-04 15:39:05 +04:00
8e09177f24
Version was set to 1.2.0. Now m, K, M, G, T units can be specified for wattage. Dropped support for long arguments (--). Functions were reorganised. 2024-11-04 15:20:26 +04:00
ad6cbf62af
Remove -flto option. 2024-05-21 04:27:20 +04:00
97664825e2
Remove strip option, this is up to user to decide. 2024-05-20 18:28:08 +04:00
35894ebafc
Remove unused LDFLAGS. 2024-05-20 18:11:44 +04:00
49c2cf90d4
Added a cyan color to a test input. 2024-05-19 23:22:26 +04:00
5f802d2084
Also added a check for build of a TARGET in a test target. 2024-05-19 23:18:05 +04:00
3611b94ab6
Added -p flag to install to preserve timestamps, also added -s flag to strip debug data of an executable . 2024-05-19 23:17:04 +04:00
00f15ca913
Updated README. 2024-05-19 23:15:16 +04:00
6c1288d741
An extra - was removed from -std= CFLAGS option. This prevented compiling by tcc.
Also added -flto to enable link time optimisation.
2024-05-19 22:14:29 +04:00
8e4f505ad0
No .o object files produced, remove it from .gitignore. 2024-05-19 21:58:29 +04:00
79ab374f86
Version was set to 1.1.3. 2024-05-19 21:57:38 +04:00
acc7655e83
Fixed a typo licence -> license. 2024-05-19 21:57:18 +04:00
c657ed047c
Made a proper Makefile as it should be fixing many errors, like ignoring VAR overwriting. Also, wherever meaningful, = was replaced with := that evaluates once. Also made use of so-called "Order-only prerequisites" in an install target to build a program if it is not already built. Also removed a dangerous rm -rf with rm -f for a LICENSE file and rmdir for a directory. 2024-05-19 05:29:13 +04:00
c083462a63
Actually, argv[i] cannot has a length of 0, so let's compare here against 1, meaning there was just a '-' was passed. 2024-05-19 05:23:47 +04:00
a469ae41a2
Replace exit() with simple return; 2024-05-19 05:21:35 +04:00
62a16292ec
main.c -> kwh-cost.c 2024-05-19 04:36:33 +04:00
5 changed files with 95 additions and 85 deletions

1
.gitignore vendored
View File

@ -1,3 +1,2 @@
*.o
kwh-cost
.vscode

View File

@ -1,27 +1,29 @@
TARGET=kwh-cost
TARGET := kwh-cost
DESTDIR:=
PREFIX:=/usr/local
DESTDIR ?=
PREFIX ?= /usr/local
CFLAGS=--std=c99 -O3 -Wall -Werror -Wextra -pedantic
CC ?= cc
CFLAGS := -std=c99 -O3 -Wall -Werror -Wextra -pedantic
.PHONY: clean install uninstall test
${TARGET}: main.c
${CC} ${CFLAGS} ${LDFLAGS} $< -o $@
${TARGET}: ${TARGET}.c
${CC} ${CFLAGS} $< -o $@
clean:
rm ${TARGET}
rm -f ${TARGET}
install:
install -Dm755 ${TARGET} ${DESTDIR}${PREFIX}/bin/${TARGET}
install -Dm644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
install: | ${TARGET}
install -spDm755 ${TARGET} ${DESTDIR}${PREFIX}/bin/${TARGET}
install -pDm644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
uninstall:
rm -f ${DESTDIR}${PREFIX}/bin/${TARGET}
rm -rf ${DESTDIR}${PREFIX}/share/licenses/${TARGET}
rm -f ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
rmdir ${DESTDIR}${PREFIX}/share/licenses/${TARGET}
test:
@echo -n "Does input \"3.68 120 30d\" gives 317.95? "
test: | ${TARGET}
@echo -en "Does input \e[36m\"3.68 120 30d\"\e[0m 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"; }

View File

@ -1,12 +1,11 @@
# Maintainer: Alexander "Arav" Andreev <me@arav.su>
pkgname=kwh-cost
pkgver=1.1.2
pkgver=1.2.0
pkgrel=1
pkgdesc="Calculates cost of electricity."
arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64')
url="https://git.arav.su/Arav/kwh-cost"
license=('MIT')
options=('strip')
source=("${pkgver}.tar.gz::https://git.arav.su/Arav/kwh-cost/archive/${pkgver}.tar.gz")
md5sums=('SKIP')

View File

@ -8,12 +8,14 @@ Calculates cost of electricity.
$ kwh-cost [OPTIONS] price wattage interval [interval ..]
```
Options are `-v, --version` to show program's version; and `-h, --help` to show usage of a program.
Options are `-v` to show program's version; and `-h` to show usage of a program.
`price` is a price per kWh. `wattage` is how many Watts being consumed. `interval` is for how long.
`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.
`wattage` is in Watts, but it can come with following units: `m`, `k|K`, `M`, `G`, `T`.
`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:
@ -27,9 +29,11 @@ Will give 348.29.
### Manually
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`.
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.
A `LICENSE` file is also being copied to `/usr/local/share/licenses/kwh-cost/LICENSE`.
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 `${PREFIX}/share/licenses/kwh-cost/LICENSE`.
### For ArchLinux

View File

@ -2,66 +2,12 @@
#include <stdlib.h>
#include <string.h>
#define VERSION "1.1.2"
#define VERSION "1.2.0"
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);
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 intrvl = (interval_t)atol(interval);
@ -80,28 +26,88 @@ 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) {
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) {
fputs("kwh-cost Ver. " VERSION "\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 licence.\n"
"You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
"This program is distributed under the terms of MIT+NIGGER license.\n"
"A license for this program is placed in /usr/share/licenses/kwh-cost/LICENSE.\n", stderr);
}
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"
" -h display this usage information.\n"
" -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"
" wattage power usage in Watts (m, K, M, G, T).\n"
" interval time interval in seconds (m'inutes, h'ours, d'ays,\n"
" like 5d 3h) during which given power is constantly used.\n"
" 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;
}