/*
 * rename.c - aeb 2000-01-01
 *
--------------------------------------------------------------
#!/bin/sh
if [ $# -le 2 ]; then echo call: rename from to files; exit; fi
FROM="$1"
TO="$2"
shift
shift
for i in $@; do N=`echo "$i" | sed "s/$FROM/$TO/g"`; mv "$i" "$N"; done
--------------------------------------------------------------
 * This shell script will do renames of files, but may fail
 * in cases involving special characters. Here a C version.
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "nls.h"

static char *progname;

static int
do_rename(char *from, char *to, char *s) {
	char *newname, *where, *p, *q;
	int flen, tlen, slen;

	where = strstr(s, from);
	if (where == NULL)
		return 0;

	flen = strlen(from);
	tlen = strlen(to);
	slen = strlen(s);
	newname = malloc(tlen+slen+1);
	if (newname == NULL) {
		fprintf(stderr, _("%s: out of memory\n"), progname);
		exit(1);
	}

	p = s;
	q = newname;
	while (p < where)
		*q++ = *p++;
	p = to;
	while (*p)
		*q++ = *p++;
	p = where+flen;
	while (*p)
		*q++ = *p++;
	*q = 0;

	if (rename(s, newname) != 0) {
		int errsv = errno;
		fprintf(stderr, _("%s: renaming %s to %s failed: %s\n"),
				  progname, s, newname, strerror(errsv));
		exit(1);
	}

	return 1;
}

int
main(int argc, char **argv) {
	char *from, *to, *p;
	int i;

	progname = argv[0];
	if ((p = strrchr(progname, '/')) != NULL)
		progname = p+1;

	setlocale(LC_ALL, "");
	bindtextdomain(PACKAGE, LOCALEDIR);
	textdomain(PACKAGE);

	if (argc == 2) {
		if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
			printf(_("%s (%s)\n"),
			       progname, PACKAGE_STRING);
			return 0;
		}
	}

	if (argc < 3) {
		fprintf(stderr, _("call: %s from to files...\n"), progname);
		exit(1);
	}

	from = argv[1];
	to = argv[2];

	for (i=3; i<argc; i++)
		do_rename(from, to, argv[i]);
	return 0;
}
