+void print_messages_info(const CFlag *pFlag, const char *infile, const char *progname)
+{
+ if (pFlag->status & NO_REGFILE) {
+ if (pFlag->verbose) {
+ fprintf(stderr,"%s: ",progname);
+ fprintf(stderr, _("Skipping %s, not a regular file.\n"), infile);
+ }
+ } else if (pFlag->status & INPUT_TARGET_NO_REGFILE) {
+ if (pFlag->verbose) {
+ fprintf(stderr,"%s: ",progname);
+ fprintf(stderr, _("Skipping symbolic link %s, target is not a regular file.\n"), infile);
+ }
+ } else if (pFlag->status & WCHAR_T_TOO_SMALL) {
+ if (pFlag->verbose) {
+ fprintf(stderr,"%s: ",progname);
+ fprintf(stderr, _("Skipping UTF-16 file %s, the size of wchar_t is %d bytes.\n"), infile, (int)sizeof(wchar_t));
+ }
+ }
+}
+
+#ifdef D2U_UNICODE
+void FileInfoW(FILE* ipInF, CFlag *ipFlag, const char *filename)
+{
+ wint_t TempChar;
+ wint_t PreviousChar = 0;
+ unsigned int lb_dos = 0;
+ unsigned int lb_unix = 0;
+ unsigned int lb_mac = 0;
+
+ ipFlag->status = 0;
+
+ while ((TempChar = d2u_getwc(ipInF, ipFlag->bomtype)) != WEOF) {
+ if ( (TempChar < 32) &&
+ (TempChar != 0x0a) && /* Not an LF */
+ (TempChar != 0x0d) && /* Not a CR */
+ (TempChar != 0x09) && /* Not a TAB */
+ (TempChar != 0x0c)) { /* Not a form feed */
+ ipFlag->status |= BINARY_FILE ;
+ }
+ if (TempChar != 0x0a) { /* Not an LF */
+ PreviousChar = TempChar;
+ if (TempChar == 0x0d) /* CR */
+ lb_mac++;
+ } else{
+ /* TempChar is an LF */
+ if ( PreviousChar == 0x0d ) { /* CR,LF pair. */
+ lb_dos++;
+ lb_mac--;
+ PreviousChar = TempChar;
+ continue;
+ }
+ PreviousChar = TempChar;
+ lb_unix++; /* Unix line end (LF). Put CR */
+ }
+ }
+
+ if (ipFlag->file_info & INFO_CONVERT) {
+ if ((ipFlag->FromToMode == FROMTO_DOS2UNIX) && (lb_dos == 0))
+ return;
+ if (((ipFlag->FromToMode == FROMTO_UNIX2DOS)||(ipFlag->FromToMode == FROMTO_UNIX2MAC)) && (lb_unix == 0))
+ return;
+ if ((ipFlag->FromToMode == FROMTO_MAC2UNIX) && (lb_mac == 0))
+ return;
+ if ((ipFlag->Force == 0) && (ipFlag->status & BINARY_FILE))
+ return;
+ }
+
+ if (ipFlag->file_info & INFO_DOS)
+ printf(" %6d", lb_dos);
+ if (ipFlag->file_info & INFO_UNIX)
+ printf(" %6d", lb_unix);
+ if (ipFlag->file_info & INFO_MAC)
+ printf(" %6d", lb_mac);
+ if (ipFlag->file_info & INFO_BOM)
+ print_bom_info(ipFlag->bomtype);
+ if (ipFlag->file_info & INFO_TEXT) {
+ if (ipFlag->status & BINARY_FILE)
+ printf(" binary");
+ else
+ printf(" text ");
+ }
+ printf(" %s\n",filename);
+}
+#endif
+
+void FileInfo(FILE* ipInF, CFlag *ipFlag, const char *filename)
+{
+ int TempChar;
+ int PreviousChar = 0;
+ unsigned int lb_dos = 0;
+ unsigned int lb_unix = 0;
+ unsigned int lb_mac = 0;
+
+
+ ipFlag->status = 0;
+
+ while ((TempChar = fgetc(ipInF)) != EOF) {
+ if ( (TempChar < 32) &&
+ (TempChar != '\x0a') && /* Not an LF */
+ (TempChar != '\x0d') && /* Not a CR */
+ (TempChar != '\x09') && /* Not a TAB */
+ (TempChar != '\x0c')) { /* Not a form feed */
+ ipFlag->status |= BINARY_FILE ;
+ }
+ if (TempChar != '\x0a') { /* Not an LF */
+ PreviousChar = TempChar;
+ if (TempChar == '\x0d') /* CR */
+ lb_mac++;
+ } else {
+ /* TempChar is an LF */
+ if ( PreviousChar == '\x0d' ) { /* CR,LF pair. */
+ lb_dos++;
+ lb_mac--;
+ PreviousChar = TempChar;
+ continue;
+ }
+ PreviousChar = TempChar;
+ lb_unix++; /* Unix line end (LF). Put CR */
+ }
+ }
+
+
+ if (ipFlag->file_info & INFO_CONVERT) {
+ if ((ipFlag->FromToMode == FROMTO_DOS2UNIX) && (lb_dos == 0))
+ return;
+ if (((ipFlag->FromToMode == FROMTO_UNIX2DOS)||(ipFlag->FromToMode == FROMTO_UNIX2MAC)) && (lb_unix == 0))
+ return;
+ if ((ipFlag->FromToMode == FROMTO_MAC2UNIX) && (lb_mac == 0))
+ return;
+ if ((ipFlag->Force == 0) && (ipFlag->status & BINARY_FILE))
+ return;
+ }
+
+ if (ipFlag->file_info & INFO_DOS)
+ printf(" %6d", lb_dos);
+ if (ipFlag->file_info & INFO_UNIX)
+ printf(" %6d", lb_unix);
+ if (ipFlag->file_info & INFO_MAC)
+ printf(" %6d", lb_mac);
+ if (ipFlag->file_info & INFO_BOM)
+ print_bom_info(ipFlag->bomtype);
+ if (ipFlag->file_info & INFO_TEXT) {
+ if (ipFlag->status & BINARY_FILE)
+ printf(" binary");
+ else
+ printf(" text ");
+ }
+ printf(" %s\n",filename);
+}
+
+int GetFileInfo(char *ipInFN, CFlag *ipFlag, const char *progname)
+{
+ int RetVal = 0;
+ FILE *InF = NULL;
+ char *errstr;
+ int bomtype_orig = FILE_MBS;
+
+ ipFlag->status = 0 ;
+
+ /* Test if input file is a regular file or symbolic link */
+ if (regfile(ipInFN, 1, ipFlag, progname)) {
+ ipFlag->status |= NO_REGFILE ;
+ /* Not a failure, skipping non-regular input file according spec. */
+ return -1;
+ }
+
+ /* Test if input file target is a regular file */
+ if (symbolic_link(ipInFN) && regfile_target(ipInFN, ipFlag,progname)) {
+ ipFlag->status |= INPUT_TARGET_NO_REGFILE ;
+ /* Not a failure, skipping non-regular input file according spec. */
+ return -1;
+ }
+
+
+ /* can open in file? */
+ InF=OpenInFile(ipInFN);
+ if (InF == NULL) {
+ ipFlag->error = errno;
+ errstr = strerror(errno);
+ fprintf(stderr, "%s: %s: %s\n", progname, ipInFN, errstr);
+ RetVal = -1;
+ }
+
+
+ if (!RetVal)
+ if (check_unicode_info(InF, ipFlag, progname, &bomtype_orig))
+ RetVal = -1;
+
+ /* info sucessful? */
+#ifdef D2U_UNICODE
+ if (!RetVal) {
+ if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE)) {
+ FileInfoW(InF, ipFlag, ipInFN);
+ } else {
+ FileInfo(InF, ipFlag, ipInFN);
+ }
+ }
+#else
+ if (!RetVal)
+ FileInfo(InF, ipFlag, ipInFN);
+#endif
+ ipFlag->bomtype = bomtype_orig; /* messages must print the real bomtype, not the assumed bomtype */
+
+ /* can close in file? */
+ if ((InF) && (fclose(InF) == EOF))
+ RetVal = -1;
+
+ return RetVal;
+}
+
+int GetFileInfoStdio(CFlag *ipFlag, const char *progname)
+{
+ int RetVal = 0;
+ int bomtype_orig = FILE_MBS;
+
+ ipFlag->status = 0 ;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+
+ /* stdin and stdout are by default text streams. We need
+ * to set them to binary mode. Otherwise an LF will
+ * automatically be converted to CR-LF on DOS/Windows.
+ * Erwin */
+
+ /* POSIX 'setmode' was deprecated by MicroSoft since
+ * Visual C++ 2005. Use ISO C++ conformant '_setmode' instead. */
+
+ _setmode(_fileno(stdin), _O_BINARY);
+#elif defined(__MSDOS__) || defined(__CYGWIN__) || defined(__OS2__)
+ setmode(fileno(stdin), O_BINARY);
+#endif
+
+ if (check_unicode_info(stdin, ipFlag, progname, &bomtype_orig))
+ RetVal = -1;
+
+ /* info sucessful? */
+#ifdef D2U_UNICODE
+ if (!RetVal) {
+ if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE)) {
+ FileInfoW(stdin, ipFlag, "");
+ } else {
+ FileInfo(stdin, ipFlag, "");
+ }
+ }
+#else
+ if (!RetVal)
+ FileInfo(stdin, ipFlag, "");
+#endif
+ ipFlag->bomtype = bomtype_orig; /* messages must print the real bomtype, not the assumed bomtype */
+
+ return RetVal;
+}
+
+void get_info_options(char *option, CFlag *pFlag, const char *progname)
+{
+ char *ptr;
+
+ ptr = option;
+
+ if (*ptr == '\0') { /* no flags */
+ pFlag->file_info |= INFO_DEFAULT;
+ return;
+ }
+
+ while (*ptr != '\0') {
+ switch (*ptr) {
+ case 'd': /* Print nr of DOS line breaks. */
+ pFlag->file_info |= INFO_DOS;
+ break;
+ case 'u': /* Print nr of Unix line breaks. */
+ pFlag->file_info |= INFO_UNIX;
+ break;
+ case 'm': /* Print nr of Mac line breaks. */
+ pFlag->file_info |= INFO_MAC;
+ break;
+ case 'b': /* Print BOM. */
+ pFlag->file_info |= INFO_BOM;
+ break;
+ case 't': /* Text or binary. */
+ pFlag->file_info |= INFO_TEXT;
+ break;
+ case 'c': /* Print only files that would be converted. */
+ pFlag->file_info |= INFO_CONVERT;
+ break;
+ default:
+ /* Terminate the program on a wrong option. If pFlag->file_info is
+ zero and the program goes on, it may do unwanted conversions. */
+ fprintf(stderr,"%s: ",progname);
+ fprintf(stderr,_("wrong flag '%c' for option -i or --info\n"), *ptr);
+ exit(1);
+ ;
+ }
+ ptr++;
+ }
+}
+