00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef SYMBIAN
00026
00027
00028 #include <string.h>
00029 #endif
00030
00031 #include <stdio.h>
00032 #include <stdlib.h>
00033 #if defined(__dos)
00034 #include <fcntl.h>
00035 #include <io.h>
00036 #endif
00037 #if defined(__CYGWIN__) || defined(__CYGMING__)
00038 # ifdef X_LOCALE
00039 # include <X11/Xlocale.h>
00040 # else
00041 # include <locale.h>
00042 # endif
00043 #else
00044 #include <locale.h>
00045 #endif
00046 #if defined(N_PLAT_NLM)
00047 #if !defined(_VA_LIST)
00048 #include "NW-only/nw_os.h"
00049 #endif
00050 #include "getopt.h"
00051 #endif
00052 #include "version.h"
00053 #include "antiword.h"
00054 #include <unistd.h>
00055
00056
00057 static const char *szTask = NULL;
00058
00059
00060 static void
00061 vUsage(void)
00062 {
00063 fprintf(stderr, "\tName: %s\n", szTask);
00064 fprintf(stderr, "\tPurpose: "PURPOSESTRING"\n");
00065 fprintf(stderr, "\tAuthor: "AUTHORSTRING"\n");
00066 fprintf(stderr, "\tVersion: "VERSIONSTRING);
00067 #if defined(__dos)
00068 fprintf(stderr, VERSIONSTRING2);
00069 #endif
00070 fprintf(stderr, "\n");
00071 fprintf(stderr, "\tStatus: "STATUSSTRING"\n");
00072 fprintf(stderr,
00073 "\tUsage: %s [switches] wordfile1 [wordfile2 ...]\n", szTask);
00074 fprintf(stderr,
00075 "\tSwitches: [-f|-t|-a papersize|-p papersize|-x dtd]"
00076 "[-m mapping][-w #][-i #][-Ls]\n");
00077 fprintf(stderr, "\t-f formatted text output\n");
00078 fprintf(stderr, "\t-t text output (default)\n");
00079 fprintf(stderr, "\t-a <paper size name> Adobe PDF output\n");
00080 fprintf(stderr, "\t-p <paper size name> PostScript output\n");
00081 fprintf(stderr, "\t paper size like: a4, letter or legal\n");
00082 fprintf(stderr, "\t-x <dtd> XML output\n");
00083 fprintf(stderr, "\t like: db (DocBook)\n");
00084 fprintf(stderr, "\t-m <mapping> character mapping file\n");
00085 fprintf(stderr, "\t-w <width> in characters of text output\n");
00086 fprintf(stderr, "\t-i <level> image level (PostScript only)\n");
00087 fprintf(stderr, "\t-L use landscape mode (PostScript only)\n");
00088 fprintf(stderr, "\t-r Show removed text\n");
00089 fprintf(stderr, "\t-s Show hidden (by Word) text\n");
00090 }
00091
00092
00093
00094
00095
00096
00097 static FILE *
00098 pStdin2TmpFile(long *lFilesize)
00099 {
00100 FILE *pTmpFile;
00101 size_t tSize;
00102 BOOL bFailure;
00103 UCHAR aucBytes[BUFSIZ];
00104
00105 DBG_MSG("pStdin2TmpFile");
00106
00107 fail(lFilesize == NULL);
00108
00109
00110 pTmpFile = tmpfile();
00111 if (pTmpFile == NULL) {
00112 return NULL;
00113 }
00114
00115 #if defined(__dos)
00116
00117 setmode(fileno(stdin), O_BINARY);
00118 #endif
00119
00120
00121 *lFilesize = 0;
00122 bFailure = TRUE;
00123 for (;;) {
00124 tSize = fread(aucBytes, 1, sizeof(aucBytes), stdin);
00125 if (tSize == 0) {
00126 bFailure = feof(stdin) == 0;
00127 break;
00128 }
00129 if (fwrite(aucBytes, 1, tSize, pTmpFile) != tSize) {
00130 bFailure = TRUE;
00131 break;
00132 }
00133 *lFilesize += (long)tSize;
00134 }
00135
00136 #if defined(__dos)
00137
00138 setmode(fileno(stdin), O_TEXT);
00139 #endif
00140
00141
00142 if (bFailure) {
00143 *lFilesize = 0;
00144 (void)fclose(pTmpFile);
00145 return NULL;
00146 }
00147 rewind(pTmpFile);
00148 return pTmpFile;
00149 }
00150
00151
00152
00153
00154
00155
00156 #ifndef SYMBIAN
00157 static BOOL
00158 bProcessFile(const char *szFilename )
00159 #else
00160 static BOOL
00161 bProcessFile(const char *szFilename, FILE *ofp)
00162 #endif
00163 {
00164 FILE *pFile;
00165 diagram_type *pDiag;
00166 long lFilesize;
00167 int iWordVersion;
00168 BOOL bResult;
00169
00170 fail(szFilename == NULL || szFilename[0] == '\0');
00171
00172 DBG_MSG(szFilename);
00173
00174 if (szFilename[0] == '-' && szFilename[1] == '\0') {
00175 pFile = pStdin2TmpFile(&lFilesize);
00176 if (pFile == NULL) {
00177 werr(0, "I can't save the standard input to a file");
00178 return FALSE;
00179 }
00180 } else {
00181 pFile = fopen(szFilename, "rb");
00182 if (pFile == NULL) {
00183 werr(0, "I can't open '%s' for reading", szFilename);
00184 return FALSE;
00185 }
00186
00187 lFilesize = lGetFilesize(szFilename);
00188 if (lFilesize < 0) {
00189 (void)fclose(pFile);
00190 werr(0, "I can't get the size of '%s'", szFilename);
00191 return FALSE;
00192 }
00193 }
00194
00195 iWordVersion = iGuessVersionNumber(pFile, lFilesize);
00196 if (iWordVersion < 0 || iWordVersion == 3) {
00197 if (bIsRtfFile(pFile)) {
00198 werr(0, "%s is not a Word Document."
00199 " It is probably a Rich Text Format file",
00200 szFilename);
00201 } if (bIsWordPerfectFile(pFile)) {
00202 werr(0, "%s is not a Word Document."
00203 " It is probably a Word Perfect file",
00204 szFilename);
00205 } else {
00206 #if defined(__dos)
00207 werr(0, "%s is not a Word Document or the filename"
00208 " is not in the 8+3 format.", szFilename);
00209 #else
00210 werr(0, "%s is not a Word Document.", szFilename);
00211 #endif
00212 }
00213 (void)fclose(pFile);
00214 return FALSE;
00215 }
00216
00217 rewind(pFile);
00218
00219 #ifndef SYMBIAN
00220 pDiag = pCreateDiagram(szTask, szFilename);
00221 #else
00222 pDiag = pCreateDiagram(szTask, szFilename, ofp );
00223 #endif
00224 if (pDiag == NULL) {
00225 (void)fclose(pFile);
00226 return FALSE;
00227 }
00228
00229 bResult = bWordDecryptor(pFile, lFilesize, pDiag);
00230 vDestroyDiagram(pDiag);
00231
00232 (void)fclose(pFile);
00233 return bResult;
00234 }
00235
00236
00237 #ifdef SYMBIAN
00238 int fillArg( char **argv, char *inpStr)
00239 {
00240 int count =0;
00241 const char *search = " ";
00242
00243 char *token = strtok( inpStr, search);
00244 argv[0] = token;
00245 count = 1;
00246 while( token != NULL )
00247 {
00248 token = strtok( NULL, search);
00249 argv[count++] = token;
00250 }
00251 return count-1;
00252 }
00253 #endif
00254 int
00255 main(int argc, char **argv)
00256 {
00257 #ifdef SYMBIAN
00258 FILE *ofp = NULL;
00259 char *buf;
00260 #endif
00261
00262 options_type tOptions;
00263 const char *szWordfile;
00264 int iFirst, iIndex, iGoodCount;
00265 BOOL bUsage, bMultiple, bUseTXT, bUseXML;
00266
00267 if (argc <= 0) {
00268 return EXIT_FAILURE;
00269 }
00270
00271 #ifdef SYMBIAN
00272
00273
00274 buf = (char *)malloc(FILENAME_MAX);
00275
00276 getcwd(buf, FILENAME_MAX);
00277 #ifndef __WINS__
00278
00279 buf[0] = argv[0][0];
00280 #endif
00281
00282 strcat(buf, "\\Resources\\");
00283 if (setenv("HOME", buf, 1) != 0) {
00284 return EXIT_FAILURE;
00285 }
00286 free(buf);
00287 #endif
00288
00289 szTask = szBasename(argv[0]);
00290
00291 if (argc <= 1) {
00292 #ifdef SYMBIAN
00293 char* inpStr = (char*) malloc(_POSIX_ARG_MAX);
00294
00295 vUsage();
00296
00297 fprintf(stdout, "\n\nEnter the input Command String:");
00298 fgets( inpStr, _POSIX_ARG_MAX, stdin );
00299
00300 argc = fillArg( argv, inpStr);
00301
00302 if ( strcasecmp ( "antiword", argv[0]))
00303 {
00304 fprintf(stdout, "\nInvalid command syntax, Please read the syntax properly\n\n\n");
00305 bUsage = TRUE;
00306 getchar();
00307 }
00308 else
00309 {
00310 iFirst = iReadOptions(argc, argv);
00311 bUsage = iFirst <= 0;
00312 }
00313 #else
00314 bUsage = TRUE;
00315 iFirst = 1;
00316 free(inputStr);
00317 #endif
00318 } else {
00319 iFirst = iReadOptions(argc, argv);
00320 bUsage = iFirst <= 0;
00321 }
00322 if (bUsage) {
00323 vUsage();
00324 #ifdef SYMBIAN
00325 getchar();
00326 #endif
00327 return iFirst < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
00328 }
00329
00330 #if defined(N_PLAT_NLM) && !defined(_VA_LIST)
00331 nwinit();
00332 #endif
00333
00334 vGetOptions(&tOptions);
00335
00336 #if !defined(__dos)
00337 if (is_locale_utf8()) {
00338 #if defined(__STDC_ISO_10646__)
00339
00340
00341
00342
00343 if (tOptions.eEncoding == encoding_utf_8) {
00344 if (setlocale(LC_CTYPE, "") == NULL) {
00345 werr(1, "Can't set the UTF-8 locale! "
00346 "Check LANG, LC_CTYPE, LC_ALL.");
00347 }
00348 DBG_MSG("The UTF-8 locale has been set");
00349 } else {
00350 (void)setlocale(LC_CTYPE, "C");
00351 }
00352 #endif
00353 } else {
00354 if (setlocale(LC_CTYPE, "") == NULL) {
00355 werr(0, "Can't set the locale! Will use defaults");
00356 (void)setlocale(LC_CTYPE, "C");
00357 }
00358 DBG_MSG("The locale has been set");
00359 }
00360 #endif
00361
00362 bMultiple = argc - iFirst > 1;
00363 bUseTXT = tOptions.eConversionType == conversion_text ||
00364 tOptions.eConversionType == conversion_fmt_text;
00365 bUseXML = tOptions.eConversionType == conversion_xml;
00366 iGoodCount = 0;
00367
00368 #if defined(__dos)
00369 if (tOptions.eConversionType == conversion_pdf) {
00370
00371 setmode(fileno(stdout), O_BINARY);
00372 }
00373 #endif
00374
00375 if (bUseXML) {
00376 fprintf(stdout,
00377 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
00378 "<!DOCTYPE %s PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\"\n"
00379 "\t\"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">\n",
00380 bMultiple ? "set" : "book");
00381 if (bMultiple) {
00382 fprintf(stdout, "<set>\n");
00383 }
00384 }
00385
00386
00387 #ifdef SYMBIAN
00388 ofp = fopen( argv[argc-1], "w");
00389 if ( ofp == NULL)
00390 {
00391 printf("Unable to open the output file: %s\n",argv[argc-1]);
00392 exit(0);
00393 }
00394 #endif
00395
00396 for (iIndex = iFirst; iIndex < argc-1; iIndex++) {
00397 if (bMultiple && bUseTXT) {
00398 szWordfile = szBasename(argv[iIndex]);
00399 fprintf(stdout, "::::::::::::::\n");
00400 fprintf(stdout, "%s\n", szWordfile);
00401 fprintf(stdout, "::::::::::::::\n");
00402 }
00403 #ifndef SYMBIAN
00404 if (bProcessFile(argv[iIndex])) {
00405 #else
00406 if (bProcessFile(argv[iIndex],ofp )) {
00407 #endif
00408
00409 iGoodCount++;
00410 }
00411 }
00412
00413 if (bMultiple && bUseXML) {
00414 fprintf(stdout, "</set>\n");
00415 }
00416
00417 DBG_DEC(iGoodCount);
00418 #ifdef SYMBIAN
00419 fclose(ofp);
00420 fprintf(stdout, "\n\nConversion is successful!!, check out this file : %s\n", argv[argc-1]);
00421 getchar();
00422 #endif
00423
00424 return iGoodCount <= 0 ? EXIT_FAILURE : EXIT_SUCCESS;
00425 }