/* log.c - Log to logcat.
 *
 * Copyright 2016 The Android Open Source Project

USE_LOG(NEWTOY(log, "<1p:t:", TOYFLAG_USR|TOYFLAG_SBIN))

config LOG
  bool "log"
  depends on TOYBOX_ON_ANDROID
  default y
  help
    usage: log [-p PRI] [-t TAG] MESSAGE...

    Logs message to logcat.

    -p	Use the given priority instead of INFO:
    	d: DEBUG  e: ERROR  f: FATAL  i: INFO  v: VERBOSE  w: WARN  s: SILENT
    -t	Use the given tag instead of "log"
*/

#define FOR_log
#include "toys.h"

GLOBALS(
  char *t, *p;
)

void log_main(void)
{
  android_LogPriority pri = ANDROID_LOG_INFO;
  char *s = toybuf;
  int i;

  if (TT.p) {
    i = stridx("defisvw", tolower(*TT.p));
    if (i==-1 || strlen(TT.p)!=1) error_exit("bad -p '%s'", TT.p);
    pri = (android_LogPriority []){ANDROID_LOG_DEBUG, ANDROID_LOG_ERROR,
      ANDROID_LOG_FATAL, ANDROID_LOG_INFO, ANDROID_LOG_SILENT,
      ANDROID_LOG_VERBOSE, ANDROID_LOG_WARN}[i];
  }
  if (!TT.t) TT.t = "log";

  for (i = 0; toys.optargs[i]; i++) {
    if (i) *s++ = ' ';
    if ((s-toybuf)+strlen(toys.optargs[i])>=1024) {
      memcpy(s, toys.optargs[i], 1024-(s-toybuf));
      toybuf[1024] = 0;
      error_msg("log cut at 1024 bytes");

      break;
    }
    s = stpcpy(s, toys.optargs[i]);
  }

  __android_log_write(pri, TT.t, toybuf);
}
