/[james]/archive/graphfree/graphfree.c
ViewVC logotype

Annotation of /archive/graphfree/graphfree.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (hide annotations) (download) (as text)
Mon Feb 10 22:47:44 2003 UTC (21 years, 10 months ago) by james
File MIME type: text/x-csrc
File size: 4520 byte(s)
Initial import.

1 james 15 /*
2     * graphfree.c
3     */
4    
5     #include <stdio.h>
6     #include <stdlib.h>
7     #include <string.h>
8     #include "oslib/osfile.h"
9     #include "oslib/osfscontrol.h"
10     #include "oslib/osword.h"
11     #include "oslib/territory.h"
12     #include "oslib/wimp.h"
13    
14    
15     char **message_table;
16    
17     void die(const char *message);
18     char **messages_read(const char *file_name);
19     unsigned long long used_space(const char *disc);
20     unsigned long long current_time(void);
21     void format_time(char *buffer, int size, const char *format);
22     void print_ulonglong(FILE *stream, unsigned long long x);
23     int main(void);
24    
25    
26     void die(const char *message)
27     {
28     os_error error;
29    
30     error.errnum = 1;
31     strcpy(error.errmess, message);
32     xwimp_command_window(-1);
33     xwimp_report_error_by_category(&error, wimp_ERROR_BOX_CANCEL_ICON |
34     wimp_ERROR_BOX_GIVEN_CATEGORY | wimp_ERROR_BOX_CATEGORY_ERROR,
35     "GraphFree", "!graphfree", (osspriteop_area *) 1, NULL, NULL);
36     exit(EXIT_FAILURE);
37     }
38    
39    
40     char **messages_read(const char *file_name)
41     {
42     char *data;
43     char **table;
44     unsigned int size = 0, count = 0, pos = 0, i, len;
45     int c;
46     FILE *file;
47    
48     file = fopen(file_name, "rb");
49     if (file == NULL) die("unable to open messages file");
50    
51     while ((c = fgetc(file)) != EOF)
52     {
53     size++;
54     if (c == '\n') count++;
55     }
56     size++;
57    
58     data = malloc(size);
59     if (data == NULL) die("out of memory");
60     table = calloc(count, sizeof(char *));
61     if (table == NULL) die("out of memory");
62    
63     if (fseek(file, 0, SEEK_SET)) die("file seek failed");
64    
65     for (i = 0; i < count; i++)
66     {
67     if (!fgets(data + pos, size - pos, file)) die("fgets failed");
68     len = strlen(data + pos);
69     data[pos + len - 1] = '\0';
70     table[i] = data + pos;
71     pos += len;
72     }
73    
74     fclose(file);
75    
76     return table;
77     }
78    
79    
80     unsigned long long used_space(const char *disc)
81     {
82     unsigned int free_lo, free_hi, size_lo, size_hi;
83     unsigned long long free, size;
84     os_error *error;
85    
86     error = xosfscontrol_free_space64(disc, &free_lo, &free_hi, NULL, &size_lo, &size_hi);
87     if (error != NULL)
88     {
89     error = xosfscontrol_free_space(disc, &free_lo, NULL, &size_lo);
90     if (error != NULL)
91     {
92     char message[500];
93     sprintf(message, message_table[0], disc, error->errmess);
94     die(message);
95     }
96     free_hi = size_hi = 0;
97     }
98    
99     free = ((unsigned long long) free_hi) << 32 | free_lo;
100     size = ((unsigned long long) size_hi) << 32 | size_lo;
101    
102     return size - free;
103     }
104    
105    
106     unsigned long long current_time(void)
107     {
108     oswordreadclock_utc_block utc;
109     os_error *error;
110    
111     utc.op = oswordreadclock_OP_UTC;
112     error = xoswordreadclock_utc(&utc);
113     if (error != NULL) die(error->errmess);
114    
115     return (unsigned long long) utc.utc[0] |
116     (unsigned long long) utc.utc[1] << 8 |
117     (unsigned long long) utc.utc[2] << 16 |
118     (unsigned long long) utc.utc[3] << 24 |
119     (unsigned long long) utc.utc[4] << 32;
120     }
121    
122    
123     void format_time(char *buffer, int size, const char *format)
124     {
125     oswordreadclock_utc_block utc;
126     os_error *error;
127    
128     utc.op = oswordreadclock_OP_UTC;
129     error = xoswordreadclock_utc(&utc);
130     if (error != NULL) die(error->errmess);
131    
132     error = xterritory_convert_date_and_time(territory_CURRENT,
133     &utc.utc, buffer, size, format, NULL);
134     if (error != NULL) die(error->errmess);
135     }
136    
137    
138     void print_ulonglong(FILE *stream, unsigned long long x)
139     {
140     char s[32];
141     int i = 31;
142    
143     s[i] = '\0';
144     while (x)
145     {
146     s[--i] = "0123456789"[x % 10];
147     x /= 10;
148     }
149     fprintf(stream, s + i);
150     }
151    
152    
153     int main(void)
154     {
155     FILE *discs;
156     char line[200];
157    
158     message_table = messages_read("<GraphFree$Messages>");
159    
160     discs = fopen("<Obey$Dir>.Discs.Discs", "r");
161     if (discs == NULL) die(message_table[1]);
162    
163     while (fgets(line, 200, discs))
164     {
165     line[strlen(line) - 1] = '\0';
166     if ((line[0] != '#') && (line[0] != '\0'))
167     {
168     char buffer[200];
169     unsigned long long used, time;
170     FILE *out;
171     os_error *error;
172    
173     used = used_space(line);
174     time = current_time();
175    
176     sprintf(buffer, "<Obey$Dir>.Discs.%s", strchr(line, ':') + 2);
177     out = fopen(buffer, "a");
178     if (out == NULL) die(message_table[3]);
179    
180     if (ftell(out) == 0) fprintf(out, "%s\n", message_table[5]);
181    
182     format_time(buffer, 200, message_table[4]);
183     fprintf(out, "\"%s\",", buffer);
184     print_ulonglong(out, time);
185     fprintf(out, ",");
186     print_ulonglong(out, used);
187     fprintf(out, "\n");
188    
189     fclose(out);
190    
191     sprintf(buffer, "<Obey$Dir>.Discs.%s", strchr(line, ':') + 2);
192     error = xosfile_set_type(buffer, 0xdfe);
193     if (error != NULL) die(error->errmess);
194     }
195     }
196    
197     return 0;
198     }

  ViewVC Help
Powered by ViewVC 1.1.26