?? winputsf.c
字號:
/* CXL - Copyright (c) 1987-1989 by Mike Smedley - All Rights Reserved */
/* WINPUTSF.C - inputs a string from the keyboard within a window */
#include <conio.h>
#include <ctype.h>
#include "cxldef.h"
#include "cxlkey.h"
#include "cxlstr.h"
#include "cxlvid.h"
#include "cxlwin.h"
int winputsf(char *str,char *fmt)
{
char ch;
char *dest,*src,*temp,*start=0;
int valid=NO,mixed=NO,upper=NO,endfmt=NO,retkey=YES,lower=NO;
int done=NO,copy=NO,password=NO;
if(!_winfo.total) return(_winfo.errno=W_NOACTIVE);
/* initialize pointers */
src=fmt;
dest=str;
for(;;) {
if(!(*src)) endfmt=YES;
switch(*src) {
case ' ': /* check for space */
src++;
break;
case 39: /* check for start quote */
case 34:
ch=*src;
src++;
while(*src!=ch) { /* find end quote */
if(*src==0) { /* end of string? */
*str=0;
return(_winfo.errno=W_INVFORMT);
}
wputc(*src); /* display character */
if(copy) *dest++=*src; /* copy char to output */
src++;
}
src++;
break;
case '!': /* check for start point */
src++;
while(*src!='!') { /* find end excl. point */
if(*src==0) { /* end of string? */
*str=0;
return(_winfo.errno=W_INVFORMT);
}
switch(*src) { /* check for valid chars */
case '-': /* decrease attribute */
_winfo.active->attr--;
_winfo.active->attr=mapattr(_winfo.active->attr);
break;
case '+': /* increase attribute */
_winfo.active->attr++;
_winfo.active->attr=mapattr(_winfo.active->attr);
break;
case 'C': /* toggle copy to output */
copy^=1;
break;
case 'E': /* toggle Escape checking */
_winfo.esc^=1;
break;
case 'L': /* toggle lower-case conv */
lower^=1;
break;
case 'M': /* toggle mixed-case conv */
mixed^=1;
break;
case 'P': /* toggle password (echo) */
password^=1;
break;
case 'R': /* toggle return key check */
retkey^=1;
break;
case 'U': /* toggle upper-case conv */
upper^=1;
break;
default:
*str='\0';
return(_winfo.errno=W_INVFORMT);
}
src++;
}
src++;
break;
default:
for(;;) {
ch=(char)(getxch()&0x00ff); /* get key from keyboard */
if(!ch) break; /* check for extended code */
if(!start) start=dest; /* save start of input */
if(ch==ESC) { /* is it the Escape key? */
if(!_winfo.esc) { /* is Esc checking off? */
} /* yes, ignore */
else {
*str=0; /* null string & quit */
return(_winfo.errno=W_ESCPRESS);
}
break;
}
if(ch==CR) { /* is it the return key? */
/* is return disabled? */
if((!retkey)&&(!endfmt)) {
}
else {
*dest=0; /* add term null to string */
return(_winfo.errno=W_NOERROR);
}
break;
}
if(ch==BS) { /* is it Backspace key? */
if(dest!=str) {
if(dest==start) break;
wputc('\b');
wputc(' ');
wputc('\b');
dest--;
src--;
endfmt=NO;
done=NO;
while(!done) {
switch(*src) {
case ' ':
src--;
break;
case 39:
case 34:
ch=*src;
src--;
/* find start quote */
while(*src!=ch) {
wputc('\b');
wputc(' ');
wputc('\b');
/* decrease output ptr */
if(copy) dest--;
src--;
}
src--;
break;
case '!':
src--;
/* find start excl point */
while(*src!='!') {
/* toggle found switches */
switch(*src) {
case '-':
/* increase attribute */
_winfo.active->attr++;
_winfo.active->attr=
mapattr(_winfo.active->attr);
break;
case '+':
/* decrease attribute */
_winfo.active->attr--;
_winfo.active->attr=
mapattr(_winfo.active->attr);
break;
case 'C':
/* togggle copy to output */
copy^=1;
break;
case 'E':
/* toggle Escape checking */
_winfo.esc^=1;
break;
case 'L':
/* toggle lower-case conv */
lower^=1;
break;
case 'M':
/* toggle mixed-case conv */
mixed^=1;
break;
/* toggle password (echo) */
case 'P':
password^=1;
break;
case 'R':
/* toggle return key check */
retkey^=1;
break;
case 'U':
/* toggle upper-case conv */
upper^=1;
break;
}
src--;
}
src--;
break;
case '>':
src--;
/* find start bracket */
while(*src!='<') src--;
break;
case ']':
src--;
/* find start bracket */
while(*src!='[') src--;
break;
default:
done=YES;
}
}
}
break;
}
if(!endfmt) { /* end of format string? */
if(mixed) /* mixed-case switch on? */
ch=touplow(str,dest,ch);
if(lower) /* lower case switch on? */
ch=tolower(ch);
if(upper) /* upper-case switch on? */
ch=toupper(ch);
valid=NO;
switch(*src) { /* test format character */
case '<': /* is it in valid list? */
temp=src;
src++;
/* check all chars in list */
while(*src!='>') {
/* end of string? */
if(*src=='\0') {
*str='\0';
/* invalid format string */
return(_winfo.errno=W_INVFORMT);
}
if(ch==*src) valid=YES;
src++;
}
if(!valid) src=temp;
break;
case '[': /* is it in invalid list? */
valid=YES;
temp=src;
src++;
/* check all chars in list */
while(*src!=']') {
/* end of string? */
if(*src=='\0') {
*str='\0';
/* invalid format string */
return(_winfo.errno=W_INVFORMT);
}
if(ch==*src) valid=NO;
src++;
}
if(!valid) src=temp;
break;
default:
valid=cvaltype(ch,*src);
if(valid==-1) {
*str='\0';
return(_winfo.errno=W_INVFORMT);
}
switch(*src) {
case 'L':
ch=tolower(ch);
break;
case 'M':
ch=touplow(str,dest,ch);
break;
case 'U':
ch=toupper(ch);
break;
}
}
if(valid) { /* input character valid? */
/* yes, display it */
wputc(password||*src=='P'?' ':ch);
*dest++=ch;
src++;
break;
}
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -