2.11BSD/src/local/mtools/parse.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include <ctype.h>
#include "msdos.h"

extern char *mcwd;

/*
 * Get name component of filename.  Translates name to upper case.  Returns
 * pointer to static area.
 */

char *
get_name(filename)
char *filename;
{
	char *s, *temp, *strcpy(), *strrchr(), buf[MAX_PATH];
	static char ans[13];

	strcpy(buf, filename);
	temp = buf;
					/* skip drive letter */
	if (buf[0] && buf[1] == ':')
		temp = &buf[2];
					/* find the last separator */
	if (s = strrchr(temp, '/'))
		temp = s + 1;
	if (s = strrchr(temp, '\\'))
		temp = s + 1;
					/* xlate to upper case */
	for (s = temp; *s; ++s) {
		if (islower(*s))
			*s = toupper(*s);
	}

	strcpy(ans, temp);
	return(ans);
}

/*
 * Get the path component of the filename.  Translates to upper case.
 * Returns pointer to a static area.  Doesn't alter leading separator,
 * always strips trailing separator (unless it is the path itself).
 */

char *
get_path(filename)
char *filename;
{
	char *s, *end, *begin, *strcpy(), *strrchr(), buf[MAX_PATH];
	char drive, *strcat();
	static char ans[MAX_PATH];
	int has_sep;

	strcpy(buf, filename);
	begin = buf;
					/* skip drive letter */
	drive = '\0';
	if (buf[0] && buf[1] == ':') {
		drive = (islower(buf[0])) ? toupper(buf[0]) : buf[0];
		begin = &buf[2];
	}
					/* if absolute path */
	if (*begin == '/' || *begin == '\\')
		ans[0] = '\0';
	else {
		if (!drive || drive == *mcwd)
			strcpy(ans, mcwd + 2);
		else
			strcpy(ans, "/");
	}
					/* find last separator */
	has_sep = 0;
	end = begin;
	if (s = strrchr(end, '/')) {
		has_sep++;
		end = s;
	}
	if (s = strrchr(end, '\\')) {
		has_sep++;
		end = s;
	}
					/* zap the trailing separator */
	*end = '\0';
					/* translate to upper case */
	for (s = begin; *s; ++s) {
		if (islower(*s))
			*s = toupper(*s);
		if (*s == '\\')
			*s = '/';
	}
					/* if separator alone, put it back */
	if (!strlen(begin) && has_sep)
		strcat(ans, "/");

	strcat(ans, begin);
	return(ans);
}

/*
 * get the drive letter designation
 */

char
get_drive(filename)
char *filename;
{
	if (*filename && *(filename + 1) == ':') {
		if (islower(*filename))
			return(toupper(*filename));
		else
			return(*filename);
	}
	else
		return(*mcwd);
}