view Renderer/Engine/xml.cc @ 1479:163220e54cc0 draft

remove hard code for TaskLog
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Tue, 24 Jul 2012 17:15:15 +0900
parents e19296785c07
children
line wrap: on
line source

#include <iostream>
#include <SDL.h>
#include <SDL_opengl.h>
#include <libxml/parser.h>
#include "polygon.h"
using namespace std;

char *skip_to_number(char *cont)
{
  if (cont == NULL) return(NULL);
  for (;(*cont < '+' || *cont > '9') && (*cont != '\0');cont++) {}
  if (*cont == '\0')
    {
      fprintf(stderr,"Content data is short\n");
      return(NULL);
    }
  return(cont);
}

char *pickup_float(char *cont, float *index)
{
  int sign=1;
  float shift=10,val_dec=0,val_int=0,exp=1;;

  cont = skip_to_number(cont);
  if (cont == NULL) return(NULL);

  for (;*cont != ' ' && *cont != '\n' && *cont != '\t' && *cont != ',' ;cont++)
    {
      if (*cont == '-')
        {
          sign = -1;
        }
      else if (*cont == '.')
        {
          shift = 0.1;
        }
      else if (*cont >= '0' && *cont <= '9')
        {
          if (shift == 10)
            {
              val_int *= shift;
              val_int += *cont - 48;
            }
          else
            {
              val_dec += (*cont - 48) * shift;
              shift *= 0.1;
            }
        }
      else if (*cont == 'e' || *cont == 'E')
        {
	  if (cont == NULL){ 
	    return(NULL);
	  }
	  else if (*(cont+1) == '-'){
	    for (int j=0;j<*(cont+2);j++)exp *= 0.1;
	  //cont = pickup_exponent(&exp,cont+1);
	  }
        }
      else if (*cont == '+' || *cont == '/' || *cont == ' ')
        {
          // ignore
        }

      else if (*cont == '\0')
        {
            // NULL end

            /* ここの条件は collada の仕様に合わせたもの。
             * 自前の blender script から吐き出される xml形式では、
             * 文字の終わりをNULLでは判断せず、エラー処理としていた
             * ので必要ではなかった。よって、自前 blender script の
             * xml形式の時、途中で NULL が来た場合、エラー処理され
             * なくなる。NULL を返すので、呼び出し側で判断する
             */
            *index = sign * (val_int + val_dec) * exp;
            return(NULL);
        }
      else
        {
          fprintf(stderr,"Pick up float failed : %c(%d)\n",*cont,*cont);
          return(NULL);
        }
    }
  *index = sign * (val_int + val_dec) * exp;
  cont++;
  return(cont);
}


/*
int main(int artc, char *argv[])
{
  xmlDocPtr doc;
  xmlNodePtr cur;
  char *cont;

  doc = xmlParseFile(argv[1]);

  cur = xmlDocGetRootElement(doc);

  xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D");

  for (cur=cur->children; cur; cur=cur->next)
    {
      if (!xmlStrcmp(cur->name,(xmlChar*)"surface"))
        {
	  get_data(cur->children);
        }
    }

  xmlFreeDoc(doc);
  return 0;

}
*/