Subject: HELP on INFORMIX 4GL & FORMS (termcap) From: Mike Aubury <mike@aubury.demon.co.uk> Date: Fri, 03 May 96 17:41:09 [...] I've only tested it under linux..... ---------------------CUT HERE ---------------------------------------- #include <stdio.h> #include <strings.h> char getcc(char *dispstr,char *bf); char keycode[100][10]; FILE *fout; enum keys { PGUP, ENTER, PGDN, LEFT, RIGHT, UP, DOWN, F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,F14,F15,F16,F17,F18,F19,F20 ,F21,F22,F23, F24, INSERT,DELETE,HOME,END, KP0,KPDOT,KPENT,KP1,KP2,KP3,KP4,KP5,KP6,KP7,KP8,KP9 }; int minstr(char *bf,char ch); int xcol; int lines; main(int argc,char *argv[]) { int cnt1,cnt2; char a; if (argc!=2) { printf("Error: Usage %s new_tcap_file\n",argv[0]); exit(0); } fout=fopen(argv[1],"r"); if (fout!=0) { printf("File exists - better safe than sorry so exiting\n"); exit(0); } fclose(fout); fout=fopen(argv[1],"w"); /* Start of with the easy stuff */ printf("\n\nGen-Termcap (c) 1996 Aubit Computing Ltd\n"); printf("\nFor internal use only-may not be sold\n"); dispdisplay(); } char getcc(char *dispstr,char *bf) { char a; while (1) { if (a!=10 && a!=13) printf(dispstr); a=getc(stdin); if (a==10||a==13) continue; if (minstr(bf,a)) return a; printf("%c",7); if (strlen(dispstr)>0) printf("Invalid Reponse!(%d)\n",a); } } minstr(char *bf,char ch) { int cnt; for (cnt=0;cnt<=strlen(bf);cnt++) { if (bf[cnt]==ch) return 1; } return 0; } dispdisplay() { int a,b,c; int cnt; int pos1,pos2,pos3; char code1[4]; char code2[4]; char code3[4]; char teststr[4]; char yn; #define NUMCHARS 26+1 /* for the NULL */ char buff[NUMCHARS]={"abcdefghijklmnopqrstuvwxyz"}; char buffer[20000]; char str[80]; while(1) { printf("This program will now display a series of lines, you will have to enter\n"); printf("the three digit code at the top left,top right, and bottom left\n"); printf("Eg. if the following was your screen.\n"); printf("+-----------+\n"); printf("|aabaaciaada|\n"); printf("|aeaafaagaah|\n"); printf("|aaiaajaakaa|\n"); printf("|PROMPT: +\n"); printf("+-----------+\n"); printf("You would enter 'aab' for Top Left\n"); printf("You would enter 'ada' for Top Right\n"); printf("You would enter 'aai' for Bottom Right\n"); printf("Note:These would be entered as aab,ada,aai\n"); printf("Press any key to continue\n"); getc(stdin); cnt=0; for (a=0;a<NUMCHARS;a++) { for (b=a+1;b<NUMCHARS;b++) { for (c=b+1;c<NUMCHARS;c++) { printf("%c%c%c",buff[a],buff[b],buff[c]); buffer[cnt++]=buff[a]; buffer[cnt++]=buff[b]; buffer[cnt++]=buff[c]; } } } printf("\nEnter TL TR BL <CR> (eg, aab,ada,aai) :"); gtla(code1); gtla(code2); gtla(code3); yn=getcc("\nThese are the codes I have - proceed (Y/N/Abort)","YNyn"); getc(stdin); if (yn=='N' || yn=='n') {continue;} if (yn=='A' || yn=='a') {printf("Ok - aborting\n");exit(1);} pos1=-1; pos2=-1; pos3=-1; printf("Total of %d codes\n",cnt); for (a=0;a<cnt-2;a++) { sprintf(teststr,"%c%c%c",buffer[a],buffer[a+1],buffer[a+2]); if (strcmp(teststr,code1)==0) pos1=a; if (strcmp(teststr,code2)==0) pos2=a; if (strcmp(teststr,code3)==0) pos3=a; } if (pos1<0) {printf("You entered TL incorrectly - try again\n");} if (pos2<0) {printf("You entered TR incorrectly - try again\n");} if (pos3<0) {printf("You entered BL incorrectly - try again\n");} if (pos3<0||pos2<0||pos1<0) {continue;} break; } printf("Codes found at positions (%d,%d,%d)\n",pos1,pos2,pos3); xcol=pos2-pos1+1; printf("Line Width=%d\n",xcol); lines=((pos3-pos1)/xcol)+1; printf("Total Lines=%d\n",lines); printf("Ok - now for the keys, this all assumes that ENTER gives LF\n"); printf("So we'll check\n"); getkey("Press the ENTER key:",keycode[ENTER]); printf("\n:%s:\n",keycode[ENTER]); if (keycode[ENTER][0]!=0) { printf("Oops, First character was %02x\n",(int)keycode[ENTER][0]); if (keycode[ENTER][0]=='\r') {printf("But that CR so I can carry on!\n"); } } getkey("Press the PGUP key followed by <CR>:",keycode[PGUP]); getkey("Press the PGDN key <CR>:",keycode[PGDN]); getkey("Press the LEFT key <CR>:",keycode[LEFT]); getkey("Press the RIGHT key <CR>:",keycode[RIGHT]); getkey("Press the UP key <CR>:",keycode[UP]); getkey("Press the DOWN key <CR>:",keycode[DOWN]); getkey("Press the INSERT key <CR>:",keycode[INSERT]); getkey("Press the HOME key <CR>:",keycode[HOME]); getkey("Press the END key <CR>:",keycode[END]); getkey("Press the DELETE (not backspace!) key <CR>:",keycode[DELETE]); printf("\n\n\nPlease make sure that Num Lock is OFF!!!\n\n\n"); /* getkey("Press the INS/0 (on numeric keypad) key <CR>:",keycode[KP0]); getkey("Press the DEL/. (on numeric keypad) key <CR>:",keycode[KPDOT]); getkey("Press the Enter (on numeric keypad) key <CR>:",keycode[KPENT]); getkey("Press the 1/End (on numeric keypad) key <CR>:",keycode[KP1]); getkey("Press the 2/Down (on numeric keypad) key <CR>:",keycode[KP2]); getkey("Press the 3/Pg Down (on numeric keypad) key <CR>:",keycode[KP3]); getkey("Press the 4/Left (on numeric keypad) key <CR>:",keycode[KP4]); getkey("Press the 5 (on numeric keypad) key <CR>:",keycode[KP5]); getkey("Press the 6/Right (on numeric keypad) key <CR>:",keycode[KP6]); getkey("Press the 7/Home (on numeric keypad) key <CR>:",keycode[KP7]); getkey("Press the 8/Up (on numeric keypad) key <CR>:",keycode[KP8]); getkey("Press the 9/PgUp (on numeric keypad) key <CR>:",keycode[KP9]); */ yn=getcc("Do you have more than 12 Function Keys ? (YN)","YyNn"); getc(stdin); for (a=1;a<=24;a++) { printf("Key : %d\n",a); if (a<=12 || yn=='Y' || yn=='y') sprintf(str,"Press the F%d key <CR>:",a); else sprintf(str,"Press the SHIFT-F%d key <CR>:",a-12); printf("************************************\n"); getkey(str,keycode[F1+a-1]); /*dodgey*/ } printf("OK\n"); getcc("Press Y <CR> to continue\n","yY"); printf("Writing definition\n"); fprintf(fout,"aubit|full_name|morename|evenmorename:\\\n"); fprintf(fout," co#%d:li#%d:\\\n",xcol,lines); fprintf(fout," do=%s:up=%s:le=%s:kr=%s:\\\n",keycode[DOWN],keycode[UP],keycode[LEFT], keycode[RIG HT]); fprintf(fout," kP=%s:kN=%s:kH=%s:@7=%s:\\\n",keycode[PGUP],keycode[PGDN],keycode[END] ,keycode [END]); fprintf(fout," K4=%s:K5=%s:k1=%s:K2=%s:\\\n",keycode[END],keycode[PGDN],keycode[HOME] ,keycode[ PGUP]); fprintf(fout," kI=%s:kD=%s:kh=%s:kl=%s:\\\n",keycode[INSERT],keycode[DELETE],keycode[ HOME],keyc ode[LEFT]); fprintf(fout," k1=%s:k2=%s:k3=%s:k4=%s:\\\n",keycode[F1],keycode[F2],keycode[F3],keyc ode[F4]); fprintf(fout," k5=%s:k6=%s:k7=%s:k8=%s:\\\n",keycode[F5],keycode[F6],keycode[F7],keyc ode[F8]); fprintf(fout," k9=%s:k0=%s:F1=%s:F2=%s:\\\n",keycode[F9],keycode[F10],keycode[F11],ke ycode[F12]); fprintf(fout," F3=%s:F4=%s:F5=%s:F6=%s:\\\n",keycode[F13],keycode[F14],keycode[F15],k eycode[F16]); fprintf(fout," F7=%s:F8=%s:F9=%s:FA=%s:\\\n",keycode[F17],keycode[F18],keycode[F19],k eycode[F20]); fprintf(fout," FB=%s:FC=%s:FD=%s:FE=%s:\\\n",keycode[F21],keycode[F22],keycode[F23],k eycode[F24] ); fclose(fout); printf("Done\n"); } gtla(char *buff) { int cnt=0; char buffer[80]; for (cnt=0;cnt<3;cnt++) {buffer[cnt]=getcc("","abcdefghijklmnopqrstuvwxyz");} buffer[3]=0; printf("[%s] ",buffer); strcpy(buff,buffer); } getkey(char *str,char *buff) { char b2[40]; printf("%s",str); b2[0]=0; b2[1]=0; b2[2]=0; b2[3]=0; b2[4]=0; b2[5]=0; b2[6]=0; b2[7]=0; b2[8]=0; b2[9]=0; gets(b2); tcapprint(buff,b2); /*printf("%x %x %x %x %x %x %x %x %x %x\n",b2[0],b2[1],b2[2],b2[3],b2[4],b2[5],b2[6],b2[7],b2[8],b2[9]);*/ } tcapprint(char *sbuff,char *buff) { int a; char b2[40]; b2[0]=0; sbuff[0]=0; if (strlen(buff)==0) sprintf(b2,"\\n"); for (a=0;a<strlen(buff);a++) { if (buff[a]>0 && buff[a]<=26) sprintf(b2,"^%c",buff[a]+'a'-1); if (buff[a]==27) sprintf(b2,"\\E"); if (buff[a]==0) sprintf(b2,"\\0"); if (b2[0]==0) sprintf(b2,"%c",buff[a]); strcat(sbuff,b2); b2[0]=0; } printf("%s\n",sbuff); } ------------------------------------AND HERE----------------------- -- Mike Aubury _\?/_ |O O| +----------oOOO-\_/-OOOo---------+-----------------------------+ | Heisenberg may have been here | mike@aubury.demon.co.uk | | | http://www.flash.net/~aubit | +--------------------------------+-----------------------------+