Move timediff functions to their own source file
This commit is contained in:
parent
c783d74e22
commit
78b73b18a4
4 changed files with 164 additions and 146 deletions
|
@ -1,12 +1,15 @@
|
||||||
CC = cc -Wall -Wextra
|
CC = cc -Wall -Wextra
|
||||||
INST_PATH = /usr/local/bin
|
INST_PATH = /usr/local/bin
|
||||||
|
|
||||||
baps1: main.o
|
baps1: main.o timediff.o
|
||||||
$(CC) -o baps1 main.o -lm
|
$(CC) -o baps1 main.o timediff.o -lm
|
||||||
|
|
||||||
main.o: main.c
|
main.o: main.c
|
||||||
$(CC) -c main.c
|
$(CC) -c main.c
|
||||||
|
|
||||||
|
timediff.o: timediff.c
|
||||||
|
$(CC) -c timediff.c
|
||||||
|
|
||||||
install: baps1
|
install: baps1
|
||||||
install baps1 $(INST_PATH)/baps1
|
install baps1 $(INST_PATH)/baps1
|
||||||
|
|
||||||
|
|
148
src/main.c
148
src/main.c
|
@ -1,151 +1,11 @@
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static char *
|
#include "timediff.h"
|
||||||
get_tty_name(void)
|
|
||||||
{ /* Returns the name of the tty connected to the file descriptor for
|
|
||||||
`stdin'. */
|
|
||||||
return ttyname(STDIN_FILENO);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
get_filename(void)
|
|
||||||
{ /* Generate the filename to be used for the current tty. Uses both
|
|
||||||
the user ID of the calling user and the name of the current tty
|
|
||||||
to make it unique. */
|
|
||||||
char *filename = malloc(sizeof(char) * 255);
|
|
||||||
char *tty = get_tty_name();
|
|
||||||
char *pch;
|
|
||||||
|
|
||||||
while ((pch = strchr(tty, '/')))
|
|
||||||
*pch = '_';
|
|
||||||
|
|
||||||
sprintf(filename, "/tmp/baps1_%u_%s", getuid(), tty);
|
|
||||||
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
static time_t
|
|
||||||
load_previous_time(char *filename)
|
|
||||||
{ /* Loads the previously saved timestamp from FILENAME. This function
|
|
||||||
assumes the file exists and is readable. */
|
|
||||||
FILE *timefile = fopen(filename, "r");
|
|
||||||
time_t prev;
|
|
||||||
|
|
||||||
fscanf(timefile, "%ld", &prev);
|
|
||||||
fclose(timefile);
|
|
||||||
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static time_t
|
|
||||||
get_previous_time(char *filename)
|
|
||||||
{ /* Tries to get the previously saved timestamp from FILENAME, but if
|
|
||||||
it can't read the file returns 0. */
|
|
||||||
time_t prev;
|
|
||||||
|
|
||||||
if (access(filename, R_OK) == 0) {
|
|
||||||
prev = load_previous_time(filename);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
prev = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_tty_number(void)
|
|
||||||
{ /* Gets the number of the current tty. It assumes that the number is
|
|
||||||
an integer and consists of everything after the last `/' of the
|
|
||||||
tty's name. */
|
|
||||||
char *tty = get_tty_name();
|
|
||||||
char *num = strrchr(tty, '/') + 1;
|
|
||||||
|
|
||||||
return atoi(num);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char
|
|
||||||
get_tty_type(void)
|
|
||||||
{ /* Gets the type of the tty represented by the first letter of the
|
|
||||||
type, either `t' or `p'. Assumes that the type comes immediately
|
|
||||||
after `/dev/'. */
|
|
||||||
char *tty = get_tty_name();
|
|
||||||
|
|
||||||
strtok(tty, "/"); /* dev */
|
|
||||||
|
|
||||||
return strtok(NULL, "/")[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
save_current_time(char *filename)
|
|
||||||
{ /* Save the timestamp for this moment to FILENAME. Returns `1' when
|
|
||||||
succesful, `0' when the file couldn't be opened. */
|
|
||||||
FILE *timefile = fopen(filename, "w");
|
|
||||||
time_t now;
|
|
||||||
|
|
||||||
if (!timefile)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
time(&now);
|
|
||||||
fprintf(timefile, "%ld", now);
|
|
||||||
fclose(timefile);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_time_since(time_t lasttime)
|
|
||||||
{ /* Print the hours, minutes and seconds that have passed since
|
|
||||||
LASTTIME to `stdout'. */
|
|
||||||
double h, m, s;
|
|
||||||
time_t now;
|
|
||||||
|
|
||||||
time(&now);
|
|
||||||
s = difftime(now, lasttime);
|
|
||||||
|
|
||||||
if (s >= 60.0) {
|
|
||||||
m = floor(s / 60.0);
|
|
||||||
s -= m * 60;
|
|
||||||
|
|
||||||
if (m >= 60.0) {
|
|
||||||
h = floor(m / 60.0);
|
|
||||||
m -= h * 60;
|
|
||||||
|
|
||||||
printf("%.0lfh", h);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%.0lfm", m);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%.0lfs", s);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{ /* This program prints a single letter represetation of the type and
|
{
|
||||||
number of the current tty and the time elapsed since the last
|
timediff();
|
||||||
call to this program on this tty, or `new'. It then saves a
|
|
||||||
timestamp to a file in /tmp/ so that it can check the elapsed
|
|
||||||
time during its next run. */
|
|
||||||
char *filename = get_filename();
|
|
||||||
time_t lasttime = get_previous_time(filename);
|
|
||||||
|
|
||||||
printf("%c%d:", get_tty_type(), get_tty_number());
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
if (lasttime > 0) {
|
|
||||||
print_time_since(lasttime);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
puts("new");
|
|
||||||
}
|
|
||||||
|
|
||||||
save_current_time(filename);
|
|
||||||
free(filename);
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
149
src/timediff.c
Normal file
149
src/timediff.c
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_tty_name(void)
|
||||||
|
{ /* Returns the name of the tty connected to the file descriptor for
|
||||||
|
`stdin'. */
|
||||||
|
return ttyname(STDIN_FILENO);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_filename(void)
|
||||||
|
{ /* Generate the filename to be used for the current tty. Uses both
|
||||||
|
the user ID of the calling user and the name of the current tty
|
||||||
|
to make it unique. */
|
||||||
|
char *filename = malloc(sizeof(char) * 255);
|
||||||
|
char *tty = get_tty_name();
|
||||||
|
char *pch;
|
||||||
|
|
||||||
|
while ((pch = strchr(tty, '/')))
|
||||||
|
*pch = '_';
|
||||||
|
|
||||||
|
sprintf(filename, "/tmp/baps1_%u_%s", getuid(), tty);
|
||||||
|
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
static time_t
|
||||||
|
load_previous_time(char *filename)
|
||||||
|
{ /* Loads the previously saved timestamp from FILENAME. This function
|
||||||
|
assumes the file exists and is readable. */
|
||||||
|
FILE *timefile = fopen(filename, "r");
|
||||||
|
time_t prev;
|
||||||
|
|
||||||
|
fscanf(timefile, "%ld", &prev);
|
||||||
|
fclose(timefile);
|
||||||
|
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
static time_t
|
||||||
|
get_previous_time(char *filename)
|
||||||
|
{ /* Tries to get the previously saved timestamp from FILENAME, but if
|
||||||
|
it can't read the file returns 0. */
|
||||||
|
time_t prev;
|
||||||
|
|
||||||
|
if (access(filename, R_OK) == 0) {
|
||||||
|
prev = load_previous_time(filename);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prev = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_tty_number(void)
|
||||||
|
{ /* Gets the number of the current tty. It assumes that the number is
|
||||||
|
an integer and consists of everything after the last `/' of the
|
||||||
|
tty's name. */
|
||||||
|
char *tty = get_tty_name();
|
||||||
|
char *num = strrchr(tty, '/') + 1;
|
||||||
|
|
||||||
|
return atoi(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char
|
||||||
|
get_tty_type(void)
|
||||||
|
{ /* Gets the type of the tty represented by the first letter of the
|
||||||
|
type, either `t' or `p'. Assumes that the type comes immediately
|
||||||
|
after `/dev/'. */
|
||||||
|
char *tty = get_tty_name();
|
||||||
|
|
||||||
|
strtok(tty, "/"); /* dev */
|
||||||
|
|
||||||
|
return strtok(NULL, "/")[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
save_current_time(char *filename)
|
||||||
|
{ /* Save the timestamp for this moment to FILENAME. Returns `1' when
|
||||||
|
succesful, `0' when the file couldn't be opened. */
|
||||||
|
FILE *timefile = fopen(filename, "w");
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
if (!timefile)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
time(&now);
|
||||||
|
fprintf(timefile, "%ld", now);
|
||||||
|
fclose(timefile);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_time_since(time_t lasttime)
|
||||||
|
{ /* Print the hours, minutes and seconds that have passed since
|
||||||
|
LASTTIME to `stdout'. */
|
||||||
|
double h, m, s;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
time(&now);
|
||||||
|
s = difftime(now, lasttime);
|
||||||
|
|
||||||
|
if (s >= 60.0) {
|
||||||
|
m = floor(s / 60.0);
|
||||||
|
s -= m * 60;
|
||||||
|
|
||||||
|
if (m >= 60.0) {
|
||||||
|
h = floor(m / 60.0);
|
||||||
|
m -= h * 60;
|
||||||
|
|
||||||
|
printf("%.0lfh", h);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%.0lfm", m);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%.0lfs", s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
timediff(void)
|
||||||
|
{ /* This function prints a single letter represetation of the type
|
||||||
|
and number of the current tty and the time elapsed since the last
|
||||||
|
call to this program on this tty, or `new'. It then saves a
|
||||||
|
timestamp to a file in /tmp/ so that it can check the elapsed
|
||||||
|
time during its next run. */
|
||||||
|
char *filename = get_filename();
|
||||||
|
time_t lasttime = get_previous_time(filename);
|
||||||
|
|
||||||
|
printf("%c%d:", get_tty_type(), get_tty_number());
|
||||||
|
|
||||||
|
if (lasttime > 0) {
|
||||||
|
print_time_since(lasttime);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
puts("new");
|
||||||
|
}
|
||||||
|
|
||||||
|
save_current_time(filename);
|
||||||
|
free(filename);
|
||||||
|
}
|
6
src/timediff.h
Normal file
6
src/timediff.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef timediff_h
|
||||||
|
#define timediff_h
|
||||||
|
|
||||||
|
void timediff(void);
|
||||||
|
|
||||||
|
#endif /* timediff_h */
|
Loading…
Reference in a new issue