--------------------------------------------------------------------------*/
| 2541 | |
| 2542 | /*--------------------------------------------------------------------------*/ |
| 2543 | static cmListFileLexer_BOM cmListFileLexer_ReadBOM(FILE* f) |
| 2544 | { |
| 2545 | unsigned char b[2]; |
| 2546 | if (fread(b, 1, 2, f) == 2) { |
| 2547 | if (b[0] == 0xEF && b[1] == 0xBB) { |
| 2548 | if (fread(b, 1, 1, f) == 1 && b[0] == 0xBF) { |
| 2549 | return cmListFileLexer_BOM_UTF8; |
| 2550 | } |
| 2551 | } else if (b[0] == 0xFE && b[1] == 0xFF) { |
| 2552 | /* UTF-16 BE */ |
| 2553 | return cmListFileLexer_BOM_UTF16BE; |
| 2554 | } else if (b[0] == 0 && b[1] == 0) { |
| 2555 | if (fread(b, 1, 2, f) == 2 && b[0] == 0xFE && b[1] == 0xFF) { |
| 2556 | return cmListFileLexer_BOM_UTF32BE; |
| 2557 | } |
| 2558 | } else if (b[0] == 0xFF && b[1] == 0xFE) { |
| 2559 | fpos_t p; |
| 2560 | fgetpos(f, &p); |
| 2561 | if (fread(b, 1, 2, f) == 2 && b[0] == 0 && b[1] == 0) { |
| 2562 | return cmListFileLexer_BOM_UTF32LE; |
| 2563 | } |
| 2564 | if (fsetpos(f, &p) != 0) { |
| 2565 | return cmListFileLexer_BOM_Broken; |
| 2566 | } |
| 2567 | return cmListFileLexer_BOM_UTF16LE; |
| 2568 | } |
| 2569 | } |
| 2570 | if (fseek(f, 0, SEEK_SET) != 0) { |
| 2571 | return cmListFileLexer_BOM_Broken; |
| 2572 | } |
| 2573 | return cmListFileLexer_BOM_None; |
| 2574 | } |
| 2575 | |
| 2576 | /*--------------------------------------------------------------------------*/ |
| 2577 | int cmListFileLexer_SetFileName(cmListFileLexer* lexer, const char* name, |
no outgoing calls
no test coverage detected