📄 zfield.c
字号:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
#include "zlib.h"
#define ISDIGIT(c) (c>='0'&&c<='9')
#define ISXDIGIT(c) (ISDIGIT(c)||c>='A'&&c<='F'||c>='a'&&c<='f')
#define ISALPHA(c) (c>='A'&&c<='Z'||c>='a'&&c<='z')
static int ZF_attr[_ZF_COUNT][2] = {
{ ZA_TEXT, ZA_NEGTXT },
{ ZA_FIELD, ZA_NEGFLD },
{ ZA_EDIT, ZA_NEGEDT }
};
/*
#define TEST
*/
#ifdef TEST
#include <stdarg.h>
#include <stdio.h>
void DEBUG(char *fmt,...)
{
FILE *fp;
va_list v;
va_start(v,fmt);
if( ( fp = fopen( "DEBUG", "a+" ) ) != NULL ){
vfprintf( fp, fmt, v );
fclose( fp );
}
}
#endif
int ZFroundpos( char *b, int c )
{
int i,p;
for( i=0; i<=c; i++ ){
p=i;
if( Zideocode(b[i]) )
i++;
}
return(p);
}
int ZFfixpic( char *b, int p )
{
unsigned char c;
if( !b || p<0 || p>=Zstrlen(b) )
return( 0 );
c=b[ZFroundpos( b, p )];
if( c==' ' || ISDIGIT(c) || ISALPHA(c) )
return(0);
return(1);
}
void ZFtotext( ZFIELD *f, char *b )
{
int i, c;
if( f->t == 'D' || f->t == 'F' || f->t == 'L' || f->t == 'I' ){
switch( ( int ) f->t ){
case 'D':
sprintf( b, "%*.*lf", f->w, f->d, *( ( double * ) f->v ) );
break;
case 'F':
sprintf( b, "%*.*f", f->w, f->d, *( ( float * ) f->v ) );
break;
case 'L':
if( *( ( long * ) f->v ) == 0 )
sprintf( b, "%*s", f->w, "" );
else
sprintf( b, "%*ld", f->w, *( ( long * ) f->v ) );
break;
case 'I':
if( *( ( int * ) f->v ) == 0 )
sprintf( b, "%*s", f->w, "" );
else
sprintf( b, "%*d", f->w, *( ( int * ) f->v ) );
break;
}
if( strlen( b ) > f->w )
Zstrmovf( b, strlen( b ), strlen( b ) - f->w );
if( ( f->t == 'D' || f->t == 'F' ) && f->d != 0 ){
for( i = f->w - 1; i >= 0; i -- ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i )
&& ( f->p[i] != '.' && f->p[i] != ','
|| f->p[i] == '.' && b[i] != '.'
|| f->p[i] == ',' && b[i] != ' ' && b[i] != '-' ) ){
Zstrmovf( b, i + 1, 1 );
b[i] = f->p[i];
}
else if( i == f->w - f->d - 1 && b[i] != '.' ){
Zstrmovf( b, i + 1, 1 );
b[i] = '.';
}
}
}
else{
for( i = f->w - 1; i >= 0; i -- ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i )
&& ( f->p[i] != ',' || b[i] != ' ' && b[i] != '-' ) ){
Zstrmovf( b, i + 1, 1 );
b[i] = f->p[i];
}
}
}
}
else{
sprintf( b, "%-*.*s", f->w, f->w, ( char * ) f->v );
for( i = 0; i < f->w; i ++ ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i ) ){
Zstrmovb( b + i, f->w - i, 1 );
b[i] = f->p[i];
}
}
}
for( i = 0; i < f->w; i ++ ){
if( i < Zstrlen( f->p ) && !ZFfixpic( f->p, i ) ){
c = f->p[i];
switch( c ){
case '0':
if( !ISDIGIT( b[i] ) )
b[i] = ' ';
break;
case '9':
if( !ISDIGIT( b[i] ) && b[i] != '-' )
b[i] = ' ';
break;
case 'A':
case 'a':
if( !ISALPHA( b[i] ) )
b[i] = ' ';
break;
case 'N':
case 'n':
if( !ISDIGIT( b[i] ) && !ISALPHA( b[i] ) )
b[i] = ' ';
break;
case 'H':
case 'h':
if( !ISXDIGIT( b[i] ) )
b[i] = ' ';
break;
}
if( c == 'A' || c == 'N' || c == 'H' || c == 'X' )
b[i] = toupper( b[i] );
}
}
}
void ZFtodata( ZFIELD *f, char *b )
{
int i, l;
char *buf;
if( ( buf = strdup( b ) ) != NULL ){
if( f->t == 'D' || f->t == 'F' || f->t == 'L' || f->t == 'I' ){
if( ( f->t == 'D' || f->t == 'F' ) && f->d != 0 ){
for( i = 0; i < f->w; i ++ ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i )
&& ( f->p[i] != '.' || i != f->w - f->d - 1 ) ){
Zstrmovb( buf, i + 1, 1 );
}
}
}
else{
for( i = 0; i < f->w; i ++ ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i ) ){
Zstrmovb( buf, i + 1, 1 );
}
}
}
for( i = 0; buf[i]; i ++ )
if( buf[i] != ' ' )
break;
switch( ( int ) f->t ){
case 'D':
*( ( double * ) f->v ) = 0.0;
if( buf[i] )
sscanf( buf + i, "%lf", ( double * ) f->v );
break;
case 'F':
*( ( float * ) f->v ) = 0.0;
if( buf[i] )
sscanf( buf + i, "%f", ( float * ) f->v );
break;
case 'L':
*( ( long * ) f->v ) = 0L;
if( buf[i] )
sscanf( buf + i, "%ld", ( long * ) f->v );
break;
case 'I':
*( ( int * ) f->v ) = 0;
if( buf[i] )
sscanf( buf + i, "%d", ( int * ) f->v );
break;
}
}
else{
for( i = f->w - 1; i >= 0; i -- ){
if( f->p != 0 && i < Zstrlen( f->p ) && ZFfixpic( f->p, i ) ){
Zstrmovf( buf + i, f->w - i, 1 );
}
}
l = f->w;
for( i = 0; i < f->w; i ++ )
if( ZFfixpic( f->p, i ) )
l --;
memcpy( f->v, ( void * ) buf, l );
if( f->t == 'S' || f->t == 'P' ){
*( ( ( char * ) f->v ) + l ) = 0;
*( ( ( char * ) f->v ) + Zstrlen( f->v ) ) = 0;
}
}
free( buf );
}
}
void ZFattr( ZFIELD *f, int t )
{
int s;
double d;
switch( ( int ) f->t ){
case 'C':
case 'S':
case 'P':
d = 0;
break;
case 'I':
d = *( ( int * ) ( f->v ) );
break;
case 'L':
d = *( ( long * ) ( f->v ) );
break;
case 'F':
d = *( ( float * ) ( f->v ) );
break;
case 'D':
d = *( ( double * ) ( f->v ) );
break;
}
if( d < 0 )
s = 1;
else
s = 0;
ZWattr( ZF_attr[t][s] );
}
void ZFdispbuf( ZFIELD *F, char *b )
{
int i;
if( F->t == 'P' )
for( i = 0; i < F->w; i ++ )
ZWprint( F->r, F->c + i,
ZFfixpic( F->p, i ) ? F->p + i :
( ( b[i] > ' ' ) ? "#" : b + i ), 1 );
else
ZWprint( F->r, F->c, b, F->w );
}
void ZFdisplay( ZFIELD *f, int c, int t )
{
int i, or, oc, oa;
char *b;
if( ( b = ( char * ) malloc( 256 ) ) != NULL )
{
ZWcursor( &or, &oc );
oa = ZWattr( -1 );
for( i = 0; i < c; i ++ )
{
ZFtotext( f, b );
ZFattr( f, t );
ZFdispbuf( f, b );
f++;
}
free( b );
ZWlocate( or, oc );
ZWattr( oa );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -