/* watch.c - Execute a program periodically
 *
 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
 *
USE_WATCH(NEWTOY(watch, "^<1n#<0=2te", TOYFLAG_USR|TOYFLAG_BIN))

config WATCH
  bool "watch"
  default n
  help
    usage: watch [-n SEC] [-t] PROG ARGS

    Run PROG periodically

    -n  Loop period in seconds (default 2)
    -t  Don't print header
    -e  Freeze updates on command error, and exit after enter.
*/
#define FOR_watch
#include "toys.h"

GLOBALS(
  int interval;
)

void watch_main(void)
{
  int i = 0, hlen;
  time_t t;
  unsigned width = 80, len = sizeof("Www Mmm dd hh:mm:ss yyyy") - 1 ;
  char *header, *cmd = *toys.optargs;
  int retval;

  while(toys.optargs[++i])
  {
    char * oldcmd = cmd;
    cmd = xmprintf("%s %s", oldcmd, toys.optargs[i]);
    if (CFG_TOYBOX_FREE) free(oldcmd);
  }
  header = xmprintf("Every %us: %s", TT.interval, cmd);
  hlen = strlen(header);

  while(1) {
    xprintf("\033[H\033[J");
    if(!(toys.optflags & FLAG_t)) {
      terminal_size(&width, NULL);
      if (!width) width = 80; //on serial it may return 0.
      time(&t);
      if (width > (hlen + len)) xprintf("%s", header);
      if(width >= len)
        xprintf("%*s\n",width + ((width > (hlen + len))?-hlen:0) + 1, ctime(&t));
      else
        xprintf("\n\n");
    }
    fflush(NULL); //making sure the screen is clear
    retval = system(cmd);
    if ((toys.optflags & FLAG_e) && retval){
      xprintf("command exit with non-zero status, press enter to exit\n");
      getchar();
      break;
    }
    sleep(TT.interval);
  }

  if (CFG_TOYBOX_FREE){
    free(header);
    if (cmd != *toys.optargs) free(cmd);
  }
}