🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.sources.os9
1 messages
1 total messages Started by Frank Kaefer Thu, 24 Dec 1992 13:05
Tass for OS-9 Part03/03
#12
Author: Frank Kaefer
Date: Thu, 24 Dec 1992 13:05
1217 lines
27057 bytes
Submitted-by: Ulrich Dessauer <ud@Nightmare.ddt.sub.org>
Archive-name: tass/part03

: ----- Cut here ----- Cut here ----- Cut here ----- Cut here -----
: Use  sh filename  to extract shell archive
: This shell archive contains following files:
:     'prompt.c                                     2308 bytes'
:     'screen.c                                      729 bytes'
:     'select.c                                    13169 bytes'
:     'sigs.c                                       1277 bytes'
:     'tass.h                                       3575 bytes'
:     'time.c                                       1094 bytes'
: 
if test -f 'prompt.c' ; then
  echo 'File prompt.c already exists, overwriting it'
  del 'prompt.c'
fi
echo Extracting \"'prompt.c'\"
sed "s/^X//" >'prompt.c' <<'__END__OF__THIS__FILE__'
X
X#include	<stdio.h>
X#include	"tass.h"
X
X
X/*
X *  parse_num
X *  get a number from the user
X *  Return -1 if missing or bad number typed
X */
X
Xparse_num(ch, prompt)
Xchar ch;
Xchar *prompt;
X{
X	char buf[40];
X	int len;
X	int i;
X	int num;
X
X	MoveCursor(LINES,0);
X	printf("%s %c",prompt,ch);
X	fflush(stdout);
X	buf[0] = ch;
X	buf[1] = '\0';
X	len = 1;
X	ch = ReadCh();
X	while (ch != '\n'&& ch != '\r') {
X		if (ch >= '0' && ch <= '9' && len < 4) {
X			buf[len++] = ch;
X			buf[len] = '\0';
X			putchar(ch);
X		} else if (ch == 8 || ch == 127) {
X			if (len) {
X				len--;
X				buf[len] = '\0';
X				putchar('\b');
X				putchar(' ');
X				putchar('\b');
X			} else {
X				MoveCursor(LINES, 0);
X				CleartoEOLN();
X				return(-1);
X			}
X		} else if (ch == 21) {	/* control-U	*/
X			for (i = len;i>0;i--) {
X				putchar('\b');
X				putchar(' ');
X				putchar('\b');
X			}
X			buf[0] = '\0';
X			len = 0;
X		} else
X			putchar(7);
X		fflush(stdout);
X		ch = ReadCh();
X	}
X
X	MoveCursor(LINES, 0);
X	CleartoEOLN();
X
X	if (len) {
X		num = atoi(buf);
X		return(num);
X	} else
X		return(-1);
X}
X
X
X/*
X *  parse_string
X *  get a string from the user
X *  Return TRUE if a valid string was typed, FALSE otherwise
X */
X
Xparse_string(prompt, buf)
Xchar *prompt;
Xchar *buf;
X{
Xint len;
Xint i;
Xchar ch;
X
X	clear_message();
X	MoveCursor(LINES,0);
X	printf("%s", prompt);
X	fflush(stdout);
X	buf[0] = '\0';
X	len = 0;
X	ch = ReadCh();
X	while (ch != '\n' && ch != '\r') {
X		if (ch >= ' ' && len < 60) {
X			buf[len++] = ch;
X			buf[len] = '\0';
X			putchar(ch);
X		} else if (ch == 8 || ch == 127) {
X			if (len) {
X				len--;
X				buf[len] = '\0';
X				putchar('\b');
X				putchar(' ');
X				putchar('\b');
X			} else {
X				MoveCursor(LINES, 0);
X				CleartoEOLN();
X				return(FALSE);
X			}
X		} else if (ch == 21) {	/* control-U	*/
X			for (i = len;i>0;i--) {
X				putchar('\b');
X				putchar(' ');
X				putchar('\b');
X			}
X			buf[0] = '\0';
X			len = 0;
X		} else
X			putchar(7);
X		fflush(stdout);
X		ch = ReadCh();
X	}
X	MoveCursor(LINES,0);
X	CleartoEOLN();
X
X	return TRUE;
X}
X
X
Xprompt_yn(prompt)
Xchar *prompt;
X{
X	char ch;
X
X	clear_message();
X	MoveCursor(LINES,0);
X	printf("%s", prompt);
X	fflush(stdout);
X
X	ch = ReadCh();
X	clear_message();
X
X	if (ch == 'y' || ch == 'Y')
X		return TRUE;
X
X	return FALSE;
X}
X
X
Xcontinue_prompt() {
X
X	printf("-Hit return to continue-");
X	fflush(stdout);
X	while (ReadCh() != '\n') ;
X}
X
X
__END__OF__THIS__FILE__
if test -f 'screen.c' ; then
  echo 'File screen.c already exists, overwriting it'
  del 'screen.c'
fi
echo Extracting \"'screen.c'\"
sed "s/^X//" >'screen.c' <<'__END__OF__THIS__FILE__'
X
X#include	<stdio.h>
X#include	"tass.h"
X
X
X
Xinfo_message(msg)
Xchar *msg;
X{
X	clear_message();	  /* Clear any old messages hanging around */
X	center_line(LINES, msg);  /* center the message at screen bottom  */
X	MoveCursor(LINES, 0);
X}
X
X
Xclear_message()
X{
X	MoveCursor(LINES, 0);
X	CleartoEOLN();
X}
X
X
Xcenter_line(line, str)
Xint line;
Xchar *str;
X{
Xint pos;
X
X	pos = (COLS - strlen(str)) / 2;
X	MoveCursor(line, pos);
X	printf("%s", str);
X	fflush(stdout);
X}
X
X
Xdraw_arrow(line)
Xint line;
X{
X	MoveCursor(line, 0);
X	printf("->");
X	fflush(stdout);
X	MoveCursor(LINES, 0);
X}
X
Xerase_arrow(line)
Xint line;
X{
X	MoveCursor(line, 0);
X	printf("  ");
X	fflush(stdout);
X}
X
X#ifdef	REGEXP
Xvoid
Xregerror (s)
Xchar *s;
X{
X	info_message (s);
X}
X#endif	/* REGEXP */
X
__END__OF__THIS__FILE__
if test -f 'select.c' ; then
  echo 'File select.c already exists, overwriting it'
  del 'select.c'
fi
echo Extracting \"'select.c'\"
sed "s/^X//" >'select.c' <<'__END__OF__THIS__FILE__'
X
X#include	<stdio.h>
X#include	<signal.h>
X#ifdef	REGEXP
X#include	<regexp.h>
X#endif	/* REGEXP */
X#include	"tass.h"
X
X
Xint first_group_on_screen;
Xint last_group_on_screen;
Xint cur_groupnum = 0;
Xextern int index_point;
Xint space_mode;
Xextern char *cvers;
X
Xchar group_search_string[LEN+1];
X
X
X
X#ifdef SIGTSTP
Xvoid
Xselect_susp(i)
Xint i;
X{
X
X	Raw(FALSE);
X	putchar('\n');
X	signal(SIGTSTP, SIG_DFL);
X	kill(0, SIGTSTP);
X
X	signal(SIGTSTP, select_susp);
X	Raw(TRUE);
X	mail_setup();
X	group_selection_page(-1, FALSE);
X}
X#endif
X
X
Xselection_index()
X{
X	char ch;
X	int n;
X	int i;
X	char buf[200];
X
X	group_selection_page(-1, FALSE);	/* display group selection page */
X
X	while (1) {
X		if ((n = ReadCh()) == EOF)
X			longjmp (jmp_buffer, 1);
X		ch = (char) n;
X	
X		if (ch > '0' && ch <= '9') {
X			prompt_group_num(ch);
X		} else switch (ch) {
X			case 'c':	/* catchup--mark all articles as read */
X			    if (prompt_yn("Mark group as read? (y/n): ")) {
X				unread[cur_groupnum] = 0;
X				mark_group_read(
X					    active[my_group[cur_groupnum]].name,
X					    my_group[cur_groupnum]);
X				group_selection_page(cur_groupnum, TRUE);
X			    }
X			    break;
X
X			case ctrl('K'):
X				if (local_top <= 0) {
X					info_message("No groups to delete");
X					break;
X				}
X
X				delete_group(
X					active[my_group[cur_groupnum]].name);
X				active[my_group[cur_groupnum]].flag = NOTGOT;
X
X				local_top--;
X				for (i = cur_groupnum; i < local_top; i++) {
X					my_group[i] = my_group[i+1];
X					unread[i] = unread[i+1];
X				}
X				if (cur_groupnum >= local_top)
X					cur_groupnum = local_top - 1;
X
X				group_selection_page(cur_groupnum, FALSE);
X				break;
X
X			case ctrl('Y'):
X				undel_group();
X				group_selection_page(cur_groupnum, FALSE);
X				break;
X
X			case 'I':		/* toggle inverse video */
X				inverse_okay = !inverse_okay;
X				if (inverse_okay)
X					info_message("Inverse video enabled");
X				else
X					info_message("Inverse video disabled");
X				break;
X
X			case ctrl('R'):	/* reset .newsrc */
X			    if (prompt_yn("Reset newsrc? (y/n): ")) {
X				reset_newsrc();
X				cur_groupnum = 0;
X				group_selection_page(-1, FALSE);
X			    }
X			    break;
X
X			case '$':	/* reread .newsrc, no unsub groups */
X				cur_groupnum = 0;
X				local_top = 0;
X				for (i = 0; i < num_active; i++)
X					active[i].flag = NOTGOT;
X				read_newsrc(TRUE);
X				group_selection_page(-1, FALSE);
X				break;
X
X			case 's':	/* subscribe to current group */
X			    MoveCursor(INDEX_TOP +
X				(cur_groupnum-first_group_on_screen), 3);
X			    putchar(' ');
X			    fflush(stdout);
X			    MoveCursor(LINES, 0);
X
X			    subscribe(active[my_group[cur_groupnum]].name,
X					':', my_group[cur_groupnum], FALSE);
X			    sprintf(buf, "subscribed to %s",
X					active[my_group[cur_groupnum]].name);
X			    info_message(buf);
X			    break;
X
X			case 'u':	/* unsubscribe to current group */
X			    MoveCursor(INDEX_TOP +
X				(cur_groupnum-first_group_on_screen), 3);
X			    putchar('u');
X			    fflush(stdout);
X			    MoveCursor(LINES, 0);
X
X			    subscribe(active[my_group[cur_groupnum]].name,
X					'!', my_group[cur_groupnum], FALSE);
X			    sprintf(buf, "unsubscribed to %s",
X					active[my_group[cur_groupnum]].name);
X			    info_message(buf);
X			    break;
X
X			case ' ':
X				clear_message();
X				break;
X
X			case '\t':
X				for (i = cur_groupnum; i < local_top; i++)
X					if (unread[i] != 0)
X						break;
X				if (i >= local_top) {
X					info_message("No more groups to read");
X					break;
X				}
X
X				erase_group_arrow();
X				cur_groupnum = i;
X				if (cur_groupnum >= last_group_on_screen)
X					group_selection_page(-1, FALSE);
X				else
X					draw_group_arrow();
X				space_mode = TRUE;
X				goto go_into_group;
X
X			case 'g':	/* prompt for a new group name */
X				n = choose_new_group();
X				if (n >= 0) {
X					erase_group_arrow();
X					cur_groupnum = n;
X					if (cur_groupnum < first_group_on_screen
X					|| cur_groupnum >= last_group_on_screen)
X						group_selection_page(-1, FALSE);
X					else
X						draw_group_arrow();
X				}
X				break;
X
X#ifdef	USE_ARROW
X			case 27:	/* (ESC) common arrow keys */
X				ch = ReadCh();
X				if (ch == '[' || ch == 'O')
X					ch = ReadCh();
X				switch (ch) {
X				case 'A':
X				case 'D':
X				case 'i':
X					goto select_up;
X
X				case 'B':
X				case 'I':
X				case 'C':
X					goto select_down;
X				}
X				break;
X#endif	/* USE_ARROW */
X
X			case 'y':	/* pull in rest of groups from active */
X				n = local_top;
X				for (i = 0; i < num_active; i++)
X					active[i].flag = NOTGOT;
X				read_newsrc(FALSE);
X				for (i = 0; i < num_active; i++)
X					if (active[i].flag & NOTGOT) {
X						active[i].flag &= ~NOTGOT;
X						my_group[local_top] = i;
X						unread[local_top] = -1;
X						local_top++;
X					}
X				if (n < local_top) {
X					sprintf(buf, "Added %d group%s",
X						local_top - n,
X						local_top - n == 1 ? "" : "s");
X					group_selection_page(-1, FALSE);
X					info_message(buf);
X				} else
X				    info_message("No more groups to yank in");
X				break;
X
X			case ctrl('U'):		/* page up */
X			case ctrl('Z'):		/* full page up */
X				erase_group_arrow();
X				cur_groupnum -= (ch == ctrl('Z')) ?
X						NOTESLINES :
X						NOTESLINES / 2;
X				if (cur_groupnum < 0)
X					cur_groupnum = 0;
X				if (cur_groupnum < first_group_on_screen
X				||  cur_groupnum >= last_group_on_screen)
X					group_selection_page(-1, FALSE);
X				else
X					draw_group_arrow();
X				break;
X
X			case ctrl('D'):		/* page down */
X			case ctrl('V'):		/* full page down */
X				erase_group_arrow();
X				cur_groupnum += (ch == ctrl ('V')) ?
X						NOTESLINES :
X						NOTESLINES / 2;
X				if (cur_groupnum >= local_top)
X					cur_groupnum = local_top - 1;
X
X				if (cur_groupnum <= first_group_on_screen
X				||  cur_groupnum >= last_group_on_screen)
X					group_selection_page(-1, FALSE);
X				else
X					draw_group_arrow();
X				break;
X
X			case '!':
X				shell_escape();
X				group_selection_page(-1, FALSE);
X				break;
X
X			case 'v':
X				info_message(cvers);
X				break;
X
X			case ctrl('N'):		/* line down */
X			case 'j':
X#ifdef	USE_ARROW
Xselect_down:
X#endif	/* USE_ARROW */
X				if (cur_groupnum + 1 >= local_top)
X					break;
X
X				if (cur_groupnum + 1 >= last_group_on_screen) {
X					cur_groupnum++;
X					group_selection_page(-1, FALSE);
X				} else {
X					erase_group_arrow();
X					cur_groupnum++;
X					draw_group_arrow();
X				}
X				break;
X
X			case ctrl('P'):		/* line up */
X			case 'k':
X#ifdef	USE_ARROW
Xselect_up:
X#endif	/* USE_ARROW */
X				if (!cur_groupnum)
X					break;
X
X				if (cur_groupnum <= first_group_on_screen) {
X					cur_groupnum--;
X					group_selection_page(-1, FALSE);
X				} else {
X					erase_group_arrow();
X					cur_groupnum--;
X					draw_group_arrow();
X				}
X				break;
X
X			case 't':		/* redraw */
X			case ctrl('W'):
X			case ctrl('L'):
X				group_selection_page(-1, FALSE);
X				break;
X
X#ifndef	OSK
X			case '\r':	/* go into group */
X#else	/* OSK */
X			case '\l':	/* go into group */
X#endif	/* OSK */
X			case '\n':
X			case ctrl('F'):	/* cursor key */
X				space_mode = FALSE;
Xgo_into_group:
X				clear_message();
X				index_point = -1;
X				do {
X					group_page(
X					  active[my_group[cur_groupnum]].name);
X				} while (index_point == -3);
X				group_selection_page(-1, FALSE);
X				break;
X
X			case '/':	/* search forward */
X				search_group(TRUE);
X				break;
X
X			case '?':	/* search backward */
X				search_group(FALSE);
X				break;
X
X			case 'q':	/* quit */
X			case ctrl('B'):	/* cursor key */
X				tass_done(0);
X
X			case 'h':
X				tass_select_help();
X				group_selection_page(-1, FALSE);
X				break;
X
X			default:
X			    info_message("Bad command.  Type 'h' for help.");
X		}
X	}
X}
X
X
Xgroup_selection_page(ind, justone) 
Xint ind;
Xint justone;
X{
X	int i;
X	int n;
X	char new[10];
X	char subs;
X
X#ifdef SIGTSTP
X	signal(SIGTSTP, select_susp);
X#endif
X
X	if (ind < 0) {
X		ClearScreen();
X		printf("%s\r\012", nice_time()); /* print time in upper left */
X	}
X
X	show_mail ();
X
X	if (ind < 0)
X		center_line(1, "Group Selection");
X	MoveCursor(INDEX_TOP, 0);
X
X	first_group_on_screen = (cur_groupnum / NOTESLINES) * NOTESLINES;
X
X	last_group_on_screen = first_group_on_screen + NOTESLINES;
X	if (last_group_on_screen >= local_top)
X		last_group_on_screen = local_top;
X
X	for (i = first_group_on_screen; i < last_group_on_screen; i++) {
X		if ((ind >= 0) && (ind > i))
X			continue;
X		switch (unread[i]) {
X		case -2:
X			strcpy(new, "?   ");
X			break;
X
X		case -1:
X			strcpy(new, "-   ");
X			break;
X
X		case 0:
X			strcpy(new, "    ");
X			break;
X
X		default:
X			sprintf(new, "%-4d", unread[i]);
X		}
X
X		n = my_group[i];
X		if (active[n].flag & SUBS)	/* subscribed? */
X			subs = ' ';
X		else
X			subs = 'u';	/* u next to unsubscribed groups */
X
X		MoveCursor (INDEX_TOP + i - first_group_on_screen, 3);
X		printf("%c %4d", subs, i+1);
X		if (!justone)
X			printf (" %s", active[n].name);
X		MoveCursor (INDEX_TOP + i - first_group_on_screen, COLS - 8);
X		printf (" %s", new);
X		CleartoEOLN ();
X		if ((ind >= 0) && justone && (ind == i))
X			break;
X	}
X
X	if (last_group_on_screen < first_group_on_screen + NOTESLINES) {
X		MoveCursor (INDEX_TOP + last_group_on_screen + 1 - first_group_on_screen, 0);
X		CleartoEOLN ();
X	}
X
X	draw_group_arrow();
X}
X
X
Xprompt_group_num(ch)
Xchar ch;
X{
Xint num;
X
X	clear_message();
X
X	if ((num = parse_num(ch, "Select group> ")) == -1) {
X		clear_message();
X		return FALSE;
X	}
X	num--;		/* index from 0 (internal) vs. 1 (user) */
X
X	if (num >= local_top)
X		num = local_top - 1;
X
X	if (num >= first_group_on_screen
X	&&  num < last_group_on_screen) {
X		erase_group_arrow();
X		cur_groupnum = num;
X		draw_group_arrow();
X	} else {
X		cur_groupnum = num;
X		group_selection_page(-1, FALSE);
X	}
X
X	return TRUE;
X}
X
Xerase_group_arrow() {
X	erase_arrow(INDEX_TOP + (cur_groupnum-first_group_on_screen) );
X}
X
Xdraw_group_arrow() {
X	draw_arrow(INDEX_TOP + (cur_groupnum-first_group_on_screen) );
X}
X
Xvoid
Xsearch_group(forward)
Xint forward;
X{
X	char buf[LEN+1];
X	int i;
X#ifndef	REGEXP
X	extern char *regcmp();
X	extern char *regex();
X	char *re;
X#else	/* REGEXP */
X	regexp *re;
X#endif	/* REGEXP */
X	char *prompt;
X
X	clear_message();
X
X	if (forward)
X		prompt = "/";
X	else
X		prompt = "?";
X
X	if (!parse_string(prompt, buf))
X		return;
X
X	if (strlen(buf))
X		strcpy(group_search_string, buf);
X	else if (!strlen(group_search_string)) {
X		info_message("No search pattern");
X		return;
X	}
X
X	i = cur_groupnum;
X
X	glob_name(group_search_string, buf);
X
X#ifndef	REGEXP
X	if ((re = regcmp(buf, NULL)) == NULL) {
X#else	/* REGEXP */
X	if ((re = regcomp (buf)) == NULL) {
X#endif	/* REGEXP */
X		info_message("Bad search pattern");
X		return;
X	}
X
X	do {
X		if (forward)
X			i++;
X		else
X			i--;
X
X		if (i >= local_top)
X			i = 0;
X		if (i < 0)
X			i = local_top - 1;
X
X#ifndef	REGEXP
X		if (regex(re, active[my_group[i]].name) != NULL) {
X#else	/* REGEXP */
X		if (regexec (re, active[my_group[i]].name)) {
X#endif	/* REGEXP */
X			if (i >= first_group_on_screen
X			&&  i < last_group_on_screen) {
X				erase_group_arrow();
X				cur_groupnum = i;
X				draw_group_arrow();
X			} else {
X				cur_groupnum = i;
X				group_selection_page(-1, FALSE);
X			}
X			return;
X		}
X	} while (i != cur_groupnum);
X
X	info_message("No match");
X}
X
X
Xtass_select_help() {
X
X	ClearScreen();
X	center_line(0, TASS_HEADER);
X	center_line(1, "Group Selection Commands");
X
X	MoveCursor(3, 0);
X
X	printf("4        Select group 4\r\012");
X	printf("^D, ^V   half / full Page down\r\012");
X	printf("^R       Reset .newsrc\r\012");
X	printf("^U, ^Z   half / full Page up\r\012");
X	printf("^K       Delete group\r\012");
X	printf("^Y       Undelete group\r\012");
X	printf("<CR>     Read current group\r\012");
X	printf("<TAB>    View next unread group\r\012");
X	printf("c        Mark group as all read\r\012");
X	printf("g        Choose a new group by name\r\012");
X	printf("j        Down a line\r\012");
X	printf("k        Up a line\r\012");
X	printf("q        Quit\r\012");
X	printf("s        Subscribe to current group\r\012");
X	printf("u        Unsubscribe to current group\r\012");
X	printf("y        Yank in groups that are not in the .newsrc\r\012");
X	printf("$        Reread group list from .newsrc\r\012");
X	printf("/        Search forward for group\r\012");
X	printf("?        Search backward for group\r\012");
X
X	center_line(LINES, "-- hit any key --");
X	ReadCh();
X}
X
X
Xchoose_new_group() {
X	char buf[LEN+1];
X	char *p;
X	int ret;
X
X	if (!parse_string("Newsgroup> ", buf))
X		return -1;
X
X	for (p = buf; *p && (*p == ' ' || *p == '\t'); p++) ;
X	if (*p == '\0')
X		return -1;
X
X	ret = add_group(p, TRUE);
X	if (ret < 0)
X		info_message("Group not found in active file");
X
X	return ret;
X}
X
X
X/*
X *  Add a group to the selection list (my_group[])
X *  Return the index of my_group[] if group is added or was already
X *  there.  Return -1 if named group is not in active[].
X */
X
Xadd_group(s, get_unread)
Xchar *s;
Xint get_unread;			/* look in .newsrc for sequencer unread info? */
X{
X	long h;
X	int i, j;
X
X	{			/* find the hash of the group name */
X		char *t = s;
X
X		h = *t++;
X		while (*t)
X			h = (h * 64 + *t++) % TABLE_SIZE;
X	}
X
X	for (i = group_hash[h]; i >= 0; i = active[i].next)
X		if (strcmp(s, active[i].name) == 0) {
X			for (j = 0; j < local_top; j++)
X				if (my_group[j] == i)
X					return j;
X
X			active[i].flag &= ~NOTGOT;   /* mark that we got it */
X			my_group[local_top] = i;
X
X			if (get_unread)
X				unread[local_top] = get_line_unread(s, i);
X			else
X				unread[local_top] = -2;
X
X			local_top++;
X			return local_top - 1;
X		}
X
X	return -1;
X}
X
X
__END__OF__THIS__FILE__
if test -f 'sigs.c' ; then
  echo 'File sigs.c already exists, overwriting it'
  del 'sigs.c'
fi
echo Extracting \"'sigs.c'\"
sed "s/^X//" >'sigs.c' <<'__END__OF__THIS__FILE__'
X#include	<stdio.h>
X#include	"tass.h"
X
X#ifdef	APPEND_SIG
X#ifdef	RAND_SIG
Xstatic void
Xrandom_signature (buf, fpo, cnt)
Xchar *buf;
XFILE *fpo;
Xint cnt;
X{
X	static int	first = 1;
X	FILE		*fp;
X	char		inp[130];
X	int		n;
X
X	sprintf (buf, "%s/.randsig", homedir);
X	if (! (fp = fopen (buf, "r")))
X		return;
X	if (first) {
X		srandom (time (0));
X		first = 0;
X	}
X	n = _gs_size (fileno (fp));
X	n = random () % 
X		((n > (1 << 9)) ?
X			(n >> 7) :
X			((n > (1 << 5)) ?
X				(n >> 3) :
X				10));
X	while (n-- > 0) {
X		while (fgets (inp, 128, fp))
X			if (! strcmp (inp, "%%\n"))
X				break;
X		if (feof (fp)) {
X			clearerr (fp);
X			cleareof (fp);
X			rewind (fp);
X			continue;
X		}
X	}
X	while (fgets (inp, 128, fp) && (cnt-- > 0))
X		if (strcmp (inp, "%%\n"))
X			fputs (inp, fpo);
X		else
X			break;
X	fclose (fp);
X}
X#endif	/* RAND_SIG */
X		
Xvoid
Xadd_signature (fp)
XFILE *fp;
X{
X	extern char	*malloc ();
X	static char	*fn = NULL;
X	FILE		*fpi;
X	int		cnt;
X
X	if (!fn) {
X		if (!(fn = malloc (250)))
X			return;
X	}
X	sprintf (fn, "%s/.signature", homedir);
X	cnt = 4 * 400;
X	if (fpi = fopen (fn, "r")) {
X		putc ('\n', fp);
X		while (fgets (fn, 200, fpi) && (cnt-- > 0))
X			fputs (fn, fp);
X		fclose (fpi);
X	}
X#ifdef	RAND_SIG
X	if (cnt > 0)
X		random_signature (fn, fp, cnt);
X#endif	/* RAND_SIG */
X}
X#endif	/* APPEND_SIG */
X
X
__END__OF__THIS__FILE__
if test -f 'tass.h' ; then
  echo 'File tass.h already exists, overwriting it'
  del 'tass.h'
fi
echo Extracting \"'tass.h'\"
sed "s/^X//" >'tass.h' <<'__END__OF__THIS__FILE__'
X#include	<setjmp.h>
X
X#ifndef		OSK
X#define		LIBDIR		"/usr/lib/news"
X#define		SPOOLDIR	"/usr/spool/news"
X#define		MAILER		"/bin/rmail"
X#else		/* OSK */
X#define		LIBDIR		"/h0/USR/LIB/NEWS"
X#define		SPOOLDIR	"/h0/SPOOL/NEWS"
X#define		MAILER		"rmail"
X#ifdef		USE_UID
X#define		setgid(n)	/* */
X#endif		/* USE_UID */
X#endif		/* OSK */
X
X#ifndef		TRUE
X#define		TRUE		1
X#define		FALSE		0
X#endif		/* TRUE */
X
X#define		LEN		200
X
X#define		INDEX_TOP		4
X#define		NOTESLINES		(LINES - INDEX_TOP - 2)
X#define		RIGHT_POS		(COLS - 16)
X#define		MORE_POS		(COLS - 20)
X
X#define		MAX_FROM	25
X#define		MAX_SUBJ	38
X#define		TABLE_SIZE	1409
X
X/* #define		MAX_SUBJ	(COLS - 42)	*/
X
X
Xstruct header {
X	long artnum;
X	char subject[MAX_SUBJ];
X	char *nore;		/* pointer into subject after Re: */
X	char from[MAX_FROM];
X	int thread;
X	long hash;
X	int inthread;
X	int unread;		/* has this article been read? */
X				/* 0 = read, 1 = unread, 2 = will return */
X};
X
X/*
X *  header.artnum:
X *	article number in spool directory for group
X *
X *  header.nore
X *	pointer into header.subject after the Re:'s.
X *
X *  header.hash:
X *	hash of the subject minus the re's.  For fast subject comparison
X *
X *  header.thread:
X *	initially -1
X *	points to another arts[] (struct header): zero and up
X *	-2 means article has expired (wasn't found in file search
X *	of spool directory for the group)
X *
X *  header.inthread:
X *	FALSE for the first article in a thread, TRUE for all
X *	following articles in thread
X *
X *  header.read:
X *	boolean, has this article been read or not
X */
X
Xstruct group_ent {
X	char *name;
X	long max;
X	long min;
X	int next;		/* next active entry in hash chain */
X	int flag;
X};
X
X#define		NOTGOT		0x01	/* haven't put in my_group yet */
X#define		SUBS		0x02	/* subscribed to */
X
X
Xextern int top;
Xextern struct header *arts;
Xextern long *base;
Xextern int max_art;
X
Xextern char userid[LEN];
Xextern char homedir[LEN];
Xextern char indexdir[LEN];
Xextern char my_org[LEN];
Xextern char active_file[LEN];
X#ifdef	OSK
Xextern char spooldir[LEN];
X#endif	/* OSK */
X#ifdef	INCSTR
Xextern char *incstr;
X#endif	/* INCSTR */
Xextern char newsrc[LEN];
Xextern char newnewsrc[LEN];
Xextern char delgroups[LEN];
Xextern int top_base;
Xextern int LINES, COLS;
Xextern char *str_save();
Xextern char *my_malloc();
Xextern char *my_realloc();
Xextern int group_hash[TABLE_SIZE];
X
Xextern int num_active;
Xextern struct group_ent *active;
Xextern int *my_group;
Xextern int *unread;
Xextern int max_active;
X
Xextern int local_top;
Xextern char *eat_re();
Xextern char *nice_time();
Xextern int update;
Xextern int inverse_okay;
X
X#ifdef	USE_UID
Xextern int tass_uid;
Xextern int tass_gid;
Xextern int real_uid;
Xextern int real_gid;
X#endif	/* USE_UID */
Xextern int local_index;
Xextern int do_mail_check;
Xextern int omask;
X
Xextern jmp_buf jmp_buffer;
X
Xextern char *strcpy();
Xextern char *strncat();
Xextern char *strncpy();
Xextern long atol();
X
X
X#define		ctrl(c)			((c) & 0x1F)
X
X/*
X *  Assertion verifier
X */
X
X#ifdef __STDC__
X#define	assert(p)	if(! (p)) asfail(__FILE__, __LINE__, #p); else
X#else
X#define	assert(p)	if(! (p)) asfail(__FILE__, __LINE__, "p"); else
X#endif
X
X#define		TASS_HEADER	"Tass 3.0"
X
Xextern void	dump_index();
Xextern void	load_index();
Xextern void	find_local_index();
Xextern void	search_subject();
Xextern void	tass_group_help();
Xextern void	read_newsrc();
Xextern void	print_seq();
Xextern void	mark_group_read();
Xextern void	cancel_article();
Xextern void	save_art_to_file();
Xextern void	save_thread_to_file();
Xextern void	pipe_article();
Xextern void	open_note();
Xextern void	tass_page_help();
Xextern void	find_new_to();
Xextern void	search_group();
__END__OF__THIS__FILE__
if test -f 'time.c' ; then
  echo 'File time.c already exists, overwriting it'
  del 'time.c'
fi
echo Extracting \"'time.c'\"
sed "s/^X//" >'time.c' <<'__END__OF__THIS__FILE__'
X
X#include	<sys/types.h>
X#include	<time.h>
X
X
Xnicedate(timestr, newstr)
Xchar *timestr, *newstr;
X{
X	int i;
X
X	for (i = 0; i <= 7; i++)
X		*newstr++ = timestr[i];
X	if (timestr[8] != ' ')
X		*newstr++ = timestr[8];
X	*newstr++ = timestr[9];
X	*newstr++ = ',';
X	*newstr++ = ' ';
X	for (i = 20;i <= 23; i++)
X		*newstr++ = timestr[i];
X	*newstr++ = '\0';
X}
X
Xnicetime(timestr, newstr)
Xchar *timestr, *newstr;
X{
X	int hours;
X	char dayornite[3];
X
X	if (timestr[11] == ' ')
X		hours = timestr[12] - '0';
X	else
X		hours = (timestr[11]-'0')*10 + (timestr[12]-'0');
X	if (hours < 12)
X		strcpy(dayornite, "am");
X	else
X		strcpy(dayornite, "pm");
X	if (hours >= 13)
X		hours -= 12;
X	if (!hours)
X		hours = 12;
X	sprintf(newstr, "%d:%c%c%s", hours, timestr[14],
X					timestr[15], dayornite);
X}
X
Xchar *nice_time() {
X	char *timestr;
X	char the_date[17];
X	char the_time[8];
X#ifndef	OSK
X	extern char *ctime();
X#endif	/* OSK */
X	long time_now;
X	static char buf[25];
X
X	time(&time_now);
X	timestr = ctime(&time_now);
X	nicedate(timestr, the_date);
X	nicetime(timestr, the_time);
X	sprintf(buf,"%s  %s", the_date, the_time);
X	return(buf);
X}
X
__END__OF__THIS__FILE__
exit 0
: end of shell archive

-- 
Frank Kaefer # fkk@stasys.sta.sub.org # Starnberg, Germany
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads