Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!tut.cis.ohio-state.edu!pt.cs.cmu.edu!cadre!pitt!unix.cis.pittsburgh.edu!jbw From: jbw@unix.cis.pittsburgh.edu (Jingbai Wang) Newsgroups: comp.text Subject: index insertor for Scribe, TeX/LaTeX, *roff , etc Message-ID: <18715@unix.cis.pittsburgh.edu> Date: 13 Jul 89 20:35:00 GMT Reply-To: jbw@unix.cis.pittsburgh.edu (Jingbai Wang) Distribution: na Organization: Univ. of Pittsburgh, Comp & Info Sys Lines: 3406 If you are a technical writer or book writer, you would have found that the most tedious job is to add an index to a book you have written. I am a heavy writer, and I use Scribe (with my own TEC.mak data base) and TeX/LaTeX to format books. To overcome the tediousness and boresomeness of index making, I developed a program in C named 'indexor' that I revealed in a previous message in comp.text. Here I am introducing the source code into comp.text and comp.source.unix. This program named `indexor.c' can be compiled on VMS, UNIX or DOS, and have helped me with two lengthy books already. You can called it a semi-automatic index insertor. You need an ANSI terminal (like vt100, vt102) to make it work properly. Cut here _________________________________________________________________ /* Copyright (C) 1988 by Jingbai Wang */ /* ********************************************************************** * This program is an auxiliary program for Scribe and TeX * * It inserts index and glossary into Scribe/LaTeX file * * It is an important program for book editing * * The user can set up the programs for other formattors like troff * * * * Copyright by Jingbai Wang August 1988 * * * * jbw@pittvms.bitnet * * jbw@cisunx.UUCP * ************************************************************************/ /* This program was created in 1988 by myself in order to include an index in the Scribe and TeX/LaTeX manuals I was writing. It is part of the Scribe TEC.mak package I developed, and can be re-distributed freely for non-profit purposes. It is like a special editor to introduce index entries into a Scribe, LaTeX, TeX or *troff file. It indeed makes a tedious and boresome job enjoyable. The primary attempt is to make this program portable among VAX/VMS, UNIX (BSD and Ultrix), and DOS (MSC and MS Quick C). To compile on our VMS, $ex indexor and on UNIX, %cc -o indexor indexor.c It takes two on-line arguments, i.e., the input and output file names, but you can also provide these piece of information when running it. The program is self-instructive, no documentation is necessary. */ #include #include #define CLS printf("\033[2J") #define GOTOXY(x,y) printf("\033[%d;%df",x,y) #define REVERSE printf("\033[7m") #define NORMAL printf("\033[0m") #define SAVE_CURSOR printf("\033[s") #define BLINK printf("\033[5m") #define BOLD printf("\033[1m") #define UNDER printf("\033[4m") #define ERASE printf("\033[K") #define CURSOR_REPORT(x, y) scanf("\033[%d;%dR",x,y) #define BELL printf("%c", 7) #define CURSOR_RIGHT printf("\033[1C") #define CURSOR_LEFT printf("\033[1D") #define tt_open 1 #define tt_close 0 int tt_status=0; #if VMS|unix #define RESTORE_CURSOR cursor_position() #else #define RESTORE_CURSOR printf("\033[u") #endif #if ultrix #define V7 1 #endif #if unix|VMS /* ANSI escape, good for mainframe systems vt100 terminals, e.g., VAX*/ #define DEL 127 #define EXT 27 #define EXT1 '[' #define R_ARROW 'C' #define L_ARROW 'D' #define D_ARROW 'B' #define U_ARROW 'A' #if VMS #include #include #include short iochan; /* TTY I/O channel */ #endif #else /* MSDOS extended code escape */ #define DEL 8 #define EXT 0 #define R_ARROW 77 #define L_ARROW 75 #define D_ARROW 80 #define U_ARROW 72 #endif FILE *infile; FILE *outfile; char buffer[720]; int buffer_length; int buffer_line[11]; int lines=1; int cursor_mark=0; int cursor_last=0; char marker=0; char phrase_str[512]=""; char the_phrase[512]; char save_str[128]=""; char out_str[512]=""; int phrase_on, phrase_off, phrase_len; char end_infile=0; char end_outfile=0; char exit_flag=0; char word_mark=0; char the_index[20]="@Index"; char the_delimiter1[3]="{"; char the_delimiter2[3]="}"; char the2_delimiter1[3]="<"; char the2_delimiter2[3]=">"; char the_primary[20]="Primary="; char the_second[20]="Secondary="; char the_gloss[20]="@glossary"; char g_primary[20]="symbol="; char g_second[20]="expln="; char the_indexsecond[20]="@IndexSecondary"; char the_seealso[20]="@SeeAlso"; char the_indexentry[20]="@IndexEntry"; char the_entry[20]="Entry="; char the_key[20]="Key="; char the_number[20]="Number="; struct CUR { short int x; short int y; } chr[720]; char next_str[512]; char next_flag=0; char command_line[160]; /* The getch() and getche() */ #if VMS char getch() { int ibuf,status; int iosb[2]; status = SYS$QIOW(0, iochan, IO$_READLBLK|IO$M_NOECHO, iosb, 0, 0, &ibuf, 1, 0, 0, 0, 0); return (ibuf & 0xFF); /* Allow multinational */ } #endif #if unix | ultrix | BSD char getch() { int tmpch; ttopen(); tmpch=ttgetc(); ttclose(); return(tmpch); } #endif #if unix | VMS char getche() { char inchar; fputc(getch(), stdout); return((int)inchar); } #endif read_in() { int i, quit_s; char string[81],quit; GOTOXY(3,1); buffer_length=0; buffer[0]=0; string[0]=0; quit_s=0; for (i=1;i<=8;i++) { if( fgets(string,80,infile)==NULL) { end_infile=1; quit_s=1; goto quit;} else { printf("%s",string); strcat(buffer,string); } } quit: buffer_length=strlen(buffer); position(); GOTOXY(3,1); return(quit_s); } position() { int i,j; int row,col; char ch; row=3; col=1; buffer_line[1]=0; lines=1; for(i=0;i=buffer_length-1) {next_page(); return;} ++cursor_mark; cursor_position(); if (marker==1) printf("%c",buffer[cursor_mark]); GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } cursor_left() { if (cursor_mark<=cursor_last) {cursor_mark=cursor_last; cursor_position();BELL; return;} NORMAL; cursor_position();printf("%c",buffer[cursor_mark]); --cursor_mark; if (marker==1) REVERSE; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } cursor_down() { int i,the_stop; char check; the_stop=cursor_mark; cursor_position(); for (i=cursor_mark;i=buffer_length-2) {next_page();return;} if (buffer[i]==10) {cursor_mark=i+1; cursor_position();goto check;} } check: if (marker) { GOTOXY(chr[the_stop].x,chr[the_stop].y); for (i=the_stop;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_position(); } } cursor_up() { char check; int i,the_stop; if (cursor_mark<=cursor_last) {cursor_mark=cursor_last;cursor_position(); BELL; return;} cursor_position();the_stop=cursor_mark; for (i=cursor_mark;i>=cursor_last;i--) { if (buffer[i]==10) {cursor_mark=i-1; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); goto check;} } cursor_mark=cursor_last; cursor_position(); BELL; check: if (marker) { NORMAL; GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y); for (i=cursor_mark+1;i<=the_stop;i++) printf("%c",buffer[i]); REVERSE; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } } mark_word() { if (marker==0) mark_begin(); word_skip();return; } pass_marked() { int i; if (marker==0) { word_skip();return;} GOTOXY(chr[cursor_last].x,chr[cursor_last].y); marker=0; NORMAL; phrase_str[0]= 0; for (i=cursor_last;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_mark=cursor_last; cursor_position(); } word_skip() { int i, the_stop; char check; the_stop=cursor_mark; if (cursor_mark>=buffer_length-1) {next_page(); return;} cursor_right(); for (i=cursor_mark; i': case '{': case '}': case '*': case '^': case '&': case '#': case ':': case ';': case '|': case 9: case 10: case 13: case '~': case '@': case '\\': case 32: case '.': if (word_mark) {word_mark=0;cursor_mark=i-1; cursor_position(); goto check;} else break; default: word_mark=1; } } check: if(marker) { GOTOXY(chr[the_stop].x,chr[the_stop].y); for (i=the_stop;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_position(); } } word_back() { int i, the_stop; char check; the_stop=cursor_mark; cursor_left(); for (i=cursor_mark; i>=0;i--) { if (i<=cursor_last) {cursor_mark=cursor_last; cursor_position();BELL;goto check;} switch(buffer[i]) {case '!': case ',': case '"': case '\'': case '`': case '(': case ')': case '[': case ']': case '/': case '+': case '=': case '?': case '<': case '>': case '{': case '}': case '*': case '^': case '&': case '#': case ':': case ';': case '|': case 9: case 10: case 13: case '~': case '@': case '\\': case 32: case '.': if (word_mark) {word_mark=0; cursor_mark=i; cursor_position(); goto check; } else break; default: word_mark=1; } } check: if (marker) {GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y); NORMAL; for (i=cursor_mark+1;i<=the_stop;i++) printf("%c",buffer[i]); REVERSE; cursor_position(); } } next_page() { int i, length, pre_row, ch_count; NORMAL; CLS_UP(); GOTOXY(1,1); pre_row=0; ch_count=0; if (end_outfile) {BELL; return;} if (marker){ if ((strlen(phrase_str)+strlen(&buffer[phrase_on]))<510) strcat(phrase_str, &buffer[phrase_on]); else marker=0; } for (i=buffer_line[lines-2];i=phrase_on)) {REVERSE;} printf("%c", buffer[i]); } for (i=cursor_last;i"); scanf("%s",infile_name); fflush(stdin); } if ((infile=fopen(infile_name,"r"))==NULL) {GOTOXY(20,20); BLINK; printf("Can't find the input file"); NORMAL; goto quit; } while (out_ok) { if (out_file) {GOTOXY(6,15); ERASE; printf(" Output file (indexed file) >"); fscanf(stdin, "%s",outfile_name); fflush(stdin); } out_ok=0; if ((outfile=fopen(outfile_name,"r"))!=NULL) { out_ok=1; GOTOXY(7,16); ERASE; out_file=1; fflush(stdin); printf("File %s already exits, overwrite ? [N]", outfile_name); ch=getch(); ch=getch(); if ((ch=='y')||(ch=='Y')) out_ok=0; fclose(outfile); } if (out_ok==0) { outfile=fopen(outfile_name,"w"); } } NORMAL; CLS; help_menu(); end_infile=read_in(); while (1) { control(getch()); if (exit_flag) goto quit; } quit: GOTOXY(25, 1); printf("\n\t>>> Thank you for using INDEX MAKER >>>\n"); printf("\t>>> by Jingbai Wang, August 1988 >>>\n"); } warning(warn_str) char *warn_str; { char i; SAVE_CURSOR; GOTOXY(24,5); REVERSE; BLINK; printf("%s", warn_str); BELL; BELL; for (i=1;i<10000;i++) ; GOTOXY(24,1); RESTORE_CURSOR; NORMAL; } void clr_show() { int i; for (i=13;i<17;i++) {NORMAL; GOTOXY(i,1);ERASE;} } index_now() { int i; fprintf(outfile, "%s%s%s%s",the_index,the_delimiter1,phrase_str,the_delimiter2); SAVE_CURSOR; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s",the_index,the_delimiter1,out_str,the_delimiter2); NORMAL; RESTORE_CURSOR; } index_next_line() { int i; next_flag=1; strcat(next_str, the_index); strcat(next_str, the_delimiter1); if ((strlen(next_str)+strlen(phrase_str))<510) strcat(next_str, phrase_str); strcat(next_str, the_delimiter2); SAVE_CURSOR; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s}", the_index,the_delimiter1,out_str,the_delimiter2); NORMAL; RESTORE_CURSOR; } see_also() { SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Primary="); NORMAL;printf("[%s]",save_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(command_line, save_str); else strcpy(save_str, command_line); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } index_entry() { char entry[20], number[30]; strcpy(save_str, phrase_str); strcpy(number, ",\nNumber=<"); SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Entry="); NORMAL;printf("[%s]",phrase_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(entry, phrase_str); else strcpy(entry, command_line); GOTOXY(24,1);ERASE; GOTOXY(24,2); BLINK; REVERSE; printf(" Number="); NORMAL; get_line(); if (memcmp(command_line,"",1)==0) number[0]=0; else {strcat(number, command_line); strcat(number, ">");} fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1, the_key,the2_delimiter1,phrase_str, the2_delimiter2,the_entry, the2_delimiter1,entry,the2_delimiter2, number, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1, the_key,the2_delimiter1,out_str, the2_delimiter2,the_entry, the2_delimiter1,entry,the2_delimiter2, number, the_delimiter2); NORMAL; RESTORE_CURSOR; } index_secondary() { SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Primary="); NORMAL;printf("[%s]",save_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(command_line, save_str); else strcpy(save_str, command_line); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } glossary() { SAVE_CURSOR; GOTOXY(24,2); BLINK; REVERSE; printf(" Description:"); NORMAL; get_line(); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1, g_primary,the2_delimiter1,phrase_str, the2_delimiter2,g_second, the2_delimiter1,command_line,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1, g_primary,the2_delimiter1,command_line, the2_delimiter2,g_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } finish_up() { char ch; int i; if(end_infile && end_outfile) {all_done(); exit();} if (marker) {mark_end(); index_now(); } for (i=cursor_last;i 1"); NORMAL; printf(" -- set mark"); GOTOXY(20,3); BOLD; printf(" 2"); NORMAL; printf(" -- end mark & index"); GOTOXY(21,3); BOLD; printf(""); NORMAL; printf(" -- forward a word"); GOTOXY(22,40); BOLD; printf("G"); NORMAL; printf(" -- end mark & glossary"); GOTOXY(22,3); BOLD; printf("W"); NORMAL; printf(" -- mark word"); GOTOXY(21,40); BOLD; printf("B"); NORMAL; printf(" -- backward a word"); GOTOXY(20,40); BOLD; printf("N"); NORMAL; printf(" -- end mark & index in next line"); GOTOXY(19,40); BOLD; printf("P"); NORMAL; printf(" -- abandon the marked/skip a word "); GOTOXY(18,40); BOLD; printf("F"); NORMAL; printf(" -- finish \ ^F--string search"); GOTOXY(23,40); BOLD; printf("S"); NORMAL; printf(" -- IndexSecondary"); GOTOXY(23,17); BOLD; printf("I"); NORMAL; printf(" -- IndexEntry"); GOTOXY(23,3); BOLD; printf("A"); NORMAL; printf(" -- SeeAlso"); GOTOXY(23,65); BOLD; printf("@"); NORMAL; printf(" -- set up"); } set_up() { int the_row, i; int ch_count; char ch, string[81]; ch_count=0; SAVE_CURSOR; NORMAL; REVERSE; GOTOXY(12,1); printf(" Set-up Menu to quit "); NORMAL; for (i=13;i<24;i++) {GOTOXY(i,1);ERASE;} GOTOXY(13,3);printf("[%s]:",the_index); GOTOXY(14,3);printf("[%s]:",the_indexentry); GOTOXY(15,3);printf("[%s]:",the_indexsecond); GOTOXY(16,3);printf("[%s]:",the_seealso); GOTOXY(17,3);printf("[%s]:",the_primary); GOTOXY(18,3);printf("[%s]:",the_second); GOTOXY(19,3);printf("[%s]:",the_gloss); GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary); GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1); GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2); GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2); the_row=13; set_up_in(the_row); while(1) { ch=getch(); switch(ch) { case EXT: #if unix | VMS /* VAX */ ch=getch(); if (ch!=EXT1) {BELL;break;} ch=getch(); #else /* DOS */ ch=getch(); #endif switch(ch) { case L_ARROW: case U_ARROW: set_up_out(the_row); ch_count=0;string[0]=0; --the_row; if (the_row<13) the_row=25; set_up_in(the_row); break; case R_ARROW: case D_ARROW: down: set_up_out(the_row);ch_count=0;string[0]=0; ++the_row; if (the_row>25) the_row=13; set_up_in(the_row); break; default: BELL; } break; case 3 : all_done(); break; #if unix case 4 : all_done(); break; #endif case 1: case 2: case 5: case 6: case 7: case 10: case 11: case 12: case 14: case 15: case 16: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:BELL;break; case 8: case 127: if (ch_count>0){ CURSOR_LEFT; ERASE; string[--ch_count]=0; } break; case 13: if (ch_count>0) { string[ch_count]=0; set_up_save(the_row, string); } goto down;break; case 9: NORMAL;for (i=12;i<24;i++) {GOTOXY(i,1);ERASE;} help_menu();RESTORE_CURSOR; return; default: printf("%c",ch);string[ch_count++]=ch; } } } set_up_in( the_row) int the_row; { REVERSE; switch(the_row) { case 13: GOTOXY(13,3);printf("[%s]:",the_index);break; case 14: GOTOXY(14,3);printf("[%s]:",the_indexentry);break; case 15: GOTOXY(15,3);printf("[%s]:",the_indexsecond);break; case 16: GOTOXY(16,3);printf("[%s]:",the_seealso);break; case 17: GOTOXY(17,3);printf("[%s]:",the_primary); break; case 18: GOTOXY(18,3);printf("[%s]:",the_second); break; case 19: GOTOXY(19,3);printf("[%s]:",the_gloss); break; case 20: GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break; case 21: GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break; case 22: GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break; case 23: GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break; case 24: GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break; case 25: GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break; } } set_up_save(the_row, string) int the_row; char *string; { switch(the_row) { case 13:strcpy(the_index,string);break; case 14:strcpy(the_indexentry,string);break; case 15:strcpy(the_indexsecond,string);break; case 16:strcpy(the_seealso,string);break; case 17:strcpy(the_primary,string);break; case 18:strcpy(the_second,string);break; case 19:strcpy(the_gloss,string);break; case 20:strcpy(g_primary,string);break; case 21:strcpy(g_second,string);break; case 22:strcpy(the_delimiter1,string);break; case 23:strcpy(the_delimiter2,string);break; case 24:strcpy(the2_delimiter1,string);break; case 25:strcpy(the2_delimiter2,string);break; } } set_up_out(the_row) int the_row; { NORMAL; switch(the_row) { case 13:GOTOXY(13,1);ERASE; GOTOXY(13,3); printf("[%s]:",the_index);break; case 14:GOTOXY(14,1);ERASE; GOTOXY(14,3);printf("[%s]:",the_indexentry);break; case 15:GOTOXY(15,1);ERASE; GOTOXY(15,3);printf("[%s]:",the_indexsecond);break; case 16:GOTOXY(16,1);ERASE; GOTOXY(16,3);printf("[%s]:",the_seealso);break; case 17:GOTOXY(17,1);ERASE; GOTOXY(17,3);printf("[%s]:",the_primary); break; case 18:GOTOXY(18,1);ERASE; GOTOXY(18,3);printf("[%s]:",the_second); break; case 19:GOTOXY(19,1);ERASE; GOTOXY(19,3);printf("[%s]:",the_gloss); break; case 20:GOTOXY(20,1);ERASE; GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break; case 21:GOTOXY(21,1);ERASE; GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break; case 22:GOTOXY(22,3);printf(" "); GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break; case 23:GOTOXY(22,40);ERASE; GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break; case 24:GOTOXY(23,3);printf(" "); GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break; case 25:GOTOXY(23,40);ERASE; GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break; } } out_check() {int i, rows, length, trunc; rows=1; trunc=256; strcpy(out_str,phrase_str); length=strlen(out_str); for (i=0;itrunc) {out_str[trunc]='.';out_str[trunc+1]='.';out_str[trunc+2]='.'; out_str[trunc+3]=0;} } get_line() { char ch; int ch_count; ch_count=0; command_line[0]=0; while(1) { ch=getch(); switch(ch) { case 3: all_done(); break; #if unix case 4: all_done(); break; #endif case 0: case 1: case 2: case 5: case 6: case 7: case 10: case 11: case 12: case 14: case 15: case 16: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: BELL;break; case 8: case 127: if (ch_count>0){ CURSOR_LEFT; ERASE; command_line[--ch_count]=0; } break; case 13: if (ch_count>0) command_line[ch_count]=0; return; default: printf("%c",ch);command_line[ch_count++]=ch; } } } str_search() { char *ptr; #if unix char *memchr(); #endif int same_page= -1; void this_page(); int cursor_here=0,i; command_line[0]=0; SAVE_CURSOR; GOTOXY(24,2); REVERSE; printf("String:"); NORMAL; printf(" "); if (the_phrase[0]>0) printf("[%s]", the_phrase); get_line(); if (command_line[0]>0) strcpy(the_phrase, command_line); else if (the_phrase[0]==0) {GOTOXY(24,2); ERASE; RESTORE_CURSOR; return;} ptr=buffer; if (same_page<0) while ( cursor_here #endif #if AMIGA #define NEW 1006L #define AMG_MAXBUF 1024L static long terminal; static char scrn_tmp[AMG_MAXBUF+1]; static long scrn_tmp_p = 0; #endif #if CPM #include #endif #if MSDOS & (LATTICE | MSC | TURBO | AZTEC | MWC86) union REGS rg; /* cpu register for use of DOS calls */ int nxtchar = -1; /* character held from type ahead */ #endif #if RAINBOW #include "rainbow.h" #endif #if USG /* System V */ #include #include #include int kbdflgs; /* saved keyboard fd flags */ int kbdpoll; /* in O_NDELAY mode */ int kbdqp; /* there is a char in kbdq */ char kbdq; /* char we've already read */ struct termio otermio; /* original terminal characteristics */ struct termio ntermio; /* charactoristics to use inside */ #endif #if V7 | BSD /* #undef CTRL */ #include /* for stty/gtty functions */ #include struct sgttyb ostate; /* saved tty state */ struct sgttyb nstate; /* values for editor mode */ struct tchars otchars; /* Saved terminal special character set */ struct tchars ntchars = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* A lot of nothing */ #if BSD #include /* to get at the typeahead */ extern int rtfrmshell(); /* return from suspended shell */ #define TBUFSIZ 128 char tobuf[TBUFSIZ]; /* terminal output buffer */ #endif #endif /* * This function is called once to set up the terminal device streams. */ ttopen() { #if AMIGA char oline[NSTRING]; #if AZTEC extern Enable_Abort; /* Turn off ctrl-C interrupt */ Enable_Abort = 0; /* for the Manx compiler */ #endif strcpy(oline, "RAW:0/0/640/200/"); strcat(oline, PROGNAME); strcat(oline, " "); strcat(oline, VERSION); strcat(oline, "/Amiga"); terminal = Open(oline, NEW); #endif #if CPM #endif #if MSDOS & (HP150 == 0) & LATTICE /* kill the ctrl-break interupt */ rg.h.ah = 0x33; /* control-break check dos call */ rg.h.al = 1; /* set the current state */ rg.h.dl = 0; /* set it OFF */ intdos(&rg, &rg); /* go for it! */ #endif #if USG ioctl(0, TCGETA, &otermio); /* save old settings */ ntermio.c_iflag = 0; /* setup new settings */ ntermio.c_oflag = 0; ntermio.c_cflag = otermio.c_cflag; ntermio.c_lflag = 0; ntermio.c_line = otermio.c_line; ntermio.c_cc[VMIN] = 1; ntermio.c_cc[VTIME] = 0; ioctl(0, TCSETA, &ntermio); /* and activate them */ kbdflgs = fcntl( 0, F_GETFL, 0 ); kbdpoll = FALSE; #endif #if V7 | BSD if (tt_status==tt_open) return; gtty(0, &ostate); /* save old state */ gtty(0, &nstate); /* get base of new state */ nstate.sg_flags |= RAW; nstate.sg_flags &= ~(ECHO|CRMOD); /* no echo for now... */ stty(0, &nstate); /* set mode */ ioctl(0, TIOCGETC, &otchars); /* Save old characters */ ioctl(0, TIOCSETC, &ntchars); /* Place new character into K */ tt_status=tt_open; #if BSD /* provide a smaller terminal output buffer so that the type ahead detection works better (more often) */ setbuffer(stdout, &tobuf[0], TBUFSIZ); /*--- signal(SIGTSTP,SIG_DFL); set signals so that we can signal(SIGCONT,rtfrmshell); suspend & restart emacs */ #endif #endif /* on all screens we are not sure of the initial position of the cursor */ /*--- ttrow = 999; ttcol = 999; */ } /* * This function gets called just before we go back home to the command * interpreter. * Another no-operation on CPM. */ ttclose() { #if AMIGA #if LATTICE amg_flush(); Close(terminal); #endif #if AZTEC amg_flush(); Enable_Abort = 1; /* Fix for Manx */ Close(terminal); #endif #endif #if CPM #endif #if MSDOS & (HP150 == 0) & LATTICE /* restore the ctrl-break interupt */ rg.h.ah = 0x33; /* control-break check dos call */ rg.h.al = 1; /* set the current state */ rg.h.dl = 1; /* set it ON */ intdos(&rg, &rg); /* go for it! */ #endif #if USG ioctl(0, TCSETA, &otermio); /* restore terminal settings */ fcntl(0, F_SETFL, kbdflgs); #endif #if V7 | BSD if (tt_status==tt_close) return; stty(0, &ostate); ioctl(0, TIOCSETC, &otchars); /* Place old character into K */ tt_status=tt_close; #endif } #if AMIGA amg_flush() { if(scrn_tmp_p) Write(terminal,scrn_tmp,scrn_tmp_p); scrn_tmp_p = 0; } #endif /* * Flush terminal buffer. Does real work where the terminal output is buffered * up. A no-operation on systems where byte at a time terminal I/O is done. */ ttflush() { #if AMIGA amg_flush(); #endif #if CPM #endif #if MSDOS #endif #if V7 | USG | BSD fflush(stdout); #endif } /* * Read a character from the terminal, performing no editing and doing no echo * at all. */ ttgetc() { #if AMIGA char ch; amg_flush(); Read(terminal, &ch, 1L); return(255 & (int)ch); #endif #if CPM return (biosb(BCONIN, 0, 0)); #endif #if RAINBOW int Ch; while ((Ch = Read_Keyboard()) < 0); if ((Ch & Function_Key) == 0) if (!((Ch & 0xFF) == 015 || (Ch & 0xFF) == 0177)) Ch &= 0xFF; return Ch; #endif #if MSDOS & MWC86 return (getcnb()); #endif #if MSDOS & (LATTICE | MSC | TURBO | AZTEC) int c; /* character read */ /* if a char already is ready, return it */ if (nxtchar >= 0) { c = nxtchar; nxtchar = -1; return(c); } /* call the dos to get a char */ rg.h.ah = 7; /* dos Direct Console Input call */ intdos(&rg, &rg); c = rg.h.al; /* grab the char */ return(c & 255); #endif #if V7 | BSD return(127 & fgetc(stdin)); #endif #if USG if( kbdqp ) kbdqp = FALSE; else { if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 ) return FALSE; kbdpoll = FALSE; while (read(0, &kbdq, 1) != 1) ; } return ( kbdq & 127 ); #endif } Newsgroups: comp.text,comp.source.unix Subject: Indexor for Scribe, LaTeX/TeX, *roff and etc Expires: References: Sender: Reply-To: jbw@unix.cis.pittsburgh.edu (Jingbai Wang) Followup-To: Distribution: na Organization: Univ. of Pittsburgh, Comp & Info Sys Keywords: If you are a technical writer or book writer, you would have found that the most tedious job is to add an index to a book you have written. I am a heavy writer, and I use Scribe (with my own TEC.mak data base) and TeX/LaTeX to format books. To overcome the tediousness and boresomeness of index making, I developed a program in C named 'indexor' that I revealed in a previous message in comp.text. Here I am introducing the source code into comp.text and comp.source.unix. This program named `indexor.c' can be compiled on VMS, UNIX or DOS, and have helped me with two lengthy books already. You can called it a semi-automatic index insertor. You need an ANSI terminal (like vt100, vt102) to make it work properly. Cut here _________________________________________________________________ /* Copyright (C) 1988 by Jingbai Wang */ /* ********************************************************************** * This program is an auxiliary program for Scribe and TeX * * It inserts index and glossary into Scribe/LaTeX file * * It is an important program for book editing * * The user can set up the programs for other formattors like troff * * * * Copyright by Jingbai Wang August 1988 * * * * jbw@pittvms.bitnet * * jbw@cisunx.UUCP * ************************************************************************/ /* This program was created in 1988 by myself in order to include an index in the Scribe and TeX/LaTeX manuals I was writing. It is part of the Scribe TEC.mak package I developed, and can be re-distributed freely for non-profit purposes. It is like a special editor to introduce index entries into a Scribe, LaTeX, TeX or *troff file. It indeed makes a tedious and boresome job enjoyable. The primary attempt is to make this program portable among VAX/VMS, UNIX (BSD and Ultrix), and DOS (MSC and MS Quick C). To compile on our VMS, $ex indexor and on UNIX, %cc -o indexor indexor.c It takes two on-line arguments, i.e., the input and output file names, but you can also provide these piece of information when running it. The program is self-instructive, no documentation is necessary. */ #include #include #define CLS printf("\033[2J") #define GOTOXY(x,y) printf("\033[%d;%df",x,y) #define REVERSE printf("\033[7m") #define NORMAL printf("\033[0m") #define SAVE_CURSOR printf("\033[s") #define BLINK printf("\033[5m") #define BOLD printf("\033[1m") #define UNDER printf("\033[4m") #define ERASE printf("\033[K") #define CURSOR_REPORT(x, y) scanf("\033[%d;%dR",x,y) #define BELL printf("%c", 7) #define CURSOR_RIGHT printf("\033[1C") #define CURSOR_LEFT printf("\033[1D") #define tt_open 1 #define tt_close 0 int tt_status=0; #if VMS|unix #define RESTORE_CURSOR cursor_position() #else #define RESTORE_CURSOR printf("\033[u") #endif #if ultrix #define V7 1 #endif #if unix|VMS /* ANSI escape, good for mainframe systems vt100 terminals, e.g., VAX*/ #define DEL 127 #define EXT 27 #define EXT1 '[' #define R_ARROW 'C' #define L_ARROW 'D' #define D_ARROW 'B' #define U_ARROW 'A' #if VMS #include #include #include short iochan; /* TTY I/O channel */ #endif #else /* MSDOS extended code escape */ #define DEL 8 #define EXT 0 #define R_ARROW 77 #define L_ARROW 75 #define D_ARROW 80 #define U_ARROW 72 #endif FILE *infile; FILE *outfile; char buffer[720]; int buffer_length; int buffer_line[11]; int lines=1; int cursor_mark=0; int cursor_last=0; char marker=0; char phrase_str[512]=""; char the_phrase[512]; char save_str[128]=""; char out_str[512]=""; int phrase_on, phrase_off, phrase_len; char end_infile=0; char end_outfile=0; char exit_flag=0; char word_mark=0; char the_index[20]="@Index"; char the_delimiter1[3]="{"; char the_delimiter2[3]="}"; char the2_delimiter1[3]="<"; char the2_delimiter2[3]=">"; char the_primary[20]="Primary="; char the_second[20]="Secondary="; char the_gloss[20]="@glossary"; char g_primary[20]="symbol="; char g_second[20]="expln="; char the_indexsecond[20]="@IndexSecondary"; char the_seealso[20]="@SeeAlso"; char the_indexentry[20]="@IndexEntry"; char the_entry[20]="Entry="; char the_key[20]="Key="; char the_number[20]="Number="; struct CUR { short int x; short int y; } chr[720]; char next_str[512]; char next_flag=0; char command_line[160]; /* The getch() and getche() */ #if VMS char getch() { int ibuf,status; int iosb[2]; status = SYS$QIOW(0, iochan, IO$_READLBLK|IO$M_NOECHO, iosb, 0, 0, &ibuf, 1, 0, 0, 0, 0); return (ibuf & 0xFF); /* Allow multinational */ } #endif #if unix | ultrix | BSD char getch() { int tmpch; ttopen(); tmpch=ttgetc(); ttclose(); return(tmpch); } #endif #if unix | VMS char getche() { char inchar; fputc(getch(), stdout); return((int)inchar); } #endif read_in() { int i, quit_s; char string[81],quit; GOTOXY(3,1); buffer_length=0; buffer[0]=0; string[0]=0; quit_s=0; for (i=1;i<=8;i++) { if( fgets(string,80,infile)==NULL) { end_infile=1; quit_s=1; goto quit;} else { printf("%s",string); strcat(buffer,string); } } quit: buffer_length=strlen(buffer); position(); GOTOXY(3,1); return(quit_s); } position() { int i,j; int row,col; char ch; row=3; col=1; buffer_line[1]=0; lines=1; for(i=0;i=buffer_length-1) {next_page(); return;} ++cursor_mark; cursor_position(); if (marker==1) printf("%c",buffer[cursor_mark]); GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } cursor_left() { if (cursor_mark<=cursor_last) {cursor_mark=cursor_last; cursor_position();BELL; return;} NORMAL; cursor_position();printf("%c",buffer[cursor_mark]); --cursor_mark; if (marker==1) REVERSE; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } cursor_down() { int i,the_stop; char check; the_stop=cursor_mark; cursor_position(); for (i=cursor_mark;i=buffer_length-2) {next_page();return;} if (buffer[i]==10) {cursor_mark=i+1; cursor_position();goto check;} } check: if (marker) { GOTOXY(chr[the_stop].x,chr[the_stop].y); for (i=the_stop;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_position(); } } cursor_up() { char check; int i,the_stop; if (cursor_mark<=cursor_last) {cursor_mark=cursor_last;cursor_position(); BELL; return;} cursor_position();the_stop=cursor_mark; for (i=cursor_mark;i>=cursor_last;i--) { if (buffer[i]==10) {cursor_mark=i-1; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); goto check;} } cursor_mark=cursor_last; cursor_position(); BELL; check: if (marker) { NORMAL; GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y); for (i=cursor_mark+1;i<=the_stop;i++) printf("%c",buffer[i]); REVERSE; GOTOXY(chr[cursor_mark].x,chr[cursor_mark].y); } } mark_word() { if (marker==0) mark_begin(); word_skip();return; } pass_marked() { int i; if (marker==0) { word_skip();return;} GOTOXY(chr[cursor_last].x,chr[cursor_last].y); marker=0; NORMAL; phrase_str[0]= 0; for (i=cursor_last;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_mark=cursor_last; cursor_position(); } word_skip() { int i, the_stop; char check; the_stop=cursor_mark; if (cursor_mark>=buffer_length-1) {next_page(); return;} cursor_right(); for (i=cursor_mark; i': case '{': case '}': case '*': case '^': case '&': case '#': case ':': case ';': case '|': case 9: case 10: case 13: case '~': case '@': case '\\': case 32: case '.': if (word_mark) {word_mark=0;cursor_mark=i-1; cursor_position(); goto check;} else break; default: word_mark=1; } } check: if(marker) { GOTOXY(chr[the_stop].x,chr[the_stop].y); for (i=the_stop;i<=cursor_mark;i++) printf("%c",buffer[i]); cursor_position(); } } word_back() { int i, the_stop; char check; the_stop=cursor_mark; cursor_left(); for (i=cursor_mark; i>=0;i--) { if (i<=cursor_last) {cursor_mark=cursor_last; cursor_position();BELL;goto check;} switch(buffer[i]) {case '!': case ',': case '"': case '\'': case '`': case '(': case ')': case '[': case ']': case '/': case '+': case '=': case '?': case '<': case '>': case '{': case '}': case '*': case '^': case '&': case '#': case ':': case ';': case '|': case 9: case 10: case 13: case '~': case '@': case '\\': case 32: case '.': if (word_mark) {word_mark=0; cursor_mark=i; cursor_position(); goto check; } else break; default: word_mark=1; } } check: if (marker) {GOTOXY(chr[cursor_mark+1].x,chr[cursor_mark+1].y); NORMAL; for (i=cursor_mark+1;i<=the_stop;i++) printf("%c",buffer[i]); REVERSE; cursor_position(); } } next_page() { int i, length, pre_row, ch_count; NORMAL; CLS_UP(); GOTOXY(1,1); pre_row=0; ch_count=0; if (end_outfile) {BELL; return;} if (marker){ if ((strlen(phrase_str)+strlen(&buffer[phrase_on]))<510) strcat(phrase_str, &buffer[phrase_on]); else marker=0; } for (i=buffer_line[lines-2];i=phrase_on)) {REVERSE;} printf("%c", buffer[i]); } for (i=cursor_last;i"); scanf("%s",infile_name); fflush(stdin); } if ((infile=fopen(infile_name,"r"))==NULL) {GOTOXY(20,20); BLINK; printf("Can't find the input file"); NORMAL; goto quit; } while (out_ok) { if (out_file) {GOTOXY(6,15); ERASE; printf(" Output file (indexed file) >"); fscanf(stdin, "%s",outfile_name); fflush(stdin); } out_ok=0; if ((outfile=fopen(outfile_name,"r"))!=NULL) { out_ok=1; GOTOXY(7,16); ERASE; out_file=1; fflush(stdin); printf("File %s already exits, overwrite ? [N]", outfile_name); ch=getch(); ch=getch(); if ((ch=='y')||(ch=='Y')) out_ok=0; fclose(outfile); } if (out_ok==0) { outfile=fopen(outfile_name,"w"); } } NORMAL; CLS; help_menu(); end_infile=read_in(); while (1) { control(getch()); if (exit_flag) goto quit; } quit: GOTOXY(25, 1); printf("\n\t>>> Thank you for using INDEX MAKER >>>\n"); printf("\t>>> by Jingbai Wang, August 1988 >>>\n"); } warning(warn_str) char *warn_str; { char i; SAVE_CURSOR; GOTOXY(24,5); REVERSE; BLINK; printf("%s", warn_str); BELL; BELL; for (i=1;i<10000;i++) ; GOTOXY(24,1); RESTORE_CURSOR; NORMAL; } void clr_show() { int i; for (i=13;i<17;i++) {NORMAL; GOTOXY(i,1);ERASE;} } index_now() { int i; fprintf(outfile, "%s%s%s%s",the_index,the_delimiter1,phrase_str,the_delimiter2); SAVE_CURSOR; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s",the_index,the_delimiter1,out_str,the_delimiter2); NORMAL; RESTORE_CURSOR; } index_next_line() { int i; next_flag=1; strcat(next_str, the_index); strcat(next_str, the_delimiter1); if ((strlen(next_str)+strlen(phrase_str))<510) strcat(next_str, phrase_str); strcat(next_str, the_delimiter2); SAVE_CURSOR; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s}", the_index,the_delimiter1,out_str,the_delimiter2); NORMAL; RESTORE_CURSOR; } see_also() { SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Primary="); NORMAL;printf("[%s]",save_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(command_line, save_str); else strcpy(save_str, command_line); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_seealso,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } index_entry() { char entry[20], number[30]; strcpy(save_str, phrase_str); strcpy(number, ",\nNumber=<"); SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Entry="); NORMAL;printf("[%s]",phrase_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(entry, phrase_str); else strcpy(entry, command_line); GOTOXY(24,1);ERASE; GOTOXY(24,2); BLINK; REVERSE; printf(" Number="); NORMAL; get_line(); if (memcmp(command_line,"",1)==0) number[0]=0; else {strcat(number, command_line); strcat(number, ">");} fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1, the_key,the2_delimiter1,phrase_str, the2_delimiter2,the_entry, the2_delimiter1,entry,the2_delimiter2, number, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s%s",the_indexentry,the_delimiter1, the_key,the2_delimiter1,out_str, the2_delimiter2,the_entry, the2_delimiter1,entry,the2_delimiter2, number, the_delimiter2); NORMAL; RESTORE_CURSOR; } index_secondary() { SAVE_CURSOR;BELL; GOTOXY(24,2); BLINK; REVERSE; printf(" Primary="); NORMAL;printf("[%s]",save_str); get_line(); if (memcmp(command_line,"",1)==0) strcpy(command_line, save_str); else strcpy(save_str, command_line); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,phrase_str,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_indexsecond,the_delimiter1, the_primary,the2_delimiter1,command_line, the2_delimiter2,the_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } glossary() { SAVE_CURSOR; GOTOXY(24,2); BLINK; REVERSE; printf(" Description:"); NORMAL; get_line(); fprintf(outfile, "%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1, g_primary,the2_delimiter1,phrase_str, the2_delimiter2,g_second, the2_delimiter1,command_line,the2_delimiter2, the_delimiter2); GOTOXY(24,1);ERASE; clr_show(); out_check(); GOTOXY(13,1); BOLD; printf("%s%s%s%s%s%s,\n %s%s%s%s%s",the_gloss,the_delimiter1, g_primary,the2_delimiter1,command_line, the2_delimiter2,g_second, the2_delimiter1,out_str,the2_delimiter2, the_delimiter2); NORMAL; RESTORE_CURSOR; } finish_up() { char ch; int i; if(end_infile && end_outfile) {all_done(); exit();} if (marker) {mark_end(); index_now(); } for (i=cursor_last;i 1"); NORMAL; printf(" -- set mark"); GOTOXY(20,3); BOLD; printf(" 2"); NORMAL; printf(" -- end mark & index"); GOTOXY(21,3); BOLD; printf(""); NORMAL; printf(" -- forward a word"); GOTOXY(22,40); BOLD; printf("G"); NORMAL; printf(" -- end mark & glossary"); GOTOXY(22,3); BOLD; printf("W"); NORMAL; printf(" -- mark word"); GOTOXY(21,40); BOLD; printf("B"); NORMAL; printf(" -- backward a word"); GOTOXY(20,40); BOLD; printf("N"); NORMAL; printf(" -- end mark & index in next line"); GOTOXY(19,40); BOLD; printf("P"); NORMAL; printf(" -- abandon the marked/skip a word "); GOTOXY(18,40); BOLD; printf("F"); NORMAL; printf(" -- finish \ ^F--string search"); GOTOXY(23,40); BOLD; printf("S"); NORMAL; printf(" -- IndexSecondary"); GOTOXY(23,17); BOLD; printf("I"); NORMAL; printf(" -- IndexEntry"); GOTOXY(23,3); BOLD; printf("A"); NORMAL; printf(" -- SeeAlso"); GOTOXY(23,65); BOLD; printf("@"); NORMAL; printf(" -- set up"); } set_up() { int the_row, i; int ch_count; char ch, string[81]; ch_count=0; SAVE_CURSOR; NORMAL; REVERSE; GOTOXY(12,1); printf(" Set-up Menu to quit "); NORMAL; for (i=13;i<24;i++) {GOTOXY(i,1);ERASE;} GOTOXY(13,3);printf("[%s]:",the_index); GOTOXY(14,3);printf("[%s]:",the_indexentry); GOTOXY(15,3);printf("[%s]:",the_indexsecond); GOTOXY(16,3);printf("[%s]:",the_seealso); GOTOXY(17,3);printf("[%s]:",the_primary); GOTOXY(18,3);printf("[%s]:",the_second); GOTOXY(19,3);printf("[%s]:",the_gloss); GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary); GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1); GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2); GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2); the_row=13; set_up_in(the_row); while(1) { ch=getch(); switch(ch) { case EXT: #if unix | VMS /* VAX */ ch=getch(); if (ch!=EXT1) {BELL;break;} ch=getch(); #else /* DOS */ ch=getch(); #endif switch(ch) { case L_ARROW: case U_ARROW: set_up_out(the_row); ch_count=0;string[0]=0; --the_row; if (the_row<13) the_row=25; set_up_in(the_row); break; case R_ARROW: case D_ARROW: down: set_up_out(the_row);ch_count=0;string[0]=0; ++the_row; if (the_row>25) the_row=13; set_up_in(the_row); break; default: BELL; } break; case 3 : all_done(); break; #if unix case 4 : all_done(); break; #endif case 1: case 2: case 5: case 6: case 7: case 10: case 11: case 12: case 14: case 15: case 16: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:BELL;break; case 8: case 127: if (ch_count>0){ CURSOR_LEFT; ERASE; string[--ch_count]=0; } break; case 13: if (ch_count>0) { string[ch_count]=0; set_up_save(the_row, string); } goto down;break; case 9: NORMAL;for (i=12;i<24;i++) {GOTOXY(i,1);ERASE;} help_menu();RESTORE_CURSOR; return; default: printf("%c",ch);string[ch_count++]=ch; } } } set_up_in( the_row) int the_row; { REVERSE; switch(the_row) { case 13: GOTOXY(13,3);printf("[%s]:",the_index);break; case 14: GOTOXY(14,3);printf("[%s]:",the_indexentry);break; case 15: GOTOXY(15,3);printf("[%s]:",the_indexsecond);break; case 16: GOTOXY(16,3);printf("[%s]:",the_seealso);break; case 17: GOTOXY(17,3);printf("[%s]:",the_primary); break; case 18: GOTOXY(18,3);printf("[%s]:",the_second); break; case 19: GOTOXY(19,3);printf("[%s]:",the_gloss); break; case 20: GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break; case 21: GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break; case 22: GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break; case 23: GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break; case 24: GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break; case 25: GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break; } } set_up_save(the_row, string) int the_row; char *string; { switch(the_row) { case 13:strcpy(the_index,string);break; case 14:strcpy(the_indexentry,string);break; case 15:strcpy(the_indexsecond,string);break; case 16:strcpy(the_seealso,string);break; case 17:strcpy(the_primary,string);break; case 18:strcpy(the_second,string);break; case 19:strcpy(the_gloss,string);break; case 20:strcpy(g_primary,string);break; case 21:strcpy(g_second,string);break; case 22:strcpy(the_delimiter1,string);break; case 23:strcpy(the_delimiter2,string);break; case 24:strcpy(the2_delimiter1,string);break; case 25:strcpy(the2_delimiter2,string);break; } } set_up_out(the_row) int the_row; { NORMAL; switch(the_row) { case 13:GOTOXY(13,1);ERASE; GOTOXY(13,3); printf("[%s]:",the_index);break; case 14:GOTOXY(14,1);ERASE; GOTOXY(14,3);printf("[%s]:",the_indexentry);break; case 15:GOTOXY(15,1);ERASE; GOTOXY(15,3);printf("[%s]:",the_indexsecond);break; case 16:GOTOXY(16,1);ERASE; GOTOXY(16,3);printf("[%s]:",the_seealso);break; case 17:GOTOXY(17,1);ERASE; GOTOXY(17,3);printf("[%s]:",the_primary); break; case 18:GOTOXY(18,1);ERASE; GOTOXY(18,3);printf("[%s]:",the_second); break; case 19:GOTOXY(19,1);ERASE; GOTOXY(19,3);printf("[%s]:",the_gloss); break; case 20:GOTOXY(20,1);ERASE; GOTOXY(20,3);printf("Gloss k1 [%s]:",g_primary);break; case 21:GOTOXY(21,1);ERASE; GOTOXY(21,3);printf("Gloss k2 [%s]:",g_second); break; case 22:GOTOXY(22,3);printf(" "); GOTOXY(22,3);printf("left delimiter 1 [%s]:",the_delimiter1);break; case 23:GOTOXY(22,40);ERASE; GOTOXY(22,40);printf("right delimiter 1 [%s]:",the_delimiter2);break; case 24:GOTOXY(23,3);printf(" "); GOTOXY(23,3);printf("left delimiter 2 [%s]:",the2_delimiter1); break; case 25:GOTOXY(23,40);ERASE; GOTOXY(23,40);printf("right delimiter 2 [%s]:",the2_delimiter2);break; } } out_check() {int i, rows, length, trunc; rows=1; trunc=256; strcpy(out_str,phrase_str); length=strlen(out_str); for (i=0;itrunc) {out_str[trunc]='.';out_str[trunc+1]='.';out_str[trunc+2]='.'; out_str[trunc+3]=0;} } get_line() { char ch; int ch_count; ch_count=0; command_line[0]=0; while(1) { ch=getch(); switch(ch) { case 3: all_done(); break; #if unix case 4: all_done(); break; #endif case 0: case 1: case 2: case 5: case 6: case 7: case 10: case 11: case 12: case 14: case 15: case 16: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: BELL;break; case 8: case 127: if (ch_count>0){ CURSOR_LEFT; ERASE; command_line[--ch_count]=0; } break; case 13: if (ch_count>0) command_line[ch_count]=0; return; default: printf("%c",ch);command_line[ch_count++]=ch; } } } str_search() { char *ptr; #if unix char *memchr(); #endif int same_page= -1; void this_page(); int cursor_here=0,i; command_line[0]=0; SAVE_CURSOR; GOTOXY(24,2); REVERSE; printf("String:"); NORMAL; printf(" "); if (the_phrase[0]>0) printf("[%s]", the_phrase); get_line(); if (command_line[0]>0) strcpy(the_phrase, command_line); else if (the_phrase[0]==0) {GOTOXY(24,2); ERASE; RESTORE_CURSOR; return;} ptr=buffer; if (same_page<0) while ( cursor_here #endif #if AMIGA #define NEW 1006L #define AMG_MAXBUF 1024L static long terminal; static char scrn_tmp[AMG_MAXBUF+1]; static long scrn_tmp_p = 0; #endif #if CPM #include #endif #if MSDOS & (LATTICE | MSC | TURBO | AZTEC | MWC86) union REGS rg; /* cpu register for use of DOS calls */ int nxtchar = -1; /* character held from type ahead */ #endif #if RAINBOW #include "rainbow.h" #endif #if USG /* System V */ #include #include #include int kbdflgs; /* saved keyboard fd flags */ int kbdpoll; /* in O_NDELAY mode */ int kbdqp; /* there is a char in kbdq */ char kbdq; /* char we've already read */ struct termio otermio; /* original terminal characteristics */ struct termio ntermio; /* charactoristics to use inside */ #endif #if V7 | BSD /* #undef CTRL */ #include /* for stty/gtty functions */ #include struct sgttyb ostate; /* saved tty state */ struct sgttyb nstate; /* values for editor mode */ struct tchars otchars; /* Saved terminal special character set */ struct tchars ntchars = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* A lot of nothing */ #if BSD #include /* to get at the typeahead */ extern int rtfrmshell(); /* return from suspended shell */ #define TBUFSIZ 128 char tobuf[TBUFSIZ]; /* terminal output buffer */ #endif #endif /* * This function is called once to set up the terminal device streams. */ ttopen() { #if AMIGA char oline[NSTRING]; #if AZTEC extern Enable_Abort; /* Turn off ctrl-C interrupt */ Enable_Abort = 0; /* for the Manx compiler */ #endif strcpy(oline, "RAW:0/0/640/200/"); strcat(oline, PROGNAME); strcat(oline, " "); strcat(oline, VERSION); strcat(oline, "/Amiga"); terminal = Open(oline, NEW); #endif #if CPM #endif #if MSDOS & (HP150 == 0) & LATTICE /* kill the ctrl-break interupt */ rg.h.ah = 0x33; /* control-break check dos call */ rg.h.al = 1; /* set the current state */ rg.h.dl = 0; /* set it OFF */ intdos(&rg, &rg); /* go for it! */ #endif #if USG ioctl(0, TCGETA, &otermio); /* save old settings */ ntermio.c_iflag = 0; /* setup new settings */ ntermio.c_oflag = 0; ntermio.c_cflag = otermio.c_cflag; ntermio.c_lflag = 0; ntermio.c_line = otermio.c_line; ntermio.c_cc[VMIN] = 1; ntermio.c_cc[VTIME] = 0; ioctl(0, TCSETA, &ntermio); /* and activate them */ kbdflgs = fcntl( 0, F_GETFL, 0 ); kbdpoll = FALSE; #endif #if V7 | BSD if (tt_status==tt_open) return; gtty(0, &ostate); /* save old state */ gtty(0, &nstate); /* get base of new state */ nstate.sg_flags |= RAW; nstate.sg_flags &= ~(ECHO|CRMOD); /* no echo for now... */ stty(0, &nstate); /* set mode */ ioctl(0, TIOCGETC, &otchars); /* Save old characters */ ioctl(0, TIOCSETC, &ntchars); /* Place new character into K */ tt_status=tt_open; #if BSD /* provide a smaller terminal output buffer so that the type ahead detection works better (more often) */ setbuffer(stdout, &tobuf[0], TBUFSIZ); /*--- signal(SIGTSTP,SIG_DFL); set signals so that we can signal(SIGCONT,rtfrmshell); suspend & restart emacs */ #endif #endif /* on all screens we are not sure of the initial position of the cursor */ /*--- ttrow = 999; ttcol = 999; */ } /* * This function gets called just before we go back home to the command * interpreter. * Another no-operation on CPM. */ ttclose() { #if AMIGA #if LATTICE amg_flush(); Close(terminal); #endif #if AZTEC amg_flush(); Enable_Abort = 1; /* Fix for Manx */ Close(terminal); #endif #endif #if CPM #endif #if MSDOS & (HP150 == 0) & LATTICE /* restore the ctrl-break interupt */ rg.h.ah = 0x33; /* control-break check dos call */ rg.h.al = 1; /* set the current state */ rg.h.dl = 1; /* set it ON */ intdos(&rg, &rg); /* go for it! */ #endif #if USG ioctl(0, TCSETA, &otermio); /* restore terminal settings */ fcntl(0, F_SETFL, kbdflgs); #endif #if V7 | BSD if (tt_status==tt_close) return; stty(0, &ostate); ioctl(0, TIOCSETC, &otchars); /* Place old character into K */ tt_status=tt_close; #endif } #if AMIGA amg_flush() { if(scrn_tmp_p) Write(terminal,scrn_tmp,scrn_tmp_p); scrn_tmp_p = 0; } #endif /* * Flush terminal buffer. Does real work where the terminal output is buffered * up. A no-operation on systems where byte at a time terminal I/O is done. */ ttflush() { #if AMIGA amg_flush(); #endif #if CPM #endif #if MSDOS #endif #if V7 | USG | BSD fflush(stdout); #endif } /* * Read a character from the terminal, performing no editing and doing no echo * at all. */ ttgetc() { #if AMIGA char ch; amg_flush(); Read(terminal, &ch, 1L); return(255 & (int)ch); #endif #if CPM return (biosb(BCONIN, 0, 0)); #endif #if RAINBOW int Ch; while ((Ch = Read_Keyboard()) < 0); if ((Ch & Function_Key) == 0) if (!((Ch & 0xFF) == 015 || (Ch & 0xFF) == 0177)) Ch &= 0xFF; return Ch; #endif #if MSDOS & MWC86 return (getcnb()); #endif #if MSDOS & (LATTICE | MSC | TURBO | AZTEC) int c; /* character read */ /* if a char already is ready, return it */ if (nxtchar >= 0) { c = nxtchar; nxtchar = -1; return(c); } /* call the dos to get a char */ rg.h.ah = 7; /* dos Direct Console Input call */ intdos(&rg, &rg); c = rg.h.al; /* grab the char */ return(c & 255); #endif #if V7 | BSD return(127 & fgetc(stdin)); #endif #if USG if( kbdqp ) kbdqp = FALSE; else { if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 ) return FALSE; kbdpoll = FALSE; while (read(0, &kbdq, 1) != 1) ; } return ( kbdq & 127 ); #endif }