tt.c
author llbatlle@comanegra
Fri, 01 Apr 2011 10:06:32 +0200
changeset 21 5dababf1cb7d
parent 20 1567704292af
child 22 3de440cc5319
permissions -rw-r--r--
Milloro l'escript que compta hores.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     1
/*
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     2
  tt 1.0 - Time Tracker
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     3
    (Instructions using -h)
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     4
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     5
  Copyright (C) 2010 LluĂ­s Batlle i Rossell
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     6
  
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     7
  This program is free software; you can redistribute it and/or
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     8
  modify it under the terms of the GNU General Public License
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
     9
  as published by the Free Software Foundation; either version 2
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    10
  of the License, or (at your option) any later version.
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    11
  
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    12
  This program is distributed in the hope that it will be useful,
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    13
  but WITHOUT ANY WARRANTY; without even the implied warranty of
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    14
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    15
  GNU General Public License for more details.
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    16
  
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    17
  You should have received a copy of the GNU General Public License
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    18
  along with this program; if not, write to the Free Software
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    19
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
5925d3fbb330 Adding the GPL license at the header of the C file.
viric <viriketo@gmail.com>
parents: 11
diff changeset
    20
*/
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    21
#define _POSIX_C_SOURCE 1
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    22
#define _XOPEN_SOURCE 500
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    23
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    24
#include <stdio.h>
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    25
#include <stdlib.h>
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    26
#include <time.h>
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    27
#include <string.h>
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    28
#include <errno.h>
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    29
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    30
/* For debug messages */
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    31
static line_counter;
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    32
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    33
void parsing_error()
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    34
{
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    35
    fprintf(stderr, "Parsing error at line %i\n", line_counter);
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    36
    exit(1);
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    37
}
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
    38
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    39
static FILE *
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    40
open_file(const char *attr)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    41
{
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    42
    char *name = getenv("TT_PROJECT");
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    43
    if (name)
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    44
    {
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    45
        name = strdup(name);
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    46
    }
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    47
    else
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    48
    {
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    49
        const char *home = getenv("HOME");
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    50
        const char *filename = "/.tt";
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    51
        int len;
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    52
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    53
        if (!home)
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    54
        {
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    55
            fprintf(stderr, "You should have $HOME or $TT_PROJECT set.\n");
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    56
            exit(1);
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    57
        }
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    58
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    59
        len = strlen(filename) + strlen(home) + 1;
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    60
        name = malloc(len);
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    61
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    62
        snprintf(name, len, "%s%s", home, filename);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    63
    }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    64
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    65
    FILE *f;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    66
    f = fopen(name, attr);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    67
    if (!f)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    68
    {
16
20b855c57e9c Fix adding \n at the end of an error message
viric <viriketo@gmail.com>
parents: 13
diff changeset
    69
        fprintf(stderr, "Could not open the file: %s (%s)\n", name,
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    70
                strerror(errno));
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    71
        free(name);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    72
        exit(1);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    73
    }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    74
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    75
    free(name);
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
    76
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    77
    return f;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    78
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    79
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    80
static int
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    81
get_current_time()
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    82
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    83
    time_t current_time = time(0);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    84
    return (int) current_time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    85
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    86
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    87
static char *
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    88
get_time_str(int d)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    89
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    90
    time_t seconds = (time_t) d;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    91
    struct tm t;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    92
    localtime_r(&seconds, &t);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    93
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    94
    char *str = malloc(100);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    95
    snprintf(str, 100, "%04i-%02i-%02i %02i:%02i:%02i",
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    96
             1900+t.tm_year, t.tm_mon+1, t.tm_mday,
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    97
             t.tm_hour, t.tm_min, t.tm_sec);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    98
    return str;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
    99
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   100
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   101
char *
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   102
seconds2hms(int t)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   103
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   104
    int hours, minutes;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   105
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   106
    hours = t / 3600;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   107
    t = t % 3600;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   108
    minutes = t / 60;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   109
    t = t % 60;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   110
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   111
    char *str = malloc(100);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   112
    snprintf(str, 100, "%02i:%02i:%02i",
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   113
             hours, minutes, t);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   114
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   115
    return str;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   116
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   117
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   118
static int
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   119
str2time(const char *str)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   120
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   121
    struct tm t;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   122
    time_t seconds;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   123
    char *str2 = strdup(str);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   124
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   125
    char *ptr_begin = str2;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   126
    char *ptr_end;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   127
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   128
    ptr_end = strchr(ptr_begin, '-');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   129
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   130
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   131
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   132
    sscanf(ptr_begin, "%d", &t.tm_year);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   133
    t.tm_year -= 1900;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   134
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   135
    ptr_begin = ptr_end + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   136
    ptr_end = strchr(ptr_begin, '-');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   137
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   138
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   139
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   140
    sscanf(ptr_begin, "%d", &t.tm_mon);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   141
    /* starting at 0 */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   142
    t.tm_mon -= 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   143
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   144
    ptr_begin = ptr_end + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   145
    ptr_end = strchr(ptr_begin, ' ');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   146
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   147
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   148
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   149
    sscanf(ptr_begin, "%d", &t.tm_mday);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   150
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   151
    ptr_begin = ptr_end + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   152
    ptr_end = strchr(ptr_begin, ':');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   153
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   154
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   155
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   156
    sscanf(ptr_begin, "%d", &t.tm_hour);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   157
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   158
    ptr_begin = ptr_end + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   159
    ptr_end = strchr(ptr_begin, ':');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   160
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   161
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   162
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   163
    sscanf(ptr_begin, "%d", &t.tm_min);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   164
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   165
    ptr_begin = ptr_end + 1;
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   166
    sscanf(ptr_begin, "%d", &t.tm_sec);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   167
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   168
    free(str2);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   169
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   170
    /* We don't know, we had or not DST at that time */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   171
    t.tm_isdst = -1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   172
    seconds = mktime(&t);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   173
    return (int) seconds;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   174
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   175
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   176
static void
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   177
new_task(const char *task)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   178
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   179
    char *time_str = get_time_str(get_current_time());
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   180
    FILE *f = open_file("a");
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   181
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   182
    fprintf(f, "%s\t%s\n", time_str, task);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   183
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   184
    free(time_str);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   185
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   186
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   187
static void
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   188
list_task_switches()
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   189
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   190
    FILE *f = open_file("r");
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   191
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   192
    char buf[1000];
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   193
    int n;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   194
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   195
    do {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   196
        n = fread(buf, 1, sizeof(buf), f);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   197
        while(n > 0)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   198
        {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   199
            int ret;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   200
            ret = fwrite(buf, 1, n, stdout);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   201
            n -= ret;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   202
            memcpy(buf, buf+ret, n);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   203
        }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   204
    }
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   205
    while(!feof(f));
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   206
    fclose(f);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   207
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   208
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   209
static void
11
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   210
list_task_times(int show_only_last)
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   211
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   212
    FILE *f = open_file("r");
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   213
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   214
    int is_prev_time_read = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   215
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   216
    int prev_time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   217
    char *prev_task = 0;
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   218
    char *prev_time_str = 0;
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   219
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   220
    line_counter = 1;
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   221
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   222
    /* Read lines */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   223
    do {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   224
        /* Read a line */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   225
        char buf[1000];
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   226
        int n = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   227
        int c;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   228
        do
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   229
        {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   230
            buf[n] = fgetc(f);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   231
            if(buf[n] == '\n' || feof(f))
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   232
                break;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   233
            ++n;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   234
        } while(!feof(f) && n <= sizeof(buf));
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   235
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   236
        buf[n] = 0;
20
1567704292af Afegeixo la possibilitat de fer comentaris amb '#'
llbatlle@comanegra
parents: 17
diff changeset
   237
        if(n > 0 && buf[0] != '#')
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   238
        {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   239
            char *end_date, *start_task;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   240
            int time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   241
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   242
            end_date = strchr(buf, '\t');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   243
            if (!end_date)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   244
                parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   245
            *end_date = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   246
            start_task = end_date + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   247
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   248
            time = str2time(buf);
11
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   249
            if (is_prev_time_read && !show_only_last)
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   250
            {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   251
                int diff = time - prev_time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   252
                char *hms = seconds2hms(diff);
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   253
                char *prevtimestr2 = get_time_str(prev_time);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   254
                printf("%s %s (%s)\n", hms, prev_task, prevtimestr2);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   255
                free(prevtimestr2);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   256
                free(hms);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   257
            }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   258
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   259
            prev_time = time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   260
            free(prev_task);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   261
            prev_task = strdup(start_task);
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   262
            free(prev_time_str);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   263
            prev_time_str = strdup(buf);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   264
            is_prev_time_read = 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   265
        }
20
1567704292af Afegeixo la possibilitat de fer comentaris amb '#'
llbatlle@comanegra
parents: 17
diff changeset
   266
        else if (n == 0) /* eof */
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   267
        {
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   268
            /* Time until now, for the last switch */
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   269
            int diff = get_current_time() - prev_time;
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   270
            char *hms = seconds2hms(diff);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   271
            printf("%s %s (%s)\n", hms, prev_task, prev_time_str);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   272
            free(hms);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   273
            free(prev_task);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   274
            free(prev_time_str);
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   275
        }
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   276
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   277
        line_counter++;
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   278
    }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   279
    while(!feof(f));
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   280
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   281
    fclose(f);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   282
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   283
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   284
char *
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   285
str_until_space(const char *str)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   286
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   287
    while(*str != '\0' && !isspace(*str))
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   288
    {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   289
        ++str;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   290
    }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   291
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   292
    if (*str == '\0')
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   293
        return 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   294
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   295
    /* We get rid of the const */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   296
    return (char *) str;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   297
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   298
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   299
double
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   300
hms2time(const char *str)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   301
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   302
    int hours, minutes, seconds;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   303
    char *str2 = strdup(str);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   304
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   305
    char *ptr_begin = str2;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   306
    char *ptr_end;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   307
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   308
    ptr_end = strchr(ptr_begin, ':');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   309
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   310
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   311
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   312
    sscanf(ptr_begin, "%d", &hours);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   313
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   314
    ptr_begin = ptr_end + 1;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   315
    ptr_end = strchr(ptr_begin, ':');
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   316
    if (!ptr_end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   317
        parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   318
    *ptr_end = '\0';
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   319
    sscanf(ptr_begin, "%d", &minutes);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   320
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   321
    ptr_begin = ptr_end + 1;
8
37880a37c066 Fixed a bug in decimal number parsing.
Lluís Batlle <viriketo@gmail.com>
parents: 7
diff changeset
   322
    sscanf(ptr_begin, "%d", &seconds);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   323
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   324
    free(str2);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   325
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   326
    return hours * 3600 + minutes * 60 + seconds;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   327
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   328
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   329
static void
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   330
sum_times()
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   331
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   332
    int accum_time = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   333
    char *str_hms;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   334
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   335
    line_counter = 1;
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   336
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   337
    /* Read lines */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   338
    do {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   339
        /* Read a line */
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   340
        char buf[1000];
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   341
        int n = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   342
        int c;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   343
        do
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   344
        {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   345
            buf[n] = fgetc(stdin);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   346
            if(buf[n] == '\n' || feof(stdin))
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   347
                break;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   348
            ++n;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   349
        } while(!feof(stdin) && n <= sizeof(buf));
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   350
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   351
        buf[n] = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   352
        if(n > 0)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   353
        {
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   354
            char *end;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   355
            int time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   356
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   357
            end = str_until_space(buf);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   358
            if (!end)
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   359
                parsing_error();
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   360
            *end = 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   361
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   362
            time = hms2time(buf);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   363
            accum_time += time;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   364
        }
13
387ab315b0f3 C: Showing to the user the number of the annoying line, if the parsing fails.
viric <viriketo@gmail.com>
parents: 12
diff changeset
   365
        ++line_counter;
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   366
    }
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   367
    while(!feof(stdin));
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   368
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   369
    str_hms = seconds2hms(accum_time);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   370
    printf("%s\n", str_hms);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   371
    free(str_hms);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   372
}
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   373
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   374
void show_help(const char *prog)
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   375
{
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   376
    printf(
17
f0fcc2a59caf Making the tt help show the proper parameters available.
viric <viriketo@gmail.com>
parents: 16
diff changeset
   377
	    "Usage: %s <-s|-l|-t|-h>\n"
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   378
        "       %s <task>\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   379
        "Manual:\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   380
        "  Switch to a task         :  tt mytask\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   381
        "  List task switches       :  tt -l\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   382
        "  List time spent per task :  tt -t\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   383
        "  Sum times given with -t  :  tt -t | grep ... | tt -s\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   384
        "  List what is tracked     :  tt\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   385
        "  $TT_PROJECT or ~/.tt stores the tracking.\n"
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   386
        , prog, prog);
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   387
}
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   388
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   389
int main(int argc, char **argv)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   390
{
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   391
    if (argc >= 2)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   392
        if (strcmp(argv[1], "-t") == 0)
11
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   393
            list_task_times(/* show only last */ 0);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   394
        else if (strcmp(argv[1], "-s") == 0)
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   395
            sum_times();
11
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   396
        else if (strcmp(argv[1], "-l") == 0)
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   397
            list_task_switches();
10
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   398
        else if (strcmp(argv[1], "-h") == 0)
29610784a302 C Version: add the help message, and make it work by default with ~/.tt
viric <viriketo@gmail.com>
parents: 8
diff changeset
   399
            show_help(argv[0]);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   400
        else
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   401
            new_task(argv[1]);
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   402
    else
11
4c3c80ec2180 C version: adding the default behaviour of showing time spent in last task
viric <viriketo@gmail.com>
parents: 10
diff changeset
   403
        list_task_times(/* show only last */ 1);
7
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   404
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   405
    return 0;
e31e7826bc3f Adding a preliminary C version for 'tt'.
Lluís Batlle <viriketo@gmail.com>
parents:
diff changeset
   406
}