v07i101: Index insertor for Scribe, TeX/LaTeX, *roff, etc. part 02/02
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Mon Jul 24 06:16:26 AEST 1989
Posting-number: Volume 7, Issue 101
Submitted-by: jbw at 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
More information about the Comp.sources.misc
mailing list