[comp.sources.misc] v07i101: Index insertor for Scribe, TeX/LaTeX, *roff, etc. part 02/02

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/24/89)

Posting-number: Volume 7, Issue 101
Submitted-by: jbw@unix.cis.pittsburgh.edu (Jingbai  Wang)
Archive-name: indexor/part02

[[See part 1 for unpacking instructions.  ++bsa]]
#! /bin/sh
# This file was wrapped with "dummyshar".  "sh" this file to extract.
# Contents:  indexor.c-2
echo extracting 'indexor.c-2'
if test -f 'indexor.c-2' -a -z "$1"; then echo Not overwriting 'indexor.c-2'; else
sed 's/^X//' << \EOF > 'indexor.c-2'
X
X}
X
Xcursor_right()
X{
X
Xif (cursor_mark>=buffer_length-1) {next_page(); return;}
X   ++cursor_mark; cursor_position();
X   if (marker==1) printf("%c",buffer[cursor_mark]);
X   GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y);
X
X}
X
Xcursor_left()
X{
X  if (cursor_mark<=cursor_last) {cursor_mark=cursor_last; cursor_position();BELL; return;}
X  NORMAL; cursor_position();printf("%c",buffer[cursor_mark]);
X  --cursor_mark;
X  if (marker==1) REVERSE;
X  GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y);
X
X
X}
X
Xcursor_down()
X{
Xint i,the_stop;
Xchar check;
Xthe_stop=cursor_mark;
X
Xcursor_position();
Xfor (i=cursor_mark;i<buffer_length;i++)
X {if (i>=buffer_length-2) {next_page();return;}
X  if (buffer[i]==10) {cursor_mark=i+1;
X     cursor_position();goto check;}
X }
X
Xcheck:
X  if (marker)
X   { GOTOXY(chr[the_stop].x,chr[the_stop].y);
X     for (i=the_stop;i<=cursor_mark;i++)
X      printf("%c",buffer[i]);
X     cursor_position();
X   }
X}
X
Xcursor_up()
X{
Xchar check;
Xint i,the_stop;
Xif (cursor_mark<=cursor_last) {cursor_mark=cursor_last;cursor_position(); BELL; return;}
X
Xcursor_position();the_stop=cursor_mark;
Xfor (i=cursor_mark;i>=cursor_last;i--)
X {
X  if (buffer[i]==10) {cursor_mark=i-1;
X  GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y);
X  goto check;}
X }
X cursor_mark=cursor_last; cursor_position(); BELL;
X
Xcheck:
X  if (marker)
X   {
X    NORMAL; GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y);
X    for (i=cursor_mark+1;i<=the_stop;i++)
X       printf("%c",buffer[i]);
X    REVERSE;
X    GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y);
X   }
X
X}
X
X
X
X
X
X
Xmark_word()
X{
Xif (marker==0) mark_begin(); word_skip();return;
X}
X
Xpass_marked()
X{
Xint i;
Xif (marker==0) { word_skip();return;}
XGOTOXY(chr[cursor_last].x,chr[cursor_last].y);
Xmarker=0; NORMAL;
X phrase_str[0]= 0;
X for (i=cursor_last;i<=cursor_mark;i++)
X     printf("%c",buffer[i]);
X
Xcursor_mark=cursor_last;
Xcursor_position();
X}
X
X
Xword_skip()
X{
Xint i, the_stop;
Xchar check;
X
Xthe_stop=cursor_mark;
Xif (cursor_mark>=buffer_length-1) {next_page(); return;}
X
Xcursor_right();
Xfor (i=cursor_mark; i<buffer_length;i++)
X {
X
X  switch(buffer[i])
X   {case '!':
X    case ',':
X    case '"':
X    case '\'':
X    case '`':
X    case '(':
X    case ')':
X    case '[':
X    case ']':
X    case '/':
X    case '+':
X    case '=':
X    case '?':
X    case '<':
X    case '>':
X    case '{':
X    case '}':
X    case '*':
X    case '^':
X    case '&':
X    case '#':
X    case ':':
X    case ';':
X    case '|':
X    case  9:
X    case 10:
X    case 13:
X    case '~':
X    case '@':
X    case '\\':
X    case 32:
X    case '.': if (word_mark) {word_mark=0;cursor_mark=i-1;
X			     cursor_position();
X			     goto check;}
X	      else break;
X    default:   word_mark=1;
X
X   }
X  }
X
Xcheck:
X  if(marker)
X   { GOTOXY(chr[the_stop].x,chr[the_stop].y);
X     for (i=the_stop;i<=cursor_mark;i++)
X	printf("%c",buffer[i]);
X    cursor_position();
X   }
X
X}
X
X
X
Xword_back()
X{
Xint i, the_stop;
Xchar check;
Xthe_stop=cursor_mark;
Xcursor_left();
Xfor (i=cursor_mark; i>=0;i--)
X { if (i<=cursor_last) {cursor_mark=cursor_last;
X			cursor_position();BELL;goto check;}
X
X  switch(buffer[i])
X   {case '!':
X    case ',':
X    case '"':
X    case '\'':
X    case '`':
X    case '(':
X    case ')':
X    case '[':
X    case ']':
X    case '/':
X    case '+':
X    case '=':
X    case '?':
X    case '<':
X    case '>':
X    case '{':
X    case '}':
X    case '*':
X    case '^':
X    case '&':
X    case '#':
X    case ':':
X    case ';':
X    case '|':
X    case  9:
X    case 10:
X    case 13:
X    case '~':
X    case '@':
X    case '\\':
X    case 32:
X    case '.':
X	     if (word_mark) {word_mark=0; cursor_mark=i; cursor_position();
X		goto check;
X	      }
X	      else  break;
X    default:   word_mark=1;
X
X    }
X  }
X
Xcheck:
X  if (marker)
X   {GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y);
X    NORMAL;
X     for (i=cursor_mark+1;i<=the_stop;i++)
X	 printf("%c",buffer[i]);
X
X    REVERSE;
X    cursor_position();
X   }
X}
X
X
Xnext_page()
X{
Xint i, length, pre_row, ch_count;
X
XNORMAL;
XCLS_UP();
XGOTOXY(1,1);  pre_row=0; ch_count=0;
X
Xif (end_outfile) {BELL; return;}
X
X
Xif (marker){
X if ((strlen(phrase_str)+strlen(&buffer[phrase_on]))<510)
X  strcat(phrase_str, &buffer[phrase_on]);
X else marker=0;
X}
X
Xfor (i=buffer_line[lines-2];i<buffer_length;i++)
X {
X if ((marker==1) && (i>=phrase_on)) {REVERSE;}
X   printf("%c", buffer[i]);
X }
X
Xfor (i=cursor_last;i<buffer_length;i++)
X  {   fprintf(outfile,"%c",buffer[i]);
X  if (buffer[i]==10)
X     {
X      if (next_flag==1) {
X			 fprintf(outfile, "%s\n", next_str);
X			 next_str[0]=0; next_flag=0;
X			 }
X     }
X
X  }
X
X
Xcursor_last=0;
Xphrase_on=0;
Xcursor_mark=0;
Xbuffer_length=0;
XNORMAL;
X
Xif (end_infile) {end_outfile=1;
X		 GOTOXY(17, 70); BOLD;printf("[EOF]"); BELL; return;}
X
Xend_infile=read_in();
Xif (marker) {REVERSE; printf("%c",buffer[0]);cursor_position();}
X}
X
X
Xcontrol(inchar)
Xchar inchar;
X{
Xchar ch;
X
X
X switch(inchar)
X     {
X       case EXT:
X#if unix|VMS
X             /* mainframe  environment  */
X               if (getch()!=EXT1) {BELL;break;}
X               ch=getch();
X#else
X             /* DOS environment              */ 
X
X             ch=getch();
X#endif            
X
X             switch(ch)
X              { 
X               case L_ARROW: cursor_left(); 
X                   break;
X               case R_ARROW: cursor_right();
X                   break;
X               case D_ARROW: cursor_down();
X                   break;
X	       case U_ARROW: cursor_up();
X                   break;
X               default: BELL;
X              }
X
X          break;
X       case 13: if (marker==0) {mark_begin(); break;}
X                if (marker==1) 
X                 {mark_end(); index_now();}
X                 break;     
X       case 9:  word_skip(); break;
X       case 'b':
X       case 'B':
X       case 8:
X       case 127:
X                word_back(); break;
X       case 32: next_page(); break;
X       case 'n':
X       case 'N': if (marker==1) 
X                {mark_end();index_next_line();} 
X                 else BELL; break;    
X       case 'p':
X       case 'P': pass_marked(); break;
X       case 'f':
X       case 'F': finish_up(); return(1); break;
X       case 'a':
X       case 'A': if (marker==1) mark_end(); see_also();break;
X       case 's':
X       case 'S': if (marker==1) mark_end();index_secondary();break;
X       case 'i':
X       case 'I': if (marker==1) mark_end();index_entry();break;
X       case 'g':
X       case 'G': if (marker==1) mark_end();
X	      else warning("No current marked, will take the previous one");
X		 glossary();
X		   break;
X       case 'W':
X       case 'w': mark_word(); break;
X       case '@': set_up(); break;
X       case  6 : str_search(); break;
X       case  3 : all_done(); break;
X#if unix
X       case  4 : all_done(); break;
X#endif
X       default: BELL;
X   }
X
X
X}
X
X
X
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
Xint in_file,out_file, status;
Xint i,j;
Xchar infile_name[30], outfile_name[30];
Xchar out_ok=1;
Xchar ch, quit;
Xchar getch();
X
X#if     VMS
X$DESCRIPTOR(terminal,"TT");
X
X        status = SYS$ASSIGN(&terminal, &iochan, 0, 0);
X        if (status != SS$_NORMAL) exit(status);
X
Xsystem("set broadcast=none");
X
X#endif
X
X
XNORMAL;
XCLS;
X 
Xswitch(argc)
X  {
X    case 1: in_file=1; out_file=1; break;
X    case 2: in_file=0; out_file=1; strcpy(infile_name,argv[1]); break;
X    default: in_file=0;out_file=0;
X           strcpy(infile_name,argv[1]); 
X           strcpy(outfile_name,argv[2]); break;
X  }
X
X if (in_file) 
X   {GOTOXY(5,15);
X   printf(" Input file (file to be indexed) >");
X   scanf("%s",infile_name);
X   fflush(stdin);
X   }
X
X   if ((infile=fopen(infile_name,"r"))==NULL)
X     {GOTOXY(20,20); BLINK;
X       printf("Can't find the input file");
X       NORMAL; goto quit;
X     }
X
Xwhile (out_ok)
X
X {
X  if (out_file) 
X    {GOTOXY(6,15); ERASE;
X    printf(" Output file (indexed file) >");
X    fscanf(stdin, "%s",outfile_name);
X    fflush(stdin);
X    }
X
X
X    out_ok=0; 
X   if ((outfile=fopen(outfile_name,"r"))!=NULL)
X     { out_ok=1;
X       GOTOXY(7,16); ERASE;
X       out_file=1;
X      fflush(stdin);
X      printf("File %s already exits, overwrite ? [N]", outfile_name);
X      ch=getch();
X      ch=getch();
X        if ((ch=='y')||(ch=='Y')) out_ok=0;
X        fclose(outfile);
X
X     }
X
X    if (out_ok==0)
X       {
X	outfile=fopen(outfile_name,"w");
X       }
X }
X
X
X
XNORMAL;
XCLS;
X
Xhelp_menu();
Xend_infile=read_in();
X
X while (1)
X  {
X   control(getch());
X   if (exit_flag) goto quit;
X  }
X
Xquit:
XGOTOXY(25, 1);
Xprintf("\n\t>>> Thank you for using INDEX MAKER >>>\n");
Xprintf("\t>>> by Jingbai Wang, August 1988 >>>\n");
X
X
X
X}
X
Xwarning(warn_str)
Xchar *warn_str;
X{
Xchar i;
X
XSAVE_CURSOR;
XGOTOXY(24,5); REVERSE; BLINK;
Xprintf("%s", warn_str); BELL; BELL;
Xfor (i=1;i<10000;i++) ;
XGOTOXY(24,1); RESTORE_CURSOR; NORMAL;
X}
X
Xvoid  clr_show()
X{
Xint i;
Xfor (i=13;i<17;i++)
X  {NORMAL; GOTOXY(i,1);ERASE;}
X}
X
X
Xindex_now()
X{ int i;
Xfprintf(outfile, "%s%s%s%s",the_index,the_delimiter1,phrase_str,the_delimiter2);
XSAVE_CURSOR;
Xclr_show(); out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s",the_index,the_delimiter1,out_str,the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X}
X
Xindex_next_line()
X{
Xint i;
X
Xnext_flag=1;
Xstrcat(next_str, the_index);
Xstrcat(next_str, the_delimiter1);
X    if ((strlen(next_str)+strlen(phrase_str))<510) 
X        strcat(next_str, phrase_str);
Xstrcat(next_str, the_delimiter2);
XSAVE_CURSOR;
Xclr_show(); out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s}", the_index,the_delimiter1,out_str,the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X
X}
X
Xsee_also()
X{
XSAVE_CURSOR;BELL;
XGOTOXY(24,2); BLINK; REVERSE;
Xprintf("  Primary=");  NORMAL;printf("[%s]",save_str);
Xget_line();
Xif (memcmp(command_line,"",1)==0) strcpy(command_line, save_str);
X else strcpy(save_str, command_line);
Xfprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1,
Xthe_primary,the2_delimiter1,command_line, the2_delimiter2,the_second,
Xthe2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2);
XGOTOXY(24,1);ERASE;
Xclr_show();  out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1,
Xthe_primary,the2_delimiter1,command_line, the2_delimiter2,the_second,
Xthe2_delimiter1,out_str,the2_delimiter2, the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X
X}
X
Xindex_entry()
X{
Xchar entry[20], number[30];
Xstrcpy(save_str, phrase_str);
X
Xstrcpy(number, ",\nNumber=<");
XSAVE_CURSOR;BELL;
XGOTOXY(24,2); BLINK; REVERSE;
Xprintf("  Entry=");  NORMAL;printf("[%s]",phrase_str);
Xget_line();
Xif (memcmp(command_line,"",1)==0) strcpy(entry, phrase_str);
X else strcpy(entry, command_line);
XGOTOXY(24,1);ERASE;
XGOTOXY(24,2); BLINK; REVERSE;
Xprintf("  Number=");  NORMAL;
Xget_line();
Xif (memcmp(command_line,"",1)==0) number[0]=0;
X else  {strcat(number, command_line); strcat(number, ">");}
X
X
Xfprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1,
Xthe_key,the2_delimiter1,phrase_str, the2_delimiter2,the_entry,
Xthe2_delimiter1,entry,the2_delimiter2,  number, the_delimiter2);
XGOTOXY(24,1);ERASE;
Xclr_show();  out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1,
Xthe_key,the2_delimiter1,out_str, the2_delimiter2,the_entry,
Xthe2_delimiter1,entry,the2_delimiter2, number, the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X
X}
X
Xindex_secondary()
X{
XSAVE_CURSOR;BELL;
XGOTOXY(24,2); BLINK; REVERSE;
Xprintf("  Primary=");  NORMAL;printf("[%s]",save_str);
Xget_line();
Xif (memcmp(command_line,"",1)==0) strcpy(command_line, save_str);
X else strcpy(save_str, command_line);
Xfprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1,
Xthe_primary,the2_delimiter1,command_line, the2_delimiter2,the_second,
Xthe2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2);
XGOTOXY(24,1);ERASE;
Xclr_show();  out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1,
Xthe_primary,the2_delimiter1,command_line, the2_delimiter2,the_second,
Xthe2_delimiter1,out_str,the2_delimiter2, the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X
X}
X
Xglossary()
X{
XSAVE_CURSOR;
XGOTOXY(24,2); BLINK; REVERSE;
Xprintf("  Description:");  NORMAL;
Xget_line();
Xfprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1,
Xg_primary,the2_delimiter1,phrase_str, the2_delimiter2,g_second,
Xthe2_delimiter1,command_line,the2_delimiter2, the_delimiter2);
XGOTOXY(24,1);ERASE;
Xclr_show();  out_check();
XGOTOXY(13,1);
XBOLD;
Xprintf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1,
Xg_primary,the2_delimiter1,command_line, the2_delimiter2,g_second,
Xthe2_delimiter1,out_str,the2_delimiter2, the_delimiter2);
XNORMAL; RESTORE_CURSOR;
X
X}
X
X
Xfinish_up()
X{ char ch;
X  int i;
X
Xif(end_infile && end_outfile) {all_done(); exit();}
X
X
Xif (marker) {mark_end(); index_now(); }
X
Xfor (i=cursor_last;i<buffer_length;i++)
X  {
X  if (buffer[i]==13)
X     { 
X      if (next_flag==1) {
X			 fprintf(outfile, "%s\n\n", next_str);
X			 next_str[0]=0; next_flag=0;
X			 }
X     }
X  else fprintf(outfile,"%c",buffer[i]);
X  }
X
X
X
Xif (end_infile==1) {all_done(); return;}
XGOTOXY(24,35); BLINK; printf("Working ... \n");
X
X    while (fscanf(infile,"%c",&ch)!=EOF)
X      {
X	if (ch==13);
X	else fprintf(outfile, "%c", ch);
X      }
X  all_done();NORMAL;
X}
X
X
Xall_done()
X{
Xfclose(infile); fclose(outfile); exit_flag=1;
X#if VMS
Xsystem("set broadcast=all");
X#endif
X}
X
X
XCLS_UP()
X{ char i;
X
Xfor(i=1;i<12;i++)
X  {GOTOXY(i,1); ERASE;}
X
X}
X
Xhelp_menu()
X{
XGOTOXY(12, 1);
XREVERSE; printf("                                ");
Xprintf(" Inserting                                 ");
X
XGOTOXY(17,1);
Xprintf(" ===== ^H delete ======================== ^F Search string ===============");
XNORMAL;
XGOTOXY(18,3); BOLD; printf("SPACE BAR"); NORMAL; printf(" -- next page");
XGOTOXY(19,3); BOLD; printf("<RETURN> 1"); NORMAL; printf(" -- set mark");
XGOTOXY(20,3); BOLD; printf("<RETURN> 2"); NORMAL; printf(" -- end mark & index");
XGOTOXY(21,3); BOLD; printf("<TAB>"); NORMAL; printf(" -- forward a word");
XGOTOXY(22,40); BOLD; printf("G"); NORMAL; printf(" -- end mark & glossary");
XGOTOXY(22,3); BOLD; printf("W"); NORMAL; printf(" -- mark word");
XGOTOXY(21,40); BOLD; printf("B"); NORMAL; printf(" -- backward a word");
XGOTOXY(20,40); BOLD; printf("N"); NORMAL; printf(" -- end mark & index in next line");
XGOTOXY(19,40); BOLD; printf("P"); NORMAL; printf(" -- abandon the marked/skip a word ");
XGOTOXY(18,40); BOLD; printf("F"); NORMAL; printf(" -- finish     \
X        ^F--string search");
XGOTOXY(23,40); BOLD; printf("S"); NORMAL; printf(" -- IndexSecondary");
XGOTOXY(23,17); BOLD; printf("I"); NORMAL; printf(" -- IndexEntry");
XGOTOXY(23,3); BOLD; printf("A"); NORMAL; printf(" -- SeeAlso");
XGOTOXY(23,65); BOLD; printf("@"); NORMAL; printf(" -- set up");
X}
X
X
Xset_up()
X{
Xint the_row, i;
Xint ch_count;
Xchar ch, string[81];
X
Xch_count=0;
XSAVE_CURSOR;
XNORMAL; REVERSE;
XGOTOXY(12,1);
Xprintf("                            Set-up Menu                  <TAB> to quit      ");
XNORMAL;
Xfor (i=13;i<24;i++)
X  {GOTOXY(i,1);ERASE;}
X
XGOTOXY(13,3);printf("[%s]:",the_index);
XGOTOXY(14,3);printf("[%s]:",the_indexentry);
XGOTOXY(15,3);printf("[%s]:",the_indexsecond);
XGOTOXY(16,3);printf("[%s]:",the_seealso);
XGOTOXY(17,3);printf("[%s]:",the_primary);
XGOTOXY(18,3);printf("[%s]:",the_second);
XGOTOXY(19,3);printf("[%s]:",the_gloss);
XGOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);
XGOTOXY(21,3);printf("Gloss k2 [%s]:",g_second);
XGOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);
XGOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);
XGOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1);
XGOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);
X
Xthe_row=13;
Xset_up_in(the_row);
X
X     while(1)
X      { ch=getch();
X	 switch(ch)
X	 {
X	  case EXT:
X#if unix | VMS
X
X	     /* VAX */
X	     ch=getch(); if (ch!=EXT1) {BELL;break;}
X	     ch=getch();
X#else
X               /* DOS                 */
X	      ch=getch(); 
X#endif	    
X	     switch(ch)
X	     {
X	      case L_ARROW:
X	      case U_ARROW:
X			   set_up_out(the_row); ch_count=0;string[0]=0;
X			   --the_row; if (the_row<13) the_row=25;
X			   set_up_in(the_row); break;
X	      case R_ARROW:
X	      case D_ARROW:
X  down:                        set_up_out(the_row);ch_count=0;string[0]=0;
X			   ++the_row; if (the_row>25) the_row=13;
X			   set_up_in(the_row); break;
X	     default: BELL;
X	     } break;
X       case  3 : all_done(); break;
X#if unix
X       case  4 : all_done(); break;
X#endif
X	  case 1:
X	  case 2:
X	  case 5:
X	  case 6:
X	  case 7:
X	  case 10:
X	  case 11:
X	  case 12:
X	  case 14:
X	  case 15:
X	  case 16:
X	  case 19:
X	  case 20:
X	  case 21:
X	  case 22:
X	  case 23:
X	  case 24:
X	  case 25:
X	  case 26:BELL;break;
X          case 8:
X          case 127:
X	          if (ch_count>0){
X                  CURSOR_LEFT; ERASE;
X                  string[--ch_count]=0;
X                  }  break;
X
X	  case 13: if (ch_count>0)
X		  { string[ch_count]=0;
X		   set_up_save(the_row, string);
X		   } goto down;break;
X	  case 9: NORMAL;for (i=12;i<24;i++)
X		   {GOTOXY(i,1);ERASE;}
X		   help_menu();RESTORE_CURSOR;
X		   return;
X	  default: printf("%c",ch);string[ch_count++]=ch;
X
X	 }
X
X      }
X
X
X}
X
X
X
X
X
Xset_up_in( the_row)
Xint the_row;
X{ REVERSE;
X      switch(the_row)
X	{
X	 case 13:
XGOTOXY(13,3);printf("[%s]:",the_index);break;
Xcase 14:
XGOTOXY(14,3);printf("[%s]:",the_indexentry);break;
Xcase 15:
XGOTOXY(15,3);printf("[%s]:",the_indexsecond);break;
Xcase 16:
XGOTOXY(16,3);printf("[%s]:",the_seealso);break;
Xcase 17:
XGOTOXY(17,3);printf("[%s]:",the_primary); break;
Xcase 18:
XGOTOXY(18,3);printf("[%s]:",the_second);  break;
Xcase 19:
XGOTOXY(19,3);printf("[%s]:",the_gloss);  break;
Xcase 20:
XGOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break;
Xcase 21:
XGOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break;
Xcase 22:
XGOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break;
Xcase 23:
XGOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break;
Xcase 24:
XGOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break;
Xcase 25:
XGOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break;
X
X	}
X
X}
X
X
Xset_up_save(the_row, string)
Xint the_row;
Xchar *string;
X{
X      switch(the_row)
X	{
X	 case 13:strcpy(the_index,string);break;
X	 case 14:strcpy(the_indexentry,string);break;
X	 case 15:strcpy(the_indexsecond,string);break;
X	 case 16:strcpy(the_seealso,string);break;
X	 case 17:strcpy(the_primary,string);break;
X	 case 18:strcpy(the_second,string);break;
X	 case 19:strcpy(the_gloss,string);break;
X	 case 20:strcpy(g_primary,string);break;
X	 case 21:strcpy(g_second,string);break;
X	 case 22:strcpy(the_delimiter1,string);break;
X	 case 23:strcpy(the_delimiter2,string);break;
X	 case 24:strcpy(the2_delimiter1,string);break;
X	 case 25:strcpy(the2_delimiter2,string);break;
X
X	}
X
X}
X
X
X
Xset_up_out(the_row)
Xint the_row;
X{  NORMAL;
X      switch(the_row)
X	{
X	 case 13:GOTOXY(13,1);ERASE;
XGOTOXY(13,3); printf("[%s]:",the_index);break;
Xcase 14:GOTOXY(14,1);ERASE;
XGOTOXY(14,3);printf("[%s]:",the_indexentry);break;
Xcase 15:GOTOXY(15,1);ERASE;
XGOTOXY(15,3);printf("[%s]:",the_indexsecond);break;
Xcase 16:GOTOXY(16,1);ERASE;
XGOTOXY(16,3);printf("[%s]:",the_seealso);break;
Xcase 17:GOTOXY(17,1);ERASE;
XGOTOXY(17,3);printf("[%s]:",the_primary); break;
Xcase 18:GOTOXY(18,1);ERASE;
XGOTOXY(18,3);printf("[%s]:",the_second);  break;
Xcase 19:GOTOXY(19,1);ERASE;
XGOTOXY(19,3);printf("[%s]:",the_gloss);  break;
Xcase 20:GOTOXY(20,1);ERASE;
XGOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break;
Xcase 21:GOTOXY(21,1);ERASE;
XGOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break;
Xcase 22:GOTOXY(22,3);printf("                                 ");
XGOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break;
Xcase 23:GOTOXY(22,40);ERASE;
XGOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break;
Xcase 24:GOTOXY(23,3);printf("                               ");
XGOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break;
Xcase 25:GOTOXY(23,40);ERASE;
XGOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break;
X
X	}
X
X}
X
Xout_check()
X{int i, rows, length, trunc;
Xrows=1;  trunc=256;
X
Xstrcpy(out_str,phrase_str);
Xlength=strlen(out_str);
X
Xfor (i=0;i<length; i++)
X {
X  if (out_str[i]==10) ++rows;
X  if (rows==2) {trunc=i-4;break;}
X }
X
X
Xif (length>trunc) {out_str[trunc]='.';out_str[trunc+1]='.';out_str[trunc+2]='.';
Xout_str[trunc+3]=0;}
X}
X
X
X
Xget_line()
X{
Xchar ch;
Xint ch_count;
X
Xch_count=0;
X
Xcommand_line[0]=0;
X
X     while(1)
X      { ch=getch();
X         switch(ch)
X          {
X          case 3: all_done(); break;
X#if unix
X          case 4: all_done(); break;
X#endif       
X          case 0:
X	  case 1:
X	  case 2:
X
X	  case 5:
X	  case 6: 
X	  case 7:
X	  case 10:
X	  case 11:
X	  case 12:
X	  case 14:
X	  case 15:
X	  case 16:
X	  case 19:
X	  case 20:
X	  case 21:
X	  case 22:
X	  case 23:
X	  case 24:
X	  case 25:
X	  case 26: BELL;break;
X          case 8:
X          case 127:
X	          if (ch_count>0){
X                  CURSOR_LEFT; ERASE;
X                  command_line[--ch_count]=0;
X                  }  break;
X	  case 13: if (ch_count>0)
X		     command_line[ch_count]=0;
X		     return;
X	  default: printf("%c",ch);command_line[ch_count++]=ch;
X
X	 }
X    }
X
X}
X
X
Xstr_search()
X{
Xchar *ptr;
X#if unix
Xchar *memchr();
X#endif
Xint same_page= -1;
Xvoid  this_page();
Xint cursor_here=0,i;
Xcommand_line[0]=0;
XSAVE_CURSOR;
X
XGOTOXY(24,2); REVERSE;
Xprintf("String:"); NORMAL; printf(" ");
Xif (the_phrase[0]>0) printf("[%s]", the_phrase);
Xget_line();
X
Xif (command_line[0]>0) strcpy(the_phrase, command_line);
X  else if (the_phrase[0]==0)  {GOTOXY(24,2); ERASE; RESTORE_CURSOR; 
X        return;}
X
Xptr=buffer;
Xif (same_page<0)
X  while ( cursor_here<cursor_mark) {cursor_here++; ptr++;}  
X
Xwhile (1){
X
Xwhile ((ptr=memchr(ptr, the_phrase[0], buffer_length))!=NULL)
X    {
X    if( memcmp(ptr, the_phrase, strlen(the_phrase))==0)
X      { GOTOXY(24,2); ERASE;
X       this_page(same_page*cursor_here); return;}
X    else {ptr++;}       
X    }
X
X   /* Writing the buffer into the output file */
X
Xfor (i=cursor_last;i<buffer_length;i++)
X  {   fprintf(outfile,"%c",buffer[i]);
X  if ((same_page<0) && (buffer[i]==10))
X     {
X      if (next_flag) {
X			 fprintf(outfile, "%s\n", next_str);
X			 next_str[0]=0; next_flag=0;
X			 }
X     }
X
X  }
X
X
Xif (same_page<0)
X{
X marker=0;
Xcursor_last=0;
Xphrase_on=0;
Xcursor_mark=0;
Xbuffer_length=0;
Xnext_flag=0;
Xsame_page=1;
X}
X
X
Xif (end_infile) { end_outfile=1;
X		 GOTOXY(17, 70); BOLD;printf("[EOF]"); BELL;
XGOTOXY(24, 2); printf("String not found"); 
Xall_done();
X exit();}
X
Xend_infile=read_in_only(); cursor_here=0; ptr=buffer;
X }
X
X}
X
X
Xint read_in_only()
X{
Xint i, quit_s;
Xchar quit;
Xchar string[81];
X
X
Xbuffer_length=0;
Xbuffer[0]=0;
Xstring[0]=0;
X           quit_s=0;
X
Xfor (i=1;i<=8;i++)
X  { if( fgets(string,80,infile)==NULL)
X        {fclose(infile); quit_s=1; goto quit;}
X           strcat(buffer,string);
X  }
X
Xquit:
Xbuffer_length=strlen(buffer);
X
Xreturn(quit_s);
X}
X
X
Xvoid this_page(cursor_here)
Xint cursor_here;
X{
Xint i, cursor_there, the_cursor;
X
Xif (cursor_here<0) cursor_there= (-1)*cursor_here;
X   else cursor_there=0;
X
Xfor (i=cursor_there;i<buffer_length;i++)
X if(memcmp(&buffer[i], the_phrase, strlen(the_phrase))==0) 
X  {the_cursor=i; break;}
X
Xif (cursor_here<0) {
X     if (marker) 
X      {REVERSE; cursor_mark=cursor_last; cursor_position(); marker=0;
X       for (i=cursor_last; i<=the_cursor; i++)
X        {
X        printf("%c", buffer[i]);
X        }
X       NORMAL;
X      }
X     cursor_mark= the_cursor;
X     cursor_position();
X      }
X    else 
X   {
X   position();
X   NORMAL; CLS_UP(); NORMAL; 
X   GOTOXY(3,1);
X   for (i=0;i<buffer_length;i++)
X     printf("%c", buffer[i]);
X   cursor_mark=the_cursor;
X   cursor_position();
X   }
X
Xreturn;
X}
X
X
X
X/* for ultrix define V7 = 1 */
X
X/*
X * The functions in this file negotiate with the operating system for
X * characters, and write characters in a barely buffered fashion on the display.
X * All operating systems.
X */
X
X
X#if   MSDOS & TURBO
X#include <conio.h>
X#endif
X
X#if     AMIGA
X#define NEW 1006L
X#define AMG_MAXBUF      1024L
Xstatic long terminal;
Xstatic char     scrn_tmp[AMG_MAXBUF+1];
Xstatic long     scrn_tmp_p = 0;
X#endif
X
X#if     CPM
X#include        <bdos.h>
X#endif
X
X#if     MSDOS & (LATTICE | MSC | TURBO | AZTEC | MWC86)
Xunion REGS rg;          /* cpu register for use of DOS calls */
Xint nxtchar = -1;       /* character held from type ahead    */
X#endif
X
X#if RAINBOW
X#include "rainbow.h"
X#endif
X
X#if     USG                     /* System V */
X#include        <signal.h>
X#include        <termio.h>
X#include        <fcntl.h>
Xint kbdflgs;                    /* saved keyboard fd flags      */
Xint kbdpoll;                    /* in O_NDELAY mode                     */
Xint kbdqp;                      /* there is a char in kbdq      */
Xchar kbdq;                      /* char we've already read      */
Xstruct  termio  otermio;        /* original terminal characteristics */
Xstruct  termio  ntermio;        /* charactoristics to use inside */
X#endif
X
X#if V7 | BSD
X/*
X#undef  CTRL
X*/
X#include        <sgtty.h>        /* for stty/gtty functions */
X#include        <signal.h>
Xstruct  sgttyb  ostate;          /* saved tty state */
Xstruct  sgttyb  nstate;          /* values for editor mode */
Xstruct tchars   otchars;        /* Saved terminal special character set */
Xstruct tchars   ntchars = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
X                                /* A lot of nothing */
X#if BSD
X#include <sys/ioctl.h>          /* to get at the typeahead */
Xextern  int rtfrmshell();       /* return from suspended shell */
X#define         TBUFSIZ         128
Xchar tobuf[TBUFSIZ];            /* terminal output buffer */
X#endif
X#endif
X
X/*
X * This function is called once to set up the terminal device streams.
X */
Xttopen()
X{
X
X#if     AMIGA
X        char oline[NSTRING];
X#if     AZTEC
X        extern  Enable_Abort;   /* Turn off ctrl-C interrupt */
X
X        Enable_Abort = 0;       /* for the Manx compiler */
X#endif
X        strcpy(oline, "RAW:0/0/640/200/");
X        strcat(oline, PROGNAME);
X        strcat(oline, " ");
X        strcat(oline, VERSION);
X        strcat(oline, "/Amiga");
X        terminal = Open(oline, NEW);
X#endif
X#if     CPM
X#endif
X
X#if     MSDOS & (HP150 == 0) & LATTICE
X        /* kill the ctrl-break interupt */
X        rg.h.ah = 0x33;                 /* control-break check dos call */
X        rg.h.al = 1;            /* set the current state */
X        rg.h.dl = 0;            /* set it OFF */
X        intdos(&rg, &rg);       /* go for it! */
X#endif
X
X#if     USG
X        ioctl(0, TCGETA, &otermio);     /* save old settings */
X        ntermio.c_iflag = 0;            /* setup new settings */
X        ntermio.c_oflag = 0;
X        ntermio.c_cflag = otermio.c_cflag;
X        ntermio.c_lflag = 0;
X        ntermio.c_line = otermio.c_line;
X        ntermio.c_cc[VMIN] = 1;
X        ntermio.c_cc[VTIME] = 0;
X        ioctl(0, TCSETA, &ntermio);     /* and activate them */
X        kbdflgs = fcntl( 0, F_GETFL, 0 );
X        kbdpoll = FALSE;
X#endif
X
X#if     V7 | BSD
Xif (tt_status==tt_open) return;
X        gtty(0, &ostate);                       /* save old state */
X        gtty(0, &nstate);                       /* get base of new state */
X        nstate.sg_flags |= RAW;
X        nstate.sg_flags &= ~(ECHO|CRMOD);       /* no echo for now... */
X        stty(0, &nstate);                       /* set mode */
X        ioctl(0, TIOCGETC, &otchars);           /* Save old characters */
X        ioctl(0, TIOCSETC, &ntchars);           /* Place new character into K */
Xtt_status=tt_open;
X#if     BSD
X        /* provide a smaller terminal output buffer so that
X           the type ahead detection works better (more often) */
X        setbuffer(stdout, &tobuf[0], TBUFSIZ);
X/*---        signal(SIGTSTP,SIG_DFL);         set signals so that we can
X        signal(SIGCONT,rtfrmshell);      suspend & restart emacs */
X#endif
X#endif
X        /* on all screens we are not sure of the initial position
X           of the cursor                                        */
X/*---   ttrow = 999;
X        ttcol = 999; */
X
X}
X
X/*
X * This function gets called just before we go back home to the command
X * interpreter. 
X * Another no-operation on CPM.
X */
Xttclose()
X{
X
X#if     AMIGA
X#if     LATTICE
X        amg_flush();
X        Close(terminal);
X#endif
X#if     AZTEC
X        amg_flush();
X        Enable_Abort = 1;       /* Fix for Manx */
X        Close(terminal);
X#endif
X#endif
X#if     CPM
X#endif
X#if     MSDOS & (HP150 == 0) & LATTICE
X        /* restore the ctrl-break interupt */
X        rg.h.ah = 0x33;                 /* control-break check dos call */
X        rg.h.al = 1;            /* set the current state */
X        rg.h.dl = 1;            /* set it ON */
X        intdos(&rg, &rg);       /* go for it! */
X#endif
X
X#if     USG
X        ioctl(0, TCSETA, &otermio);     /* restore terminal settings */
X        fcntl(0, F_SETFL, kbdflgs);
X#endif
X
X#if     V7 | BSD
Xif (tt_status==tt_close) return;
X        stty(0, &ostate);
X        ioctl(0, TIOCSETC, &otchars);   /* Place old character into K */
Xtt_status=tt_close;
X#endif
X
X
X}
X
X#if     AMIGA
Xamg_flush()
X{
X        if(scrn_tmp_p)
X                Write(terminal,scrn_tmp,scrn_tmp_p);
X        scrn_tmp_p = 0;
X}
X#endif
X
X/*
X * Flush terminal buffer. Does real work where the terminal output is buffered
X * up. A no-operation on systems where byte at a time terminal I/O is done.
X */
Xttflush()
X{
X#if     AMIGA
X        amg_flush();
X#endif
X
X#if     CPM
X#endif
X
X#if     MSDOS
X#endif
X
X#if     V7 | USG | BSD
X        fflush(stdout);
X#endif
X}
X
X/*
X * Read a character from the terminal, performing no editing and doing no echo
X * at all.
X */
Xttgetc()
X{
X#if     AMIGA
X        char ch;
X        amg_flush();
X        Read(terminal, &ch, 1L);
X        return(255 & (int)ch);
X#endif
X#if     CPM
X        return (biosb(BCONIN, 0, 0));
X#endif
X
X#if RAINBOW
X        int Ch;
X
X        while ((Ch = Read_Keyboard()) < 0);
X
X        if ((Ch & Function_Key) == 0)
X                if (!((Ch & 0xFF) == 015 || (Ch & 0xFF) == 0177))
X                        Ch &= 0xFF;
X
X        return Ch;
X#endif
X
X#if     MSDOS & MWC86
X        return (getcnb());
X#endif
X
X#if     MSDOS & (LATTICE | MSC | TURBO | AZTEC)
X        int c;          /* character read */
X
X        /* if a char already is ready, return it */
X        if (nxtchar >= 0) {
X                c = nxtchar;
X                nxtchar = -1;
X                return(c);
X        }
X
X        /* call the dos to get a char */
X        rg.h.ah = 7;            /* dos Direct Console Input call */
X        intdos(&rg, &rg);
X        c = rg.h.al;            /* grab the char */
X        return(c & 255);
X#endif
X
X#if     V7 | BSD
X        return(127 & fgetc(stdin));
X#endif
X
X#if     USG
X        if( kbdqp )
X                kbdqp = FALSE;
X        else
X        {
X                if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 )
X                        return FALSE;
X                kbdpoll = FALSE;
X                while (read(0, &kbdq, 1) != 1)
X                        ;
X        }
X        return ( kbdq & 127 );
X#endif
X}
EOF
chars=`wc -c < 'indexor.c-2'`
if test $chars !=    30576; then echo 'indexor.c-2' is $chars characters, should be    30576 characters!; fi
fi
exit 0