Compare commits

..

No commits in common. "master" and "1.0.0" have entirely different histories.

7 changed files with 137 additions and 131 deletions

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2024 Alexander "Arav" Andreev <me@arav.su>
Copyright (c) 2021 Alexander "Arav" Andreev <me@arav.top>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@ -1,26 +1,29 @@
TARGET=kwh-cost
DESTDIR:=
PREFIX:=/usr/local
CFLAGS=--std=c2x -O3 -Wall -Werror -Wextra -pedantic
CFLAGS=--std=c99 -O3 -Wall -Werror -Wextra -pedantic
SRC_DIR=src
OBJ_DIR=obj
DESTDIR=/
.PHONY: clean install uninstall test
.PHONY: all ${TARGET} clean install uninstall
${TARGET}: main.c
all: ${TARGET}
${TARGET}: ${SRC_DIR}/main.c ${SRC_DIR}/main.h
${CC} ${CFLAGS} ${LDFLAGS} $< -o $@
clean:
rm ${TARGET}
install:
install -Dm755 ${TARGET} ${DESTDIR}${PREFIX}/bin/${TARGET}
install -Dm644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/${TARGET}/LICENSE
install -Dm755 ${TARGET} ${DESTDIR}usr/bin/${TARGET}
install -Dm644 LICENSE ${DESTDIR}usr/share/licenses/${TARGET}/LICENSE
uninstall:
rm -f ${DESTDIR}${PREFIX}/bin/${TARGET}
rm -rf ${DESTDIR}${PREFIX}/share/licenses/${TARGET}
rm -f ${DESTDIR}usr/bin/${TARGET}
rm -rf ${DESTDIR}usr/share/licenses/${TARGET}
test:
@echo -n "Does input \"3.68 120 30d\" gives 317.95? "

View File

@ -1,21 +1,24 @@
# Maintainer: Alexander "Arav" Andreev <me@arav.su>
pkgname=kwh-cost
pkgver=1.1.2
# Maintainer: Alexander "Arav" Andreev <me@arav.top>
pkgname=kwh-cost-git
pkgver=1.0.0
pkgrel=1
pkgdesc="Calculates cost of electricity."
arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64')
url="https://git.arav.su/Arav/kwh-cost"
url="https://git.arav.top/Arav/kwh-cost"
license=('MIT')
makedepends=('git' 'gcc')
provides=('kwh-cost')
conflicts=('kwh-cost')
options=('strip')
source=("${pkgver}.tar.gz::https://git.arav.su/Arav/kwh-cost/archive/${pkgver}.tar.gz")
source=('kwh-cost-git::git+https://git.arav.top/Arav/kwh-cost.git')
md5sums=('SKIP')
build() {
cd "$srcdir/$pkgname"
make
make DESTDIR="$pkgdir/"
}
package() {
cd "$srcdir/$pkgname"
make DESTDIR="$pkgdir" PREFIX="/usr" install
make DESTDIR="$pkgdir/" install
}

View File

@ -13,24 +13,24 @@ Options are `-v, --version` to show program's version; and `-h, --help` to show
`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.
`m` for minutes; `h` for hours; and `d` for days. There could be as many `interval`s passed as you need.
Here is an example:
```console
$ kwh-cost 4.02 120 30d 2h
$ kwh-cost 3.83 120 30d 2h
```
Will give 348.29.
Will give 331.83.
P.S.: Yeah, I pay 3.83 rubles per kWh. Which is just $0.05. :)
## Installation
### 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`.
A `LICENSE` file is also being copied to `/usr/local/share/licenses/kwh-cost/LICENSE`.
First run `make` to build a program, and then `make install` to copy executable in `/usr/bin/`. Later, use `make uninstall` to delete it, or just delete `/usr/bin/kwh-cost`.
### For ArchLinux
You can take a [PKGBUILD](/Arav/kwh-cost/raw/branch/master/PKGBUILD) file and in a directory with it run `makepkg -i`.
You can take a [PKGBUILD](/Arav/kwh-cost/raw/branch/master/PKGBUILD) file and in a directory with it run `makepkg -i`.

107
main.c
View File

@ -1,107 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define VERSION "1.1.2"
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);
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;
}
}
price_t price_kwh_to_wattsecond(const price_t price) {
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"
"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);
}
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);
}

89
src/main.c Normal file
View File

@ -0,0 +1,89 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
int main(int const argc, const char * const * const argv) {
price_t price;
wattage_t wattage;
interval_t interval = 0;
int res = parse_arguments(argc, argv, &price, &wattage, &interval);
if (res != 0) {
if (res == 1)
print_usage();
else if (res == 2)
print_version();
exit(0);
}
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] == '-') {
if (argv[i][1] == 'h' || argv[i][2] == 'h')
return 1;
else if (argv[i][1] == 'v' || argv[i][2] == 'v')
return 2;
} else if (argc < 4) {
return 1;
} else if (pos == 0) {
*price = to_wattspersecond((price_t)atof(argv[i]));
++pos;
} else if (pos == 1) {
*wattage = (wattage_t)atof(argv[2]);
++pos;
} else
*interval += (interval_t)interval_to_seconds(argv[i]);
return 0;
}
inline interval_t interval_to_seconds(const char * const interval) {
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;
}
}
inline price_t to_wattspersecond(const price_t price) {
return price / 1000.f / 3600.f;
}
inline void print_version() {
puts("kwh-cost Ver. " VERSION "\n"
"Copyright (C) 2021 Alexander \"Arav\" Andreev <me@arav.top>. All rights reserved.\n"
"You can see a license for this program in /usr/share/licenses/kwh-cost/LICENSE.");
}
inline void print_usage() {
puts("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 Specify power usage in Watts.\n"
" interval Time interval in seconds total cost to be calculated for.\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.");
}

18
src/main.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _MAIN_H_
#define _MAIN_H_
#define VERSION "1.0.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);
inline interval_t interval_to_seconds(const char * const interval);
inline price_t to_wattspersecond(const price_t price);
inline void print_version();
inline void print_usage();
#endif