⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zfield.c

📁 unix下的界面工具
💻 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 + -