Article View: de.comp.sources.os9
Article #12Tass for OS-9 Part03/03
From: Frank Kaefer
Date: Thu, 24 Dec 1992 13:05
Date: Thu, 24 Dec 1992 13:05
1217 lines
27057 bytes
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
Technical Details
Message-ID:
<1hccjhINN778@stasys.sta.sub.org>Path:
arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!ames!sun-barr!news2me.EBay.Sun.COM!seven-up.East.Sun.COM!sungy!stasys!stasys!not-for-mailShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!ames!sun-barr!news2me.EBay.Sun.COM!seven-up.East.Sun.COM!sungy!stasys!stasys!not-for-mail From: frank.kaefer@stasys.sta.sub.org (Frank Kaefer) Newsgroups: de.comp.sources.os9,comp.os.os9 Subject: Tass for OS-9 Part03/03 Message-ID: <1hccjhINN778@stasys.sta.sub.org> Date: 24 Dec 92 13:05:53 GMT Sender: news@stasys.sta.sub.org Followup-To: de.comp.sources.d Organization: Stasys News Server, Starnberg, Germany Lines: 1217 Approved: frank.kaefer@stasys.sta.sub.org (Frank Kaefer) NNTP-Posting-Host: stasys.sta.sub.org