#include "tai.h"

static int hex2int(char c) 
{
  if(c >= '0' && c <= '9')
    return c - '0';
  if(c >= 'A' && c <= 'F')
    return c - 'A' + 10;
  if(c >= 'a' && c <= 'f')
    return c - 'a' + 10;
  return -1;
}

tai* tai64n_decode(const char* str, const char** endptr)
{
  static struct tai t;
  if(*str++ != '@')
    return 0;
  /* Check if the line is within range */
  if(str[0] != '4' || str[1] != '0' || str[2] != '0' || str[3] != '0' ||
     str[4] != '0' || str[5] != '0' || str[6] != '0' || str[7] != '0')
    return 0;
  t.seconds =
    hex2int(str[8]) << 28 |
    hex2int(str[9]) << 24 |
    hex2int(str[10]) << 20 |
    hex2int(str[11]) << 16 |
    hex2int(str[12]) << 12 |
    hex2int(str[13]) << 8 |
    hex2int(str[14]) << 4 |
    hex2int(str[15]);
  t.nanoseconds =
    hex2int(str[16]) << 28 |
    hex2int(str[17]) << 24 |
    hex2int(str[18]) << 20 |
    hex2int(str[19]) << 16 |
    hex2int(str[20]) << 12 |
    hex2int(str[21]) << 8 |
    hex2int(str[22]) << 4 |
    hex2int(str[23]);
  if(endptr)
    *endptr = str + 24;
  return &t;
}


syntax highlighted by Code2HTML, v. 0.9.1