util.c

Sat, 22 Apr 2000 17:34:20 +0200

author
tuomov
date
Sat, 22 Apr 2000 17:34:20 +0200
changeset 8
c1994196683f
parent 5
f878a9ffa3e0
child 9
55e7f2ff6021
permissions
-rw-r--r--

trunk: changeset 11
Portability fixes

/*
 * 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 <libtu/util.h>
#include <libtu/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