util.c

changeset 0
86b7f6f9c5c0
child 5
f878a9ffa3e0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util.c	Tue Feb 15 18:57:52 2005 +0100
@@ -0,0 +1,227 @@
+/*
+ * libtu/util.c
+ *
+ * Copyright (c) Tuomo Valkonen 1999-2000.
+ * 
+ * This file is distributed under the terms of the "Artistic License".
+ * See the included file LICENSE for details.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef CONFIG_LOCALE
+#include <libintl.h>
+#endif
+
+#include "include/util.h"
+#include "include/misc.h"
+
+
+static const ProgInfo *proginfo=NULL;
+static const char *progname=NULL;
+
+static void common_opts(int *argc, char *argv[]);
+
+
+void libtu_init_argv0(const char *argv0, const ProgInfo *info)
+{
+	progname=argv0;
+	proginfo=info;
+	
+#ifdef CONFIG_LOCALE
+	textdomain(simple_basename(argv0));
+#endif
+}
+
+
+void libtu_init(int *argc, char *argv[], const ProgInfo *info)
+{
+	libtu_init_argv0(argv[0], info);
+	
+	common_opts(argc, argv);
+}
+
+
+const char *prog_execname()
+{
+	return progname;
+}
+
+
+const ProgInfo *prog_info()
+{
+	return proginfo;
+}
+
+
+const char *prog_name()
+{
+	return proginfo ? proginfo->name : NULL;
+}
+
+
+const char *prog_version()
+{
+	return proginfo ? proginfo->version : NULL;
+}
+
+
+const char *prog_authors()
+{
+	return proginfo ? proginfo->authors : NULL;
+}
+
+
+const char *prog_license()
+{
+	return proginfo ? proginfo->license : NULL;
+}
+
+
+const char *prog_usage()
+{
+	return proginfo ? proginfo->usage : NULL;
+}
+
+
+/* */
+
+
+static char *usages[][2]={
+	{"--help",		"Show this help\n"},
+	{"--version",	"Show program version\n"},
+	{"--authors",	"Show program authors\n"},
+	{"--license",	"Show program license\n"},
+	{"--proginfo",	"Show program info\n"},
+	{NULL,}
+};
+
+
+static void common_usage(size_t start, size_t len)
+{
+	size_t l;
+	int i;
+	
+	for(i=0; usages[i][0]!=NULL; i++){
+	
+		for(l=0; l<start; l++){
+			putc(' ', stdout);
+		};
+		
+		l=strlen(usages[i][0]);
+		writef(stdout, usages[i][0], l);
+		
+		do{
+			putc(' ', stdout);
+		}while(++l<len-start);
+		
+		writef(stdout, usages[i][1], strlen(usages[i][1]));
+	}
+}
+
+
+static void show_usage(const char *p)
+{
+	const char *tmp;
+	size_t len;
+	size_t start;
+	
+	do{
+		tmp=strchr(p, '\n');
+
+		if(tmp==NULL){
+			len=strlen(p);
+			if(len==0)
+				break;
+		}else{
+			len=tmp-p;
+		}
+		
+		start=strspn(p, " ");
+		
+		if(p[start]=='$' && p[start+1]=='u'){
+			tmp=prog_execname();
+			if(start!=0)
+				writef(stdout, p, start);
+			printf(TR("Usage: %s"), tmp);
+			writef(stdout, p+start+2, len-start-2);
+			putc('\n', stdout);
+		}else if(p[start]=='$' && p[start+1]=='c'){
+			common_usage(start, len);
+		}else{
+			writef(stdout, p, len);
+			putc('\n', stdout);
+		}
+		
+		p+=len+1;
+	}while(*(p-1)!='\0');
+	
+}
+
+
+static void common_opts(int *argcp, char *argv[])
+{
+	int argc=*argcp;
+	const char *p, *p2;
+
+	argc--;
+	argv++;
+	
+	for(; argc>0; argc--, argv++){
+		if(strcmp(*argv, "--help")==0){
+			p=prog_usage();
+			if(p==NULL){
+				printf(TR("Usage: %s [options]\n"
+						  "Where options are:\n\n"), prog_execname());
+				common_usage(5, 20);
+				printf("\n");
+			}else{
+				show_usage(p);
+			}
+		}else if(strcmp(*argv, "--version")==0){
+			p=prog_version();
+			if(p==NULL)
+				printf(TR("No version available\n"));
+			else
+				printf("%s\n", p);
+		}else if(strcmp(*argv, "--authors")==0){
+			p=prog_authors();
+			if(p==NULL)
+				printf(TR("No author(s) info available\n"));
+			else
+				printf("%s\n", p);
+		}else if(strcmp(*argv, "--license")==0){
+			p=prog_license();
+			if(p==NULL)
+				printf(TR("No license available\n"));
+			else
+				printf("%s", TR(p));
+		}else if(strcmp(*argv, "--proginfo")==0){
+			p2=prog_version();
+			p=prog_name();
+			
+			if(p==NULL){
+				p=prog_execname();
+			
+				if(p==NULL){
+					printf(TR("No name available\n"));
+					break;
+				}
+			}
+			
+			if(p2)
+				printf("%s v%s\n", p, p2);
+			else
+				printf("%s\n", p);
+		}else if(strcmp(*argv, "--")){
+			break;
+		}else{
+			continue;
+		}
+			
+		exit(EXIT_SUCCESS);
+	}
+}

mercurial