123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #include "libbb.h"
- #include "unicode.h"
- #undef CHAR_T
- #if ENABLE_UNICODE_SUPPORT
- # define CHAR_T wchar_t
- #else
- # define CHAR_T char
- #endif
- static void strrev(CHAR_T *s, int len)
- {
- int i;
- if (len != 0) {
- len--;
- if (len != 0 && s[len] == '\n')
- len--;
- }
- for (i = 0; i < len; i++, len--) {
- CHAR_T c = s[i];
- s[i] = s[len];
- s[len] = c;
- }
- }
- int rev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
- int rev_main(int argc UNUSED_PARAM, char **argv)
- {
- exitcode_t retval;
- size_t bufsize;
- char *buf;
- init_unicode();
- getopt32(argv, "");
- argv += optind;
- if (!argv[0])
- argv = (char **)&bb_argv_dash;
- retval = EXIT_SUCCESS;
- bufsize = 256;
- buf = xmalloc(bufsize);
- do {
- size_t pos;
- FILE *fp;
- fp = fopen_or_warn_stdin(*argv++);
- if (!fp) {
- retval = EXIT_FAILURE;
- continue;
- }
- pos = 0;
- while (1) {
-
- buf[bufsize - 1] = 1;
- if (!fgets(buf + pos, bufsize - pos, fp))
- break;
- if (buf[bufsize - 1] == '\0'
- && buf[bufsize - 2] != '\n'
- && !feof(fp)
- ) {
-
- pos = bufsize - 1;
- bufsize += 64 + bufsize / 8;
- buf = xrealloc(buf, bufsize);
- continue;
- }
-
- #if ENABLE_UNICODE_SUPPORT
- {
- wchar_t *tmp = xmalloc(bufsize * sizeof(wchar_t));
-
- int len = mbstowcs(tmp, buf, bufsize);
- if (len >= 0) {
- strrev(tmp, len);
-
- wcstombs(buf, tmp, bufsize);
- }
- free(tmp);
- }
- #else
- strrev(buf, strlen(buf));
- #endif
- fputs_stdout(buf);
- pos = 0;
- }
- fclose(fp);
- } while (*argv);
- if (ENABLE_FEATURE_CLEAN_UP)
- free(buf);
- fflush_stdout_and_exit(retval);
- }
|