Changeset 218
- Timestamp:
- Apr 2, 2017, 11:34:55 AM (8 years ago)
- Location:
- trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/ufat32/ufat32.c ¶
r211 r218 10 10 int recover(int argc, char *argv[], char *envp[]); 11 11 int sys(int argc, char *argv[], char *envp[]); 12 13 BOOL LoadTranslateTable(BOOL fSilent, UCHAR ucSource); 12 14 13 15 void cleanup(void); … … 128 130 } 129 131 132 BOOL _Far16 _Pascal _loadds LOADTRANSTBL(BOOL fSilent, UCHAR ucSource) 133 { 134 return LoadTranslateTable(fSilent, ucSource); 135 } 136 130 137 #define SIG_CTRLC 1 131 138 #define SIG_BROKENPIPE 2 -
TabularUnified trunk/src/ufat32/unicode.c ¶
r193 r218 26 26 27 27 extern F32PARMS f32Parms; 28 29 USHORT _Far16 _Pascal _loadds GETSHRSEG(PVOID16 *p); 28 30 29 31 int (* CALLCONV pUniCreateUconvObject)(UniChar * code_set, UconvObject * uobj); … … 176 178 * 177 179 ******************************************************************/ 178 BOOL LoadTranslateTable(BOOL fSilent )180 BOOL LoadTranslateTable(BOOL fSilent, UCHAR ucSource) 179 181 { 180 182 APIRET rc; … … 434 436 } 435 437 436 ulParmSize = sizeof rgTransTable; 437 if( !TranslateInit((PVOID)rgTransTable, ulParmSize)) 438 rc = ERROR_INVALID_PARAMETER; 439 else 440 rc = 0; 438 switch (ucSource) 439 { 440 case 0: 441 { 442 // called from CHKDSK or IFS init routine 443 ulParmSize = sizeof rgTransTable; 444 if( !TranslateInit((PVOID)rgTransTable, ulParmSize) ) 445 rc = ERROR_INVALID_PARAMETER; 446 else 447 rc = 0; 448 } 449 break; 450 451 case 1: 452 { 453 // called from cachef32.exe 454 ulParmSize = sizeof rgTransTable; 455 rc = DosFSCtl(NULL, 0, NULL, 456 ( PVOID )rgTransTable, ulParmSize, &ulParmSize, 457 FAT32_SETTRANSTABLE, "FAT32", -1, FSCTL_FSDNAME); 458 } 459 break; 460 #ifdef __DLL__ 461 case 2: 462 { 463 // called from IFS init 464 PVOID16 p; 465 ulParmSize = sizeof rgTransTable; 466 if( !GETSHRSEG(&p) ) 467 rc = ERROR_INVALID_PARAMETER; 468 else 469 { 470 rc = 0; 471 memcpy((PVOID)p, (PVOID)rgTransTable, ulParmSize); 472 } 473 } 474 #endif 475 } 441 476 442 477 if (rc) … … 494 529 void CodepageConvInit(BOOL fSilent) 495 530 { 496 LoadTranslateTable(fSilent );531 LoadTranslateTable(fSilent, FALSE); 497 532 TranslateInitDBCSEnv(); 498 533 CaseConversionInit(); -
TabularUnified trunk/src/util/cachef32.c ¶
r136 r218 6 6 #include <stdarg.h> 7 7 #include <ctype.h> 8 #include <uconv.h>9 8 #include <process.h> 10 9 … … 24 23 #define SHAREMEM "\\SHAREMEM\\CACHEF32" 25 24 26 int (* CALLCONV pUniCreateUconvObject)(UniChar * code_set, UconvObject * uobj);27 int (* CALLCONV pUniUconvToUcs)(28 UconvObject uobj, /* I - Uconv object handle */29 void * * inbuf, /* IO - Input buffer */30 size_t * inbytes, /* IO - Input buffer size (bytes) */31 UniChar * * outbuf, /* IO - Output buffer size */32 size_t * outchars, /* IO - Output size (chars) */33 size_t * subst ); /* IO - Substitution count */34 int (* CALLCONV pUniUconvFromUcs)(35 UconvObject uobj,36 UniChar * * inbuf,37 size_t * inchars,38 void * * outbuf,39 size_t * outbytes,40 size_t * subst );41 int (* CALLCONV pUniMapCpToUcsCp)( ULONG ulCp, UniChar *ucsCp, size_t n );42 UniChar (* CALLCONV pUniTolower )( UniChar uin );43 int (* CALLCONV pUniQueryUconvObject )44 (UconvObject uobj, uconv_attribute_t *attr, size_t size, char first[256], char other[256], udcrange_t udcrange[32]);45 46 HMODULE hModConv = 0;47 HMODULE hModUni = 0;48 49 25 PRIVATE VOID Handler(INT iSignal); 50 26 PRIVATE VOID InitProg(INT iArgc, PSZ rgArgv[]); … … 66 42 PRIVATE VOID ShowRASectors(VOID); 67 43 PRIVATE BOOL SetRASectors(PSZ pszArg); 68 PRIVATE BOOL LoadTranslateTable(VOID);69 44 PRIVATE void WriteLogMessage(PSZ pszMessage); 45 46 BOOL (*pLoadTranslateTable)(BOOL fSilent, UCHAR ucSource); 47 48 HMODULE hMod = 0; 70 49 71 50 static PSZ rgPriority[]= … … 247 226 ULONG ulParmSize; 248 227 BOOL fSetParms = FALSE; 228 BYTE rgData[ 256 ]; 249 229 ULONG ulParm; 250 230 … … 259 239 } 260 240 } 241 242 rc = DosLoadModule(rgData, sizeof(rgData), "UFAT32.DLL", &hMod); 243 if (rc) 244 { 245 printf("FAT32: Utility DLL not found (%s does not load).\n", rgData); 246 printf("FAT32: No UNICODE translate table loaded!\n"); 247 return; 248 } 249 rc = DosQueryProcAddr(hMod, 0L, 250 "LoadTranslateTable", (PFN *)&pLoadTranslateTable); 251 if (rc) 252 { 253 printf("FAT32: ERROR: Could not find address of LoadTranslateTable.\n"); 254 return; 255 } 261 256 262 257 /* … … 501 496 } 502 497 503 if ( fForeGround && LoadTranslateTable()) 504 fSetParms = TRUE; 498 if ( fForeGround && (*pLoadTranslateTable)(FALSE, TRUE)) 499 fSetParms = TRUE; 500 501 if( hMod ) 502 DosFreeModule(hMod); 505 503 506 504 if (fSetParms) … … 931 929 } 932 930 933 #define MAX_TRANS_TABLE 0x100934 #define ARRAY_TRANS_TABLE ( 0x10000 / MAX_TRANS_TABLE )935 936 #define INDEX_OF_START MAX_TRANS_TABLE937 #define INDEX_OF_FIRSTINFO MAX_TRANS_TABLE938 #define INDEX_OF_LCASECONV ( MAX_TRANS_TABLE + 1 )939 #define INDEX_OF_END INDEX_OF_LCASECONV940 #define EXTRA_ELEMENT ( INDEX_OF_END - INDEX_OF_START + 1 )941 942 BOOL LoadTranslateTable(VOID)943 {944 APIRET rc;945 ULONG ulParmSize;946 BYTE rgData[ 256 ];947 // Extra space for DBCS lead info and case conversion948 UniChar *rgTranslate[ MAX_TRANS_TABLE + EXTRA_ELEMENT ] = { NULL, };949 PBYTE pChar;950 UniChar *pUni;951 UconvObject uconv_object = NULL;952 INT iIndex;953 size_t bytes_left;954 size_t uni_chars_left;955 size_t num_subs;956 ULONG rgCP[3];957 ULONG cbCP;958 // Extra space for DBCS lead info and case conversion959 PVOID16 rgTransTable[ MAX_TRANS_TABLE + EXTRA_ELEMENT ] = { NULL, };960 char rgFirst[ 256 ];961 USHORT first, second;962 USHORT usCode;963 UniChar ucsCp[ 12 ];964 UniChar rgUniBuffer[ ARRAY_TRANS_TABLE ];965 966 rc = DosLoadModule(rgData, sizeof rgData, "UCONV.DLL", &hModConv);967 if (rc)968 {969 printf("No NLS support found (%s does not load).\n", rgData);970 printf("No UNICODE translate table loaded!\n");971 rc = TRUE;972 goto free_exit;973 }974 rc = DosQueryProcAddr(hModConv, 0L,975 "UniCreateUconvObject", (PFN *)&pUniCreateUconvObject);976 if (rc)977 {978 printf("ERROR: Could not find address of UniCreateUconvObject.\n");979 rc = FALSE;980 goto free_exit;981 }982 rc = DosQueryProcAddr(hModConv, 0L,983 "UniUconvToUcs", (PFN *)&pUniUconvToUcs);984 if (rc)985 {986 printf("ERROR: Could not find address of UniUconvToUcs.\n");987 rc = FALSE;988 goto free_exit;989 }990 991 rc = DosQueryProcAddr(hModConv, 0L,992 "UniUconvFromUcs", (PFN *)&pUniUconvFromUcs);993 if (rc)994 {995 printf("ERROR: Could not find address of UniUconvFromUcs.\n");996 rc = FALSE;997 goto free_exit;998 }999 1000 rc = DosQueryProcAddr(hModConv, 0L,1001 "UniMapCpToUcsCp", (PFN *)&pUniMapCpToUcsCp);1002 if (rc)1003 {1004 printf("ERROR: Could not find address of UniMapCpToUcsCp.\n");1005 rc = FALSE;1006 goto free_exit;1007 }1008 1009 rc = DosQueryProcAddr(hModConv, 0L,1010 "UniQueryUconvObject", (PFN *)&pUniQueryUconvObject);1011 if (rc)1012 {1013 printf("ERROR: Could not find address of UniQueryUconvObject.\n");1014 rc = FALSE;1015 goto free_exit;1016 }1017 1018 rc = DosLoadModule(rgData, sizeof rgData, "LIBUNI.DLL", &hModUni);1019 if (rc)1020 {1021 printf("No NLS support found (%s does not load).\n", rgData);1022 printf("No UNICODE translate table loaded!\n");1023 rc = TRUE;1024 goto free_exit;1025 }1026 1027 rc = DosQueryProcAddr(hModUni, 0L,1028 "UniTolower", (PFN *)&pUniTolower);1029 if (rc)1030 {1031 printf("ERROR: Could not find address of UniTolower.\n");1032 rc = FALSE;1033 goto free_exit;1034 }1035 1036 if( ulNewCP )1037 rgCP[ 0 ] = ulNewCP;1038 else1039 DosQueryCp(sizeof rgCP, rgCP, &cbCP);1040 1041 if (f32Parms.ulCurCP == rgCP[0])1042 {1043 rc = FALSE;1044 goto free_exit;1045 }1046 1047 if (f32Parms.ulCurCP && !fSayYes)1048 {1049 BYTE chChar;1050 printf("Loaded unicode translate table is for CP %lu\n", f32Parms.ulCurCP);1051 printf("Current CP is %lu\n", rgCP[0]);1052 printf("Would you like to reload the translate table for this CP [Y/N]? ");1053 fflush(stdout);1054 1055 for (;;)1056 {1057 chChar = getch();1058 switch (chChar)1059 {1060 case 'y':1061 case 'Y':1062 chChar = 'Y';1063 break;1064 case 'n':1065 case 'N':1066 chChar = 'N';1067 break;1068 default :1069 DosBeep(660, 10);1070 continue;1071 }1072 printf("%c\n", chChar);1073 break;1074 }1075 if (chChar == 'N')1076 {1077 rc = FALSE;1078 goto free_exit;1079 }1080 }1081 1082 rc = pUniMapCpToUcsCp( rgCP[ 0 ], ucsCp, sizeof( ucsCp ) / sizeof( UniChar ));1083 if( rc != ULS_SUCCESS )1084 {1085 printf("UniMapCpToUcsCp error: return code = %u\n", rc );1086 rc = FALSE;1087 goto free_exit;1088 }1089 1090 rc = pUniCreateUconvObject( ucsCp, &uconv_object);1091 if (rc != ULS_SUCCESS)1092 {1093 printf("UniCreateUconvObject error: return code = %u\n", rc);1094 rc = FALSE;1095 goto free_exit;1096 }1097 1098 rc = pUniQueryUconvObject( uconv_object, NULL, 0, rgFirst, NULL, NULL );1099 if (rc != ULS_SUCCESS)1100 {1101 printf("UniQueryUConvObject error: return code = %u\n", rc);1102 rc = FALSE;1103 goto free_exit;1104 }1105 1106 // Allocation for conversion, DBCS lead info and case conversion1107 for( iIndex = 0; iIndex <= INDEX_OF_END ; iIndex ++ )1108 {1109 rgTransTable[ iIndex ] = rgTranslate[ iIndex ] = malloc( sizeof(USHORT ) * ARRAY_TRANS_TABLE );1110 memset( rgTranslate[ iIndex ], 0, sizeof( USHORT ) * ARRAY_TRANS_TABLE );1111 }1112 1113 // Initialize SBCS only for conversion and set DBCS lead info1114 for( iIndex = 0; iIndex < ARRAY_TRANS_TABLE; iIndex++ )1115 {1116 rgData[ iIndex ] = ( rgFirst[ iIndex ] == 1 ) ? iIndex : 0;1117 rgTranslate[ INDEX_OF_FIRSTINFO ][ iIndex ] = rgFirst[ iIndex ];1118 }1119 1120 pChar = rgData;1121 bytes_left = sizeof rgData;1122 pUni = ( PVOID )rgTranslate[ 0 ];1123 uni_chars_left = ARRAY_TRANS_TABLE;1124 1125 rc = pUniUconvToUcs(uconv_object,1126 (PVOID *)&pChar,1127 &bytes_left,1128 &pUni,1129 &uni_chars_left,1130 &num_subs);1131 1132 if (rc != ULS_SUCCESS)1133 {1134 printf("UniUconvToUcs failed, rc = %u\n", rc);1135 rc = FALSE;1136 goto free_exit;1137 }1138 1139 // Translate upper case to lower case1140 for( iIndex = 0; iIndex < ARRAY_TRANS_TABLE; iIndex++ )1141 rgUniBuffer[ iIndex ] = pUniTolower( rgTranslate[ 0 ][ iIndex ] );1142 1143 // Convert lower case in Unicode to codepage code1144 pUni = ( PVOID )rgUniBuffer;1145 uni_chars_left = ARRAY_TRANS_TABLE;1146 pChar = rgData;1147 bytes_left = sizeof rgData;1148 1149 rc = pUniUconvFromUcs( uconv_object,1150 &pUni,1151 &uni_chars_left,1152 ( PVOID * )&pChar,1153 &bytes_left,1154 &num_subs );1155 1156 if (rc != ULS_SUCCESS)1157 {1158 printf("UniUconvFromUcs failed, rc = %u\n", rc);1159 rc = FALSE;1160 goto free_exit;1161 }1162 1163 // Store codepage code to transtable1164 for( iIndex = 0; iIndex < ARRAY_TRANS_TABLE; iIndex++ )1165 rgTranslate[ INDEX_OF_LCASECONV ][ iIndex ] = rgData[ iIndex ] ? rgData[ iIndex ] : iIndex;1166 1167 // Translate DBCS code to unicode1168 for( first = 0; first < ARRAY_TRANS_TABLE; first++ )1169 {1170 if( rgFirst[ first ] == 2 )1171 {1172 for( second = 0; second < 0x100; second++ )1173 {1174 usCode = first | (( second << 8 ) & 0xFF00 );1175 1176 pChar = ( PVOID )&usCode;1177 bytes_left = sizeof usCode;1178 pUni = ( PVOID )&rgTranslate[ second ][ first ];1179 uni_chars_left = 1;1180 1181 rc = pUniUconvToUcs(uconv_object,1182 (PVOID *)&pChar,1183 &bytes_left,1184 &pUni,1185 &uni_chars_left,1186 &num_subs);1187 1188 if (rc != ULS_SUCCESS)1189 {1190 printf("UniUconvToUcs failed, rc = %u\n", rc);1191 rc = FALSE;1192 goto free_exit;1193 }1194 }1195 }1196 }1197 1198 ulParmSize = sizeof rgTransTable;1199 rc = DosFSCtl(NULL, 0, NULL,1200 ( PVOID )rgTransTable, ulParmSize, &ulParmSize,1201 FAT32_SETTRANSTABLE, "FAT32", -1, FSCTL_FSDNAME);1202 if (rc)1203 {1204 printf("Unable to set translate table for current Codepage.\n");1205 rc = FALSE;1206 goto free_exit;1207 }1208 1209 f32Parms.ulCurCP = rgCP[0];1210 if( !fSilent )1211 printf("Unicode translate table for CP %lu loaded.\n", rgCP[0]);1212 rc = TRUE;1213 free_exit:1214 1215 for( iIndex = 0; iIndex <= INDEX_OF_END; iIndex++ )1216 if( rgTranslate[ iIndex ])1217 free( rgTranslate[ iIndex ]);1218 1219 if( hModConv )1220 DosFreeModule( hModConv);1221 1222 if( hModUni )1223 DosFreeModule( hModUni );1224 1225 return rc;1226 }1227 1228 931 void WriteLogMessage(PSZ pszMessage) 1229 932 {
Note:
See TracChangeset
for help on using the changeset viewer.