Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(314)

Side by Side Diff: fpdfsdk/javascript/util.cpp

Issue 1837543002: Added test for util.printx() and make it match spec. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Need wchar in one more place. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/javascript/util.h ('k') | testing/resources/javascript/util_printx.in » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "fpdfsdk/javascript/util.h" 7 #include "fpdfsdk/javascript/util.h"
8 8
9 #include <time.h> 9 #include <time.h>
10 10
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 302
303 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSTYPEERROR); 303 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSTYPEERROR);
304 return FALSE; 304 return FALSE;
305 } 305 }
306 306
307 307
308 FX_BOOL util::printx(IJS_Context* cc, 308 FX_BOOL util::printx(IJS_Context* cc,
309 const std::vector<CJS_Value>& params, 309 const std::vector<CJS_Value>& params,
310 CJS_Value& vRet, 310 CJS_Value& vRet,
311 CFX_WideString& sError) { 311 CFX_WideString& sError) {
312 int iSize = params.size(); 312 if (params.size() < 2) {
313 if (iSize < 2) 313 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
314 return FALSE; 314 return FALSE;
315 CFX_WideString sFormat = params[0].ToCFXWideString(); 315 }
316 CFX_WideString sSource = params[1].ToCFXWideString(); 316 vRet = printx(params[0].ToCFXWideString(), params[1].ToCFXWideString());
317 std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str();
318 std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str();
319 std::string cDest;
320 printx(cFormat, cSource, cDest);
321 vRet = cDest.c_str();
322 return TRUE; 317 return TRUE;
323 } 318 }
324 319
325 void util::printx(const std::string& cFormat, 320 enum CaseMode { kPreserveCase, kUpperCase, kLowerCase };
326 const std::string& cSource2, 321
327 std::string& cPurpose) { 322 static FX_WCHAR TranslateCase(FX_WCHAR input, CaseMode eMode) {
328 std::string cSource(cSource2); 323 if (eMode == kLowerCase && input >= 'A' && input <= 'Z')
329 if (!cPurpose.empty()) 324 return input | 0x20;
330 // cPurpose.clear(); 325 if (eMode == kUpperCase && input >= 'a' && input <= 'z')
331 cPurpose.erase(); 326 return input & ~0x20;
332 int itSource = 0; 327 return input;
333 int iSize = cSource.size(); 328 }
334 for (int iIndex = 0; iIndex < (int)cFormat.size() && itSource < iSize; 329
335 iIndex++) { 330 CFX_WideString util::printx(const CFX_WideString& wsFormat,
336 char letter = cFormat[iIndex]; 331 const CFX_WideString& wsSource) {
337 switch (letter) { 332 CFX_WideString wsResult;
338 case '?': 333 FX_STRSIZE iSourceIdx = 0;
339 cPurpose += cSource[itSource]; 334 FX_STRSIZE iFormatIdx = 0;
340 itSource++; 335 CaseMode eCaseMode = kPreserveCase;
341 break; 336 bool bEscaped = false;
337 while (iFormatIdx < wsFormat.GetLength()) {
338 if (bEscaped) {
339 bEscaped = false;
340 wsResult += wsFormat[iFormatIdx];
341 ++iFormatIdx;
342 continue;
343 }
344 switch (wsFormat[iFormatIdx]) {
345 case '\\': {
346 bEscaped = true;
347 ++iFormatIdx;
348 } break;
349 case '<': {
350 eCaseMode = kLowerCase;
351 ++iFormatIdx;
352 } break;
353 case '>': {
354 eCaseMode = kUpperCase;
355 ++iFormatIdx;
356 } break;
357 case '=': {
358 eCaseMode = kPreserveCase;
359 ++iFormatIdx;
360 } break;
361 case '?': {
362 if (iSourceIdx < wsSource.GetLength()) {
363 wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode);
364 ++iSourceIdx;
365 }
366 ++iFormatIdx;
367 } break;
342 case 'X': { 368 case 'X': {
343 while (itSource < iSize) { 369 if (iSourceIdx < wsSource.GetLength()) {
344 if (std::isdigit(cSource[itSource]) || 370 if ((wsSource[iSourceIdx] >= '0' && wsSource[iSourceIdx] <= '9') ||
345 (cSource[itSource] >= 'a' && cSource[itSource] <= 'z') || 371 (wsSource[iSourceIdx] >= 'a' && wsSource[iSourceIdx] <= 'z') ||
346 (cSource[itSource] >= 'A' && cSource[itSource] <= 'Z')) { 372 (wsSource[iSourceIdx] >= 'A' && wsSource[iSourceIdx] <= 'Z')) {
347 cPurpose += cSource[itSource]; 373 wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode);
348 itSource++; 374 ++iFormatIdx;
349 break;
350 } 375 }
351 itSource++; 376 ++iSourceIdx;
377 } else {
378 ++iFormatIdx;
352 } 379 }
353 break;
354 } break; 380 } break;
355 case 'A': { 381 case 'A': {
356 while (itSource < iSize) { 382 if (iSourceIdx < wsSource.GetLength()) {
357 if ((cSource[itSource] >= 'a' && cSource[itSource] <= 'z') || 383 if ((wsSource[iSourceIdx] >= 'a' && wsSource[iSourceIdx] <= 'z') ||
358 (cSource[itSource] >= 'A' && cSource[itSource] <= 'Z')) { 384 (wsSource[iSourceIdx] >= 'A' && wsSource[iSourceIdx] <= 'Z')) {
359 cPurpose += cSource[itSource]; 385 wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode);
360 itSource++; 386 ++iFormatIdx;
361 break;
362 } 387 }
363 itSource++; 388 ++iSourceIdx;
389 } else {
390 ++iFormatIdx;
364 } 391 }
365 break;
366 } break; 392 } break;
367 case '9': { 393 case '9': {
368 while (itSource < iSize) { 394 if (iSourceIdx < wsSource.GetLength()) {
369 if (std::isdigit(cSource[itSource])) { 395 if (wsSource[iSourceIdx] >= '0' && wsSource[iSourceIdx] <= '9') {
370 cPurpose += cSource[itSource]; 396 wsResult += wsSource[iSourceIdx];
371 itSource++; 397 ++iFormatIdx;
372 break;
373 } 398 }
374 itSource++; 399 ++iSourceIdx;
400 } else {
401 ++iFormatIdx;
375 } 402 }
376 break; 403 } break;
377 }
378 case '*': { 404 case '*': {
379 cPurpose.append(cSource, itSource, iSize - itSource); 405 if (iSourceIdx < wsSource.GetLength()) {
380 itSource = iSize - 1; 406 wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode);
381 break; 407 ++iSourceIdx;
382 } 408 } else {
383 case '\\': 409 ++iFormatIdx;
384 break; 410 }
385 case '>': { 411 } break;
386 for (char& c : cSource) 412 default: {
387 c = toupper(c); 413 wsResult += wsFormat[iFormatIdx];
388 break; 414 ++iFormatIdx;
389 } 415 } break;
390 case '<': {
391 for (char& c : cSource)
392 c = tolower(c);
393 break;
394 }
395 case '=':
396 break;
397 default:
398 cPurpose += letter;
399 break;
400 } 416 }
401 } 417 }
418 return wsResult;
402 } 419 }
403 420
404 FX_BOOL util::scand(IJS_Context* cc, 421 FX_BOOL util::scand(IJS_Context* cc,
405 const std::vector<CJS_Value>& params, 422 const std::vector<CJS_Value>& params,
406 CJS_Value& vRet, 423 CJS_Value& vRet,
407 CFX_WideString& sError) { 424 CFX_WideString& sError) {
408 int iSize = params.size(); 425 int iSize = params.size();
409 if (iSize < 2) 426 if (iSize < 2)
410 return FALSE; 427 return FALSE;
411 428
(...skipping 20 matching lines...) Expand all
432 int iSize = params.size(); 449 int iSize = params.size();
433 if (iSize == 0) 450 if (iSize == 0)
434 return FALSE; 451 return FALSE;
435 int nByte = params[0].ToInt(); 452 int nByte = params[0].ToInt();
436 unsigned char cByte = (unsigned char)nByte; 453 unsigned char cByte = (unsigned char)nByte;
437 CFX_WideString csValue; 454 CFX_WideString csValue;
438 csValue.Format(L"%c", cByte); 455 csValue.Format(L"%c", cByte);
439 vRet = csValue.c_str(); 456 vRet = csValue.c_str();
440 return TRUE; 457 return TRUE;
441 } 458 }
OLDNEW
« no previous file with comments | « fpdfsdk/javascript/util.h ('k') | testing/resources/javascript/util_printx.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698