#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include "myc_str.h"
#include "sys_util.h"

typedef struct { char *instr; char *host; int port; char *user; int cod; } Instrument;
static Instrument list[]={
    { "DMC",   "lnsa05.psi.ch", 9753, "DMC"   , 1},
    { "TOPSI", "lnsa07.psi.ch", 9753, "TOPSI" , 1},
    { "SANS",  "lnsa10.psi.ch", 9753, "SANS"  , 1},
    { "HRPT",  "lnsa11.psi.ch", 9753, "HRPT"  , 1},
    { "TRICS", "lnsa18.psi.ch", 9753, "TRICS" , 1},
    { "AMOR",  "lnsa14.psi.ch", 9753, "AMOR"  , 1},
    { "FOCUS", "lnsa16.psi.ch", 9753, "FOCUS" , 1},
    { "TASP",  "lnsa12.psi.ch", 9753, "TASP",   1},
    { "TASP0", "lnsa09.psi.ch", 9753, NULL    , 0},
    { "RITA",  "rita2.psi.ch", 9753, NULL    , 0},
    { "PREP",  "lnsa01.psi.ch", 9753, NULL    , 0},
    { "AREA",  "lnsa01.psi.ch", 9751, NULL    , 0},
    { "TEST",  "lnsa15.psi.ch", 9753, "lnslib", 2}
  };

int InstrHost(char *input, char *instr, char *host, char *user, char *pcod
    , int instr_len, int host_len, int user_len, int pcod_len) {
  char buf[256];
  int i, j;
  struct tm tim;
  time_t t;

  j=-1;
  str_upcase(buf, input);
  for (i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
    if (0==strcmp(buf, list[i].instr)) {
      j=i;
    }
  }
  if (j<0) {
    str_lowcase(buf, input);
    for (i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
      if (list[i].host==strstr(list[i].host, buf)) {
        if (j>=0) return 0;
        j=i;
      }
    }
  }
  if (j<0) return 0;
  str_ncpy(instr,list[j].instr, instr_len);
  str_ncpy(host, list[j].host, host_len);
  if (list[j].user != NULL) {
    str_ncpy(user,    list[j].user, user_len);
    if (list[j].cod == 1) {
      str_ncpy(pcod, instr, pcod_len);
      str_ncat(pcod, "LNS", pcod_len);
    } else if (list[j].cod == 2) {
      time(&t);
      tim=*localtime(&t);
      sprintf(pcod, "%02dlns%d", tim.tm_year % 100, tim.tm_mon/6+1);
    } else {
      str_ncpy(pcod, " ", pcod_len);
    }
  }
  return list[j].port;
}


#ifdef F_CHAR
/* compile only when fortran c interface stuff is defined */

int F_FUN(instr_host)(F_CHAR(input), F_CHAR(instr), F_CHAR(host), F_CHAR(user), F_CHAR(pcod)
    , int input_len, int instr_len, int host_len, int user_len, int pcod_len) {
  char buf[256], in[256], ho[256], us[256], pc[256];
  int iRet;

  STR_TO_C(buf, input);
  iRet=InstrHost(buf, in, ho, us, pc, sizeof(in), sizeof(ho), sizeof(us), sizeof(pc));
  if (iRet>0) {
    STR_TO_F(instr, in);
    STR_TO_F(host, ho);
    STR_TO_F(user, us);
    STR_TO_F(pcod, pc);
  }
  return iRet;
}

#endif
