/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */
/*********************************************************************/
/* file: new.c - new misc commands                                   */
/*                             TINTIN III                            */
/*          (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t             */
/*                     coded by peter unold 1992                     */
/*********************************************************************/

/* file @@@added -- perry */

#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif

#include <ctype.h>
#include "tintin.h"

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

/* externs */
extern int case_insensitive;

/*
 * Sleeps tintin. You will be frozen during the sleep.
 */
void delay_command(arg)
     char *arg;
{
	int delay;

	if ((delay = atoi(arg)) <= 0)
		delay = 1;

	sleep(delay);
}

/*
 * Toggles whether or not case matters in checking for actions.
 */
void case_command(ses)
     struct session *ses;
{
	case_insensitive = !case_insensitive;

	if (case_insensitive)
		tintin_puts2("#Ok. Actions no longer check for case matching.", NULL);
	else
		tintin_puts2("#Ok. Actions are checked for case.", NULL);
}

int mygets(buf, size, fp)
     char *buf;
     int size;
     FILE *fp;
{
	char *ptr = buf;
	char c;
	int cmt, brace;

	cmt = FALSE;
	brace = 0;

	do {
		c = getc(fp);
	} while (isspace(c));

	if (c == EOF)
		return 0;

	while (1) {
		switch (c) {
		case '{':
			*ptr++ = c;
			brace++;
			break;
		case '}':
			*ptr++ = c;
			brace--;
			break;
		case '/':
			if ((c = getc(fp)) == '*') {
				while (1) {
					if ((c = getc(fp)) == '*') {
						if ((c = getc(fp)) == '/')
							break;
					}
					if (c == EOF) {
						*ptr++ = '\0';
						return 1;
					}
				}
			}
			else if (c == '/') {
				while ((c = getc(fp)) != '\n') {
					if (c == EOF) {
						*ptr++ = '\0';
						return 1;
					}
				}
			}			
			else {
				*ptr++ = '/';
				ungetc(c, fp);
			}
			break;
		case '\\':
			switch ((c = getc(fp))) {
			case '[':
				*ptr++ = '\033';
				break;
			default:
				*ptr++ = '\\';
				ungetc(c, fp);
				break;
			}
			break;
		case '\n':
		case '\r':
			if (brace <= 0) {
				*ptr++ = '\0';
				return 1;
			}
			do {
				c = getc(fp);
			} while (isspace(c));
			ungetc(c, fp);
			break;
		case '\0':
			*ptr++ = c;
			return 1;
		case EOF:
			*ptr++ = '\0';
			return 1;
		default:
			*ptr++ = c;
			break;
		}
		if (ptr - buf >= size)
			return 1;
		c = getc(fp);
	}

	return 0;
}