TPCCLIB
Loading...
Searching...
No Matches
proginfo.c
Go to the documentation of this file.
1
4/*****************************************************************************/
5#include "tpcclibConfig.h"
6/*****************************************************************************/
7#include <string.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <time.h>
11/*****************************************************************************/
12#include "tpcextensions.h"
13/*****************************************************************************/
14
15/*****************************************************************************/
16static char *tpclicense[] = {
17 "This program comes with ABSOLUTELY NO WARRANTY. This is free software, and",
18 "you are welcome to redistribute it under GNU General Public License v3.",
19 "Source codes are available in https://gitlab.utu.fi/vesoik/tpcclib.git",
20 0};
21static char *tpclicense4html[] = {
22 "This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome",
23 "to redistribute it under <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">GNU General Public License</a>.",
24 "Source codes are available in <a href=\"https://gitlab.utu.fi/vesoik/tpcclib.git\">https://gitlab.utu.fi/vesoik/tpcclib.git</a>.",
25 0};
26static char *tpcstdoptions[] = {
27 " -h, --help",
28 " Display usage information on standard output and exit.",
29 " -v, --version",
30 " Display version and compile information on standard output and exit.",
31 " -d[n], --debug[=n], --verbose[=n]",
32 " Set the level (n) of debugging messages and listings.",
33 " -q, --quiet",
34 " Suppress displaying normal results on standard output.",
35 " -s, --silent",
36 " Suppress displaying anything except errors.",
37 0};
38/*****************************************************************************/
39
40/*****************************************************************************/
49 const char *s,
51 int *print_usage,
53 int *print_version,
60 int *verbose_level
61) {
62 int n;
63
64 char *cptr;
65 /* Check that string is option, starting with '-' or '--' */
66 if(s==NULL || strnlen(s, 2)<2 || s[0]!='-') return 1;
67 /* Set pointer to the character after the first '-' */
68 cptr=(char*)s+1;
69 /* If also the next character is '-', then try the long forms of options */
70 if(*cptr=='-') {
71 cptr++; if(strnlen(cptr, 1)<1) return 1;
72 if(strcasecmp(cptr, "help")==0) {*print_usage=1; return 0;}
73 if(strcasecmp(cptr, "helphtml")==0) {*print_usage=2; return 0;}
74 if(strcasecmp(cptr, "version")==0) {*print_version=1; return 0;}
75 if(strcasecmp(cptr, "build")==0) {*print_version=1; return 0;}
76 if(strcasecmp(cptr, "debug")==0) {*verbose_level+=1; return 0;}
77 if(strcasecmp(cptr, "verbose")==0) {*verbose_level+=1; return 0;}
78 if(strncasecmp(cptr, "debug=", 6)==0) {
79 if(!isdigit(cptr[6])) return 1;
80 n=atoi(cptr+6); *verbose_level+=n; return 0;
81 }
82 if(strncasecmp(cptr, "verbose=", 8)==0) {
83 if(!isdigit(cptr[8])) return 1;
84 n=atoi(cptr+8); *verbose_level+=n; return 0;
85 }
86 if(strcasecmp(cptr, "quiet")==0) {*verbose_level=0; return 0;}
87 if(strcasecmp(cptr, "silent")==0) {*verbose_level=-1; return 0;}
88 return 1;
89 }
90 /* So it is the short form, if anything */
91 if(strcmp(cptr, "h")==0) {*print_usage=1; return 0;}
92 if(strcasecmp(cptr, "v")==0) {*print_version=1; return 0;}
93 if(strcmp(cptr, "d")==0) {*verbose_level+=1; return 0;}
94 if(strncmp(cptr, "d", 1)==0 && strnlen(cptr, 2)>1) {
95 if(!isdigit(cptr[1])) return 1;
96 n=atoi(cptr+1); *verbose_level+=n; return 0;
97 }
98 if(strcmp(cptr, "q")==0) {*verbose_level=0; return 0;}
99 if(strcmp(cptr, "s")==0) {*verbose_level=-1; return 0;}
100 return 1;
101}
102/*****************************************************************************/
103
104/*****************************************************************************/
116 const char *program,
118 char *text[],
120 FILE *fp
121) {
122 int i;
123 char *cptr, *bprogram;
124
125 /* Print program name, version, and copyright */
126 if(strlen(program)>0) bprogram=strdup(program);
127 else bprogram=strdup("unknown");
128 filenameRmPath(bprogram); filenameRmExtension(bprogram);
129 fprintf(fp, "\n %s - tpcclib %d.%d.%d %s\n \n", bprogram,
130 tpcclib_VERSION_MAJOR, tpcclib_VERSION_MINOR, tpcclib_VERSION_PATCH,
131 tpcclib_COPYRIGHT);
132 /* Print usage */
133 i=0; while(text[i]!=0) {
134 /* If line contains string 'stdoptions' then print instead of it the
135 description of standard command-line options */
136 if(strstr(text[i], "stdoptions")) {
137 int j=0;
138 while(tpcstdoptions[j]!=0) fprintf(fp, " %s\n", tpcstdoptions[j++]);
139 i++; continue;
140 }
141 /* If line does not contain program name, then just print it as it is */
142 cptr=strstr(text[i], " @P ");
143 if(cptr==NULL) {fprintf(fp, " %s\n", text[i++]); continue;}
144 /* Replace '@P' with program name */
145 char *s; s=strdup(text[i]);
146 s[strlen(text[i])-strlen(cptr)]=(char)0;
147 fprintf(fp, " %s %s %s\n", s, bprogram, cptr+4);
148 free(s); i++;
149 }
150 fprintf(fp, " \n");
151 /* Print licence info */
152 i=0; while(tpclicense[i]!=0) fprintf(fp, " %s\n", tpclicense[i++]);
153 fprintf(fp, "\n");
154 free(bprogram);
155}
156/*****************************************************************************/
157
158/*****************************************************************************/
171 const char *program,
173 char *text[],
175 const char *path
176) {
177 unsigned int len, i, j;
178 char *bprogram, *fname, *cptr, *line;
179 FILE *fp;
180
181 if(program==NULL || text==NULL || strnlen(program, 1)<1) return 1;
182
183 /* Clean program name */
184 bprogram=strdup(program);
185 filenameRmPath(bprogram); filenameRmExtension(bprogram);
186
187 /* Make filename */
188 fname=calloc(strlen(path)+1+strlen(bprogram)+5, sizeof(char));
189 if(fname==NULL) {free(bprogram); return 1;}
190 strcpy(fname, path); len=strlen(fname);
191 if(len>0 && (fname[len-1]=='/' || fname[len-1]=='\\')) fname[len-1]=(char)0;
192 len=strlen(fname); if(len>0) strcat(fname, "/");
193 strcat(fname, bprogram); strcat(fname, ".html");
194
195 //printf("fname := '%s'\n", fname);
196
197 /* Open file for write */
198 fp=stdout;
199
200 /* Write HTML header */
201 len=fprintf(fp, "<!DOCTYPE html>\n");
202 if(len<10) {free(bprogram); free(fname); return 2;}
203 fprintf(fp, "<html lang=\"en-GB\">\n");
204 fprintf(fp, "<head>\n");
205 fprintf(fp, " <meta charset=\"utf-8\">\n");
206 fprintf(fp, " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n");
207 fprintf(fp, " <title>%s</title>\n", bprogram);
208 fprintf(fp, " <style type=\"text/css\">\n");
209 fprintf(fp, " body {\n");
210 fprintf(fp, " margin-left: 2em;\n");
211 fprintf(fp, " font-family: monospace;\n");
212 fprintf(fp, " font-size: 1em;\n");
213 fprintf(fp, " }\n");
214 fprintf(fp, " h1 {\n");
215 fprintf(fp, " font-size: 1.3em;\n");
216 fprintf(fp, " margin-top: 1em;\n");
217 fprintf(fp, " margin-bottom: 1em;\n");
218 fprintf(fp, " }\n");
219 fprintf(fp, " footer {\n");
220 fprintf(fp, " border:1px solid gray;\n");
221 fprintf(fp, " font-size: 0.8em;\n");
222 fprintf(fp, " }\n");
223 fprintf(fp, " footer p {margin-left: 1em;}\n");
224 fprintf(fp, " </style>\n");
225 fprintf(fp, "</head>\n\n");
226
227 /* Write HTML body */
228 fprintf(fp, "<body>\n");
229
230 /* Write program name, version and copyright as title; */
231 /* replace (c) with html code when necessary */
232 fprintf(fp, "<h1>%s - tpcclib %d.%d.%d ", bprogram, tpcclib_VERSION_MAJOR,
233 tpcclib_VERSION_MINOR, tpcclib_VERSION_PATCH);
234 line=tpcclib_COPYRIGHT; len=strlen(line);
235 for(j=0; j<len; j++) {
236 if(strncasecmp(line+j, "(C)", 3)==0) {fputs("&copy;", fp); j+=2; continue;}
237 fputc(line[j], fp);
238 }
239 fputs("</h1>\n\n", fp);
240
241 /* Print usage */
242 fprintf(fp, "<pre>\n");
243 i=0; while(text[i]!=0) {
244 line=text[i];
245 /* If line contains string 'stdoptions' then print instead of it the
246 description of standard command-line options */
247 if(strstr(line, "stdoptions")) {
248 int j=0;
249 while(tpcstdoptions[j]!=0) fprintf(fp, "%s\n", tpcstdoptions[j++]);
250 i++; continue;
251 }
252
253 /* Process "See also" line: add links to other programs */
254 if(strstr(line, "See also: ")!=NULL) {
255 /* copy until the first ':' */
256 j=0; while(line[j]!='\0') {
257 fputc(line[j], fp);
258 j++; if(line[j-1]==':') break;
259 }
260 /* the rest of line with token */
261 char *tline; unsigned int n=0;
262 tline=strdup(line+j); cptr=strtok(tline, ", :;\t\n\r");
263 while(cptr!=NULL) {
264 if(n>0) fputc(',', fp);
265 fprintf(fp, " <a href=\"./%s.html\">%s</a>", cptr, cptr);
266 cptr=strtok(NULL, ", :;\t\n\r");
267 n++;
268 }
269 fputs("\n", fp);
270 free(tline);
271 i++; continue;
272 }
273
274
275 /* Print the line one character at the time */
276 len=strlen(line); j=0;
277 while(j<len) {
278
279 /* If WWW Address follows, then add a link */
280 if(strncasecmp(line+j, "https://", 7)==0) {
281 unsigned int li;
282 cptr=line+j; len=strcspn(cptr, " ),;");
283 fputs("<a href=\"", fp);
284 for(li=0; li<len; li++) fputc(line[j+li], fp);
285 fputs("\">", fp);
286 for(li=0; li<len; li++) fputc(line[j+li], fp);
287 fputs("</a>", fp);
288 j+=len; continue;
289 }
290
291 /* If necessary, replace '@P' with program name */
292 if(strncmp(line+j, " @P ", 4)==0) {
293 fprintf(fp, " %s ", bprogram);
294 j+=4; continue;
295 }
296 /* Replace (c) or (C) with html code */
297 if(strncasecmp(line+j, "(C)", 3)==0) {
298 fputs("&copy;", fp);
299 j+=3; continue;
300 }
301
302 /* Replace <, >, and & characters with html codes */
303 if(line[j]=='<') {fputs("&lt;", fp); j++; continue;}
304 if(line[j]=='>') {fputs("&gt;", fp); j++; continue;}
305 if(line[j]=='&') {fputs("&amp;", fp); j++; continue;}
306
307 /* Just write the char normally */
308 fputc(line[j], fp); j++;
309 }
310 fprintf(fp, "\n");
311 i++; continue;
312
313 }
314 fprintf(fp, "</pre>\n");
315
316 /* Write footer */
317 fprintf(fp, "\n<footer>\n");
318 fprintf(fp, "<p>");
319 i=0; while(tpclicense4html[i]!=0) fprintf(fp, "%s<br>\n", tpclicense4html[i++]);
320 fprintf(fp, "</p>\n");
321 fprintf(fp, "</footer>\n");
322
323 /* Close HTML */
324 fprintf(fp, "</body>\n");
325 fprintf(fp, "</html>\n");
326
327
328 free(bprogram); free(fname);
329 return 0;
330}
331
332/*****************************************************************************/
333
334/*****************************************************************************/
341 const char *program,
343 FILE *fp
344) {
345 fprintf(fp, "\n");
346 if(program!=NULL) {
347 /* Print program name */
348 char *s; s=strdup(program);
350 fprintf(fp, " Program: %s\n", s);
351 free(s);
352 }
353 /* tpcclib (and program) version */
354 fprintf(fp, " tpcclib version: %d.%d.%d\n", tpcclib_VERSION_MAJOR,
355 tpcclib_VERSION_MINOR, tpcclib_VERSION_PATCH);
356 /* Build time */
357 fprintf(fp, " Build: %s %s\n",__DATE__,__TIME__);
358 /* Compiler information */
359 fprintf(fp, " Build platform: %s\n", tpcclib_BUILD_HOST_SYSTEM_NAME);
360 fprintf(fp, " Build processor: %s\n", tpcclib_BUILD_HOST_SYSTEM_PROCESSOR);
361 /* Build target information */
362 fprintf(fp, " Built for: %s\n", tpcclib_TARGET_OS);
363#if defined(__STDC_VERSION__)
364 fprintf(fp, " Version of C: %ld\n", __STDC_VERSION__);
365#endif
366#if defined(__GNUC__) && defined(__VERSION__)
367 fprintf(fp, " GNU C version: %s\n", __VERSION__);
368#endif
369#if defined(__clang__) && defined(__clang_version__)
370 fprintf(fp, " Clang/LLVM version: %s\n", __clang_version__);
371#endif
372#ifdef _OPENMP
373 fprintf(fp, " OpenMP version: %d\n", _OPENMP);
374#endif
375 /* Platform information */
376#if defined(__x86_64__) || defined(__LP64__) || defined(__ppc64__) || \
377 defined(__LLP64__) || defined(__ILP64__)
378 fprintf(fp, " Architecture: 64-bit\n");
379#else
380 fprintf(fp, " Architecture: 32-bit\n");
381#endif
382 /* Check if IEC 60559 floating-point standard is officially supported;
383 that is 'always' supported, but PET data i/o functions rely on it.
384 GCC does not define __STDC_IEC_559__ or implement the associated standard pragmas. */
385#ifdef __STDC_IEC_559__
386 fprintf(fp, " IEC 60559 floating-point standard is fully supported.\n");
387#endif
388 /* Large File Support extension (LFS) */
389#if defined(_FILE_OFFSET_BITS)
390 fprintf(fp, " _FILE_OFFSET_BITS: %d\n", _FILE_OFFSET_BITS);
391#else
392 fprintf(fp, " _FILE_OFFSET_BITS not defined\n");
393#endif
394#if defined(_LARGEFILE_SOURCE)
395 fprintf(fp, " _LARGEFILE_SOURCE defined\n");
396#endif
397#if defined(_LARGEFILE64_SOURCE)
398 fprintf(fp, " _LARGEFILE64_SOURCE defined\n");
399#endif
400}
401/*****************************************************************************/
402
403/*****************************************************************************/
410 const char *program,
412 int version,
414 int copyright,
416 char *prname,
418 int n
419) {
420 char *tmp;
421
422 /* Check the input */
423 if(prname==NULL || n<1) return;
424 prname[0]=(char)0;
425
426 /* Remove path and extension */
427 if(strnlen(program, 1024)>0) tmp=strndup(program, (size_t)1024);
428 else tmp=strdup("unknown");
430 /* Copy it if possible */
431 n-=strnlen(tmp, 1024); if(n>0) strlcpy(prname, tmp, n);
432 else {free(tmp); return;}
433 free(tmp);
434
435 /* Add version, if required */
436 if(version!=0) {
437 /* Create string with version number */
438 char v[256];
439 sprintf(v, " %d.%d.%d", tpcclib_VERSION_MAJOR, tpcclib_VERSION_MINOR, tpcclib_VERSION_PATCH);
440 /* Copy it if possible */
441 strlcat(prname, v, n);
442 }
443
444 /* Add copyright, if required */
445 if(copyright!=0) {
446 /* Copy it if possible */
447 strlcat(prname, " ", n);
448 strlcat(prname, tpcclib_COPYRIGHT, n);
449 }
450
451 return;
452}
453/*****************************************************************************/
454
455/*****************************************************************************/
463 const char *s
464) {
465 if(s==NULL || strnlen(s, 3)<1) return(-1);
466 if(strncasecmp(s, "YES", 1)==0) return(1);
467 if(strncasecmp(s, "NO", 1)==0) return(0);
468 if(strcasecmp(s, "ON")==0) return(1);
469 if(strcasecmp(s, "OFF")==0) return(0);
470 return(-1);
471}
472/*****************************************************************************/
473
474/*****************************************************************************/
void filenameRmPath(char *s)
Definition filename.c:20
int filenameRmExtension(char *s)
Definition filename.c:71
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
Definition proginfo.c:408
int tpcYesNo(const char *s)
Definition proginfo.c:461
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
size_t strnlen(const char *s, size_t n)
Definition stringext.c:566
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:635
size_t strlcat(char *dst, const char *src, size_t dstsize)
Definition stringext.c:595
char * strndup(const char *s, size_t n)
Definition stringext.c:204
Header file for library libtpcextensions.