aboutsummaryrefslogtreecommitdiff
path: root/project/src/wkclt.c
diff options
context:
space:
mode:
Diffstat (limited to 'project/src/wkclt.c')
-rw-r--r--project/src/wkclt.c185
1 files changed, 176 insertions, 9 deletions
diff --git a/project/src/wkclt.c b/project/src/wkclt.c
index fd55727..5538ecd 100644
--- a/project/src/wkclt.c
+++ b/project/src/wkclt.c
@@ -17,7 +17,7 @@
* This file is part of the SZS project. *
* Visit https://szs.wiimm.de/ for project details and sources. *
* *
- * Copyright (c) 2011-2021 by Dirk Clemens <wiimm@wiimm.de> *
+ * Copyright (c) 2011-2022 by Dirk Clemens <wiimm@wiimm.de> *
* *
***************************************************************************
* *
@@ -37,6 +37,8 @@
#include "lib-kcl.h"
#include "lib-szs.h"
+#include "crypt.h"
+#include "lib-checksum.h"
#include "ui.h" // [[dclib]] wrapper
#include "ui-wkclt.c"
#include <math.h>
@@ -58,6 +60,7 @@ extern const char text_kcl_flag_template_cr[];
static void help_exit ( bool xmode )
{
+ SetupPager();
fputs( TITLE "\n", stdout );
if (xmode)
@@ -69,6 +72,7 @@ static void help_exit ( bool xmode )
else
PrintHelpCmd(&InfoUI_wkclt,stdout,0,0,"HELP",0,URI_HOME);
+ ClosePager();
exit(ERR_OK);
}
@@ -655,6 +659,80 @@ static enumError cmd_cff()
//
///////////////////////////////////////////////////////////////////////////////
+/////////////// command types ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+static enumError cmd_types()
+{
+ stdlog = stderr;
+
+ if (print_header)
+ {
+ if (brief_count)
+ printf("\n flag\n"
+ "-------\n");
+ else
+ printf("\n flag = type | variant : W X Y Z Ty\n"
+ "-----------------------------------------\n");
+ }
+
+ enumError cmd_err = ERR_OK;
+ ParamList_t *param;
+ for ( param = first_param; param; param = param->next )
+ {
+ char *arg = param->arg;
+ u16 value = str2ul(arg,&arg,16);
+ for(;;)
+ {
+ while ( *arg > 0 && *arg <= ' ' || *arg == ',' )
+ arg++;
+ if (!*arg)
+ break;
+ char ch = tolower((int)*arg++);
+ if ( *arg == '=' )
+ arg++;
+ u16 mask = 0, par = str2ul(arg,&arg,10);
+ int shift = 0;
+ switch (ch)
+ {
+ case 't': mask = 0x001f; break;
+ case 'v': mask = 0xffe0; shift = 5; break;
+ case 'w': mask = 0xe000; shift = 13; break;
+ case 'x': mask = 0x1800; shift = 11; break;
+ case 'y': mask = 0x0700; shift = 8; break;
+ case 'z': mask = 0x00e0; shift = 5; break;
+ }
+ if (!mask)
+ break;
+ value = value & ~mask | (par<<shift) & mask;
+ }
+
+ if (brief_count)
+ printf("0x%04x\n",value);
+ else
+ {
+ const int w = value >> 13 & 7;
+ const int x = value >> 11 & 3;
+ const int y = value >> 8 & 7;
+ const int z = value >> 5 & 7;
+
+ printf(
+ " 0x%04x = 0x%02x | 0x%03x << 5 : %c %c %c %c %2d\n",
+ value, value & 0x1f, value >> 5,
+ w ? '0'+w : '-',
+ x ? '0'+x : '-',
+ y ? '0'+y : '-',
+ z ? '0'+z : '-',
+ value & 0x1f );
+ }
+ }
+ if (print_header)
+ putchar('\n');
+ return cmd_err;
+}
+
+//
+///////////////////////////////////////////////////////////////////////////////
/////////////// command flags ///////////////
///////////////////////////////////////////////////////////////////////////////
@@ -695,8 +773,8 @@ static enumError cmd_flags()
memset(tcount,0,sizeof(tcount));
if ( print_header && !brief_count )
- printf("\n flag type variant triangle count\n"
- "-----------------------------------------------\n");
+ printf("\n flag = type | variant : W X Y Z Ty : triangle count\n"
+ "------------------------------------------------------------\n");
uint i, j;
for ( i = 0; i < N_KCL_TYPE; i++ )
@@ -709,8 +787,21 @@ static enumError cmd_flags()
if (!brief_count)
{
done++;
- printf(" 0x%04x = 0x%02x | 0x%03x << 5 :%7u = %6.2f%%\n",
+ const int w = j >> 13 & 7;
+ const int x = j >> 11 & 3;
+ const int y = j >> 8 & 7;
+ const int z = j >> 5 & 7;
+
+ printf(
+ " 0x%04x = 0x%02x | 0x%03x << 5"
+ " : %c %c %c %c %2d"
+ " :%7u = %6.2f%%\n",
j, j & 0x1f, j >> 5,
+ w ? '0'+w : '-',
+ x ? '0'+x : '-',
+ y ? '0'+y : '-',
+ z ? '0'+z : '-',
+ j & 0x1f,
count[j], 100.0 * count[j] / n );
}
}
@@ -720,12 +811,12 @@ static enumError cmd_flags()
if (print_header)
printf( "\n"
- " type triangle count type description\n"
- "--------------------------------------------------\n");
+ " type : triangle count : type description\n"
+ "---------------------------------------------------\n");
for ( i = 0; i < N_KCL_TYPE; i++ )
if (tcount[i])
- printf(" T 0x%02x :%7u = %6.2f%% %s\n",
+ printf(" T 0x%02x :%7u = %6.2f%% : %s\n",
i, tcount[i], 100.0 * tcount[i] / n,
kcl_type[i].info );
putchar('\n');
@@ -946,6 +1037,74 @@ static enumError cmd_check()
//
///////////////////////////////////////////////////////////////////////////////
+/////////////// command sha1 ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+static enumError cmd_sha1()
+{
+ stdlog = stderr;
+ enumError max_err = ERR_OK;
+ SetPatchFileModeReadonly();
+ SetupCoding64( opt_coding64, opt_db64 ? ENCODE_BASE64URL : ENCODE_BASE64 );
+
+ raw_data_t raw;
+ InitializeRawData(&raw);
+
+ ParamList_t *param;
+ for ( param = first_param; param; param = param->next )
+ {
+ NORMALIZE_FILENAME_PARAM(param);
+ enumError err = LoadRawData(&raw,false,param->arg,autoname,opt_ignore>0,FF_KCL);
+
+ if ( max_err < err )
+ max_err = err;
+
+ if ( err > ERR_WARNING || err == ERR_NOT_EXISTS )
+ {
+ if ( opt_db64 )
+ {
+ putchar('-');
+ if (long_count)
+ fputs(" -1 -1 0.000 -",stdout);
+ if (brief_count)
+ putchar('\n');
+ else
+ printf(" %s\n",param->arg);
+ }
+
+ if ( err == ERR_NOT_EXISTS || opt_ignore )
+ continue;
+ return err;
+ }
+
+ kcl_t kcl;
+ err = ScanRawDataKCL(&kcl,true,&raw,true,0);
+ if ( err > ERR_WARNING )
+ return err;
+
+ err = CreateRawKCL(&kcl,false);
+ if ( err > ERR_WARNING )
+ return err;
+
+ sha1_size_t info;
+ SHA1(kcl.raw_data,kcl.raw_data_size,info.hash);
+ info.size = htonl(kcl.raw_data_size);
+ char checksum[100];
+ CreateSSChecksum(checksum,sizeof(checksum),&info);
+
+ if (brief_count)
+ printf("%s\n",checksum);
+ else
+ printf("%s %s\n",checksum,kcl.fname);
+ ResetKCL(&kcl);
+ }
+
+ ResetRawData(&raw);
+ return max_err;
+}
+
+//
+///////////////////////////////////////////////////////////////////////////////
/////////////// command analyze ///////////////
///////////////////////////////////////////////////////////////////////////////
@@ -1022,6 +1181,7 @@ static void analyze_kcl ( kcl_t *kcl )
static enumError cmd_analyze()
{
stdlog = stderr;
+ patch_action_log_disabled++;
raw_data_t raw;
InitializeRawData(&raw);
@@ -1125,6 +1285,7 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env )
case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break;
case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break;
case GO_LOGGING: logging++; break;
+ case GO_WARN: err += ScanOptWarn(optarg); break;
case GO_DE: use_de = true; break;
case GO_CT_CODE: ctcode_enabled = true; break;
case GO_LE_CODE: lecode_enabled = true; break;
@@ -1186,6 +1347,11 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env )
case GO_TRACKS: err += ScanOptTracks(optarg); break;
case GO_ARENAS: err += ScanOptArenas(optarg); break;
+ case GO_ID: opt_id = true; break;
+ case GO_BASE64: opt_base64 = true; err += ScanOptCoding64(optarg); break;
+ case GO_DB64: opt_db64 = true; err += ScanOptCoding64(optarg); break;
+ case GO_CODING: err += ScanOptCoding64(optarg); break;
+
case GO_ROUND: opt_round = true; break;
case GO_LONG: long_count++; break;
case GO_NO_HEADER: print_header = false; break;
@@ -1249,8 +1415,7 @@ static enumError CheckCommand ( int argc, char ** argv )
switch ((enumCommands)cmd_ct->id)
{
case CMD_VERSION: version_exit();
- case CMD_HELP: PrintHelp(&InfoUI_wkclt,stdout,0,"HELP",0,URI_HOME,
- first_param ? first_param->arg : 0 ); break;
+ case CMD_HELP: PrintHelpColor(&InfoUI_wkclt); break;
case CMD_CONFIG: err = cmd_config(); break;
case CMD_ARGTEST: err = cmd_argtest(argc,argv); break;
case CMD_TEST: err = cmd_test(); break;
@@ -1271,6 +1436,7 @@ static enumError CheckCommand ( int argc, char ** argv )
case CMD_ENCODE: err = cmd_convert(cmd_ct->id,"ENCODE","\1P/\1N\1?T"); break;
case CMD_COPY: err = cmd_copy(); break;
case CMD_CFF: err = cmd_cff(); break;
+ case CMD_TYPES: err = cmd_types(); break;
case CMD_FLAGS: err = cmd_flags(); break;
case CMD_DUMP: err = cmd_dump(0,CMD_DUMP); break;
case CMD_DBRIEF: err = cmd_dump(1,CMD_DUMP); break;
@@ -1279,6 +1445,7 @@ static enumError CheckCommand ( int argc, char ** argv )
case CMD_TRAVERSE: err = cmd_traverse(false); break;
case CMD_FALL: err = cmd_traverse(true); break;
case CMD_CHECK: err = cmd_check(); break;
+ case CMD_SHA1: err = cmd_sha1(); break;
case CMD_ANALYZE: err = cmd_analyze(); break;
case CMD_BLOW: err = cmd_blow(); break;