/* dos2unix.c - convert newline format
 *
 * Copyright 2012 Rob Landley <rob@landley.net>

USE_DOS2UNIX(NEWTOY(dos2unix, NULL, TOYFLAG_BIN))
USE_DOS2UNIX(OLDTOY(unix2dos, dos2unix, NULL, TOYFLAG_BIN))

config DOS2UNIX
  bool "dos2unix/unix2dos"
  default y
  help
    usage: dos2unix/unix2dos [file...]

    Convert newline format between dos (\r\n) and unix (just \n)
    If no files listed copy from stdin, "-" is a synonym for stdin.
*/

#define FOR_dos2unix
#include "toys.h"

GLOBALS(
  char *tempfile;
)

static void do_dos2unix(int fd, char *name)
{
  char c = toys.which->name[0];
  int outfd = 1, catch = 0;

  if (fd) outfd = copy_tempfile(fd, name, &TT.tempfile);

  for (;;) {
    int len, in, out;

    len = read(fd, toybuf+(sizeof(toybuf)/2), sizeof(toybuf)/2);
    if (len<0) perror_msg("%s",name);
    if (len<1) break;

    for (in = out = 0; in < len; in++) {
      char x = toybuf[in+sizeof(toybuf)/2];

      // Drop \r only if followed by \n in dos2unix mode
      if (catch) {
        if (c == 'u' || x != '\n') toybuf[out++] = '\r';
        catch = 0;
      // Add \r only if \n not after \r in unix2dos mode
      } else if (c == 'u' && x == '\n') toybuf[out++] = '\r';

      if (x == '\r') catch++;
      else toybuf[out++] = x;
    }
    xwrite(outfd, toybuf, out);
  }
  if (catch) xwrite(outfd, "\r", 1);

  if (fd) replace_tempfile(-1, outfd, &TT.tempfile);
}

void dos2unix_main(void)
{
  loopfiles(toys.optargs, do_dos2unix);
}
