示例#1
0
int MXMLSetChild(

  mxml_t  *E,     /* I */
  char    *CName, /* I */
  mxml_t **CE)    /* O */

  {
  if (CE == NULL)
    return(FAILURE);

  if (CE != NULL)
    *CE = NULL;

  if ((E == NULL) || (CName == NULL))
    {
    return(FAILURE);
    }

  if (MXMLGetChild(E, CName, NULL, CE) == SUCCESS)
    {
    /* located existing child */

    return(SUCCESS);
    }

  /* create new child */

  if ((*CE = (mxml_t *)calloc(1, sizeof(mxml_t))) == NULL)
    {
    return(FAILURE);
    }

  MXMLAddE(E, *CE);

  if (CName != NULL)
    {
    (*CE)->Name = strdup(CName);

    if ((*CE)->Name == NULL)
      {
      return(FAILURE);
      }
    }

  return(SUCCESS);
  }  /* END MXMLSetChild() */
示例#2
0
int MXMLFromString(

  mxml_t **EP,        /* O (populate or create) */
  char    *XMLString, /* I */
  char   **Tail,      /* O (optional) */
  char    *EMsg,      /* O (optional) */
  int      emsg_size) /* I */

  {
  mxml_t  *E;
  char    *ptr;

  char    *tail;

  int      index;

  mbool_t  ElementIsClosed = FALSE;

  mbool_t  DoAppend = FALSE;

  char tmpNLine[MMAX_LINE + 1];
  char tmpVLine[MMAX_XBUFFER + 1];

  if (EP != NULL)
    *EP = NULL;

  if (EMsg != NULL)
    EMsg[0] = '\0';

  if ((XMLString == NULL) || (EP == NULL))
    {
    if (EMsg != NULL)
      snprintf(EMsg, emsg_size, "invalid arguments");

    return(FAILURE);
    }

  if ((ptr = strchr(XMLString, '<')) == NULL)
    {
    if (EMsg != NULL)
      snprintf(EMsg, emsg_size, "no XML in string");

    return(FAILURE);
    }

  if (ptr[1] == '/')
    {
    /* located tail marker */

    if (EMsg != NULL)
      snprintf(EMsg, emsg_size, "premature termination marker");

    return(FAILURE);
    }

  /* NOTE:  should support append/overlay parameter (NYI) */

  /* ignore 'meta' elements */

  while ((ptr[1] == '?') || (ptr[1] == '!'))
    {
    ptr++;

    /* ignore 'meta' elements */

    if (*ptr == '?')
      {
      ptr++;

      if ((ptr = strstr(ptr, "?>")) == NULL)
        {
        /* cannot locate end of meta element */

        return(FAILURE);
        }

      if ((ptr = strchr(ptr, '<')) == NULL)
        {
        /* cannot locate next element */

        if (EMsg != NULL)
          snprintf(EMsg, emsg_size, "cannot locate post-meta XML");

        return(FAILURE);
        }
      }    /* END if (*ptr == '?') */

    /* ignore 'comment' element */

    if (!strncmp(ptr, "!--", 3))
      {
      ptr += 3;

      if ((ptr = strstr(ptr, "-->")) == NULL)
        {
        /* cannot locate end of comment element */

        if (EMsg != NULL)
          snprintf(EMsg, emsg_size, "cannot locate comment termination marker");

        return(FAILURE);
        }

      if ((ptr = strchr(ptr, '<')) == NULL)
        {
        /* cannot locate next element */

        if (EMsg != NULL)
          snprintf(EMsg, emsg_size, "cannot locate post-comment XML");

        return(FAILURE);
        }
      }    /* END if (!strncmp(ptr,"!--",3)) */
    }      /* END while ((ptr[1] == '?') || (ptr[1] == '!')) */

  /* remove whitespace */

  while (isspace(*ptr))
    ptr++;

  /* extract root element */

  if (*ptr != '<')
    {
    /* cannot located start of element */

    if (EMsg != NULL)
      snprintf(EMsg, emsg_size, "cannot locate start of root element");

    return(FAILURE);
    }

  ptr++;  /* ignore '<' */

  index = 0;

  while ((*ptr != ' ') && (*ptr != '>'))
    {
    if ((ptr[0] == '/') && (ptr[1] == '>'))
      {
      ElementIsClosed = TRUE;

      break;
      }

    tmpNLine[index++] = *(ptr++);

    if ((index >= MMAX_LINE) || (ptr[0] == '\0'))
      {
      if (EMsg != NULL)
        snprintf(EMsg, emsg_size, "element name is too long - %.10s", tmpNLine);

      return(FAILURE);
      }
    }

  tmpNLine[index] = '\0';

  if ((*EP == NULL) && (MXMLCreateE(EP, tmpNLine) == FAILURE))
    {
    if (EMsg != NULL)
      snprintf(EMsg, emsg_size, "cannot create XML element '%s'", tmpNLine);

    return(FAILURE);
    }

  E = *EP;

  if ((E->ACount > 0) || (E->CCount > 0))
    {
    DoAppend = TRUE;
    }

  if (ElementIsClosed == TRUE)
    {
    ptr += 2; /* skip '/>' */

    if (Tail != NULL)
      *Tail = ptr;

    return(SUCCESS);
    }

  while (*ptr == ' ')
    ptr++;

  while (*ptr != '>')
    {
    /* extract attributes */

    /* FORMAT:  <ATTR>="<VAL>" */

    index = 0;

    while ((*ptr != '=') && (*ptr != '\0'))
      {
      tmpNLine[index++] = *(ptr++);

      if (index >= MMAX_LINE)
        break;
      }

    tmpNLine[index] = '\0';

    if (*ptr != '\0')
      ptr++;  /* skip '=' */

    if (*ptr != '\0')
      ptr++;  /* skip '"' */

    if (*ptr == '\0')
      {
      if (EMsg != NULL)
        snprintf(EMsg, emsg_size, "string is corrupt - early termination");

      return(FAILURE);
      }

    index = 0;

    while ((*ptr != '"') ||
           ((ptr > XMLString) && (*(ptr - 1) == '\\')))
      {
      tmpVLine[index++] = *(ptr++);

      if ((index >= MMAX_XBUFFER) || (*ptr == '\0'))
        {
        MXMLDestroyE(EP);

        /* locate tail */

        if (Tail != NULL)
          *Tail = ptr + strlen(ptr);

        if (EMsg != NULL)
          {
          snprintf(EMsg, emsg_size, "attribute name is too long - %.10s", tmpVLine);
          }

        return(FAILURE);
        }
      }

    tmpVLine[index] = '\0';

    MXMLSetAttr(E,tmpNLine,(void *)tmpVLine,mdfString);

    ptr++; /* ignore '"' */

    while (*ptr == ' ')
      ptr++;

    if ((ptr[0] == '/') && (ptr[1] == '>'))
      {
      /* element terminator reached */

      ptr += 2; /* skip '/>' */

      if (Tail != NULL)
        *Tail = ptr;

      return(SUCCESS);
      }
    }  /* END while (*ptr != '>') */

  ptr++; /* ignore '>' */

  /* skip whitespace */

  while (isspace(*ptr))
    ptr++;

  /* extract value */

  if (*ptr != '<')
    {
    char *ptr2;

    index = 0;

    while (*ptr != '<')
      {
      tmpVLine[index++] = *(ptr++);

      if (index >= MMAX_XBUFFER)
        break;
      }

    tmpVLine[index] = '\0';

    E->Val = strdup(tmpVLine);

    if (E->Val == NULL)
      {
      if (EMsg != NULL)
        {
        snprintf(EMsg, emsg_size, "cannot alloc memory for value - %.10s", tmpVLine);
        }

      return(FAILURE);
      }

    /* restore '<' symbols */

    for (ptr2 = strchr(E->Val,(char)14);ptr2 != NULL;ptr2 = strchr(ptr2,(char)14))
      *ptr2 = '<';
    }  /* END if (*ptr != '<') */

  /* extract children */

  while (ptr[1] != '/')
    {
    mxml_t *C;

    C = NULL;

    if (DoAppend == TRUE)
      {
      char *ptr2;
      char  tmpCName[MMAX_NAME];

      int   index;

      /* FORMAT:  <NAME>... */

      /* locate name */

      ptr2 = ptr + 1;  /* ignore '<' */

      index = 0;

      while ((*ptr2 != ' ') && (*ptr2 != '>'))
        {
        if ((ptr2[0] == '/') && (ptr2[1] == '>'))
          {
          break;
          }

        tmpCName[index++] = *(ptr2++);

        if ((index >= MMAX_LINE) || (ptr2[0] == '\0'))
          {
          if (EMsg != NULL)
            {
            snprintf(EMsg, emsg_size, "element name is too long - %.10s", tmpCName);
            }
 
          return(FAILURE);
          }
        }

      tmpCName[index] = '\0';

      MXMLGetChild(E, tmpCName, NULL, &C);
      }

    if ((MXMLFromString(&C, ptr, &tail, EMsg, emsg_size) == FAILURE) ||
        (MXMLAddE(E, C) == FAILURE))
      {
      break;
      }

    ptr = tail;

    if ((ptr == NULL) || (ptr[0] == '\0'))
      {
      /* XML is corrupt */

      if (Tail != NULL)
        *Tail = ptr;

      if ((EMsg != NULL) && (EMsg[0] == '\0'))
        snprintf(EMsg, emsg_size, "cannot extract child");

      return(FAILURE);
      }
    }  /* END while (ptr[1] != '/') */

  /* ignore whitespace */

  while (isspace(*ptr))
    ptr++;

  /* process tail */

  if (*ptr == '/')
    {
    /* process '/>' */

    ptr++; /* ignore '/' */
    }
  else
    {
    ptr++; /* ignore '<' */

    ptr++; /* ignore '/' */

    ptr += strlen(E->Name);
    }

  ptr++; /* ignore '>' */

  if (Tail != NULL)
    *Tail = ptr;

  return(SUCCESS);
  }  /* END MXMLFromString() */
示例#3
0
文件: MVCXML.c 项目: dhh1128/cbase
int MVCFromXML(
  mvc_t  *VC, /* I (modified) */
  mxml_t *E)  /* I */

  {
  mcredl_t        *L = NULL;
  int              aindex;
  enum MVCAttrEnum saindex;
  mxml_t          *CE = NULL;
  int              CTok;

  if ((VC == NULL) || (E == NULL))
    {
    return(FAILURE);
    }

  for (aindex = 0;aindex < E->ACount;aindex++)
    {
    saindex = (enum MVCAttrEnum)MUGetIndex(E->AName[aindex],MVCAttr,FALSE,0);

    if (saindex == mvcaNONE)
      continue;

    if ((saindex == mvcaThrottlePolicies) &&
        (MVCGetDynamicAttr(VC,mvcaThrottlePolicies,(void **)&L,mdfOther) == FAILURE))
      {
      L = (mcredl_t *)MUCalloc(1,sizeof(mcredl_t));

      MPUInitialize(&L->ActivePolicy);

      MVCSetDynamicAttr(VC,mvcaThrottlePolicies,(void **)&L,mdfOther);
      }

    MVCSetAttr(VC,saindex,(void **)E->AVal[aindex],mdfString,mSet);
    }

  CTok = -1;

  if (MXMLGetChild(E,"Variables",&CTok,&CE) == SUCCESS)
    {
    MUAddVarsFromXML(CE,&VC->Variables);
    }

  CTok = -1;

  if (MXMLGetChild(E,MVCAttr[mvcaMessages],&CTok,&CE) == SUCCESS)
    {
    MMBFromXML(&VC->MB,CE);
    }

  CTok = -1;

  while (MXMLGetChild(E,(char *)MVCAttr[mvcaACL],&CTok,&CE) == SUCCESS)
    {
    /* ACL's */

    MACLFromXML(&VC->ACL,CE,FALSE);
    }

  MVCTransition(VC);

  return(SUCCESS);
  }  /* END MVCFromXML() */
示例#4
0
文件: MMB.c 项目: dhh1128/cbase
int MMBFromString(

  char   *Buf,  /* I */
  mmb_t **MBP)  /* O (alloc) */

  {
  int CTok;

  mxml_t *E = NULL;
  mxml_t *ME;

  char tmpLine[MMAX_LINE << 1];
  char Owner[MMAX_NAME];
  char Label[MMAX_NAME];

  int count;
  int priority;

  mmb_t *tmpMB;

  enum MMBTypeEnum type;

  mulong etime;

  char *ptr;

  /* NOTE:  sync w/MMBFromXML() */
 
  if ((Buf == NULL) || (MBP == NULL))
    {
    return(FAILURE);
    }

  if (MXMLFromString(&E,Buf,NULL,NULL) == FAILURE)
    {
    return(FAILURE);
    }

  CTok = -1;

  while (MXMLGetChild(E,"message",&CTok,&ME) == SUCCESS)
    {
    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaCount],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      count = (int)strtol(tmpLine,NULL,10);
      }
    else
      {
      count = 1;
      }

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaPriority],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      priority = (int)strtol(tmpLine,NULL,10);
      }
    else
      {
      priority = 1;
      }

    MXMLGetAttr(ME,(char *)MMBAttr[mmbaType],NULL,tmpLine,sizeof(tmpLine));

    type = (enum MMBTypeEnum)MUGetIndexCI(tmpLine,MMBType,FALSE,mmbtNONE);

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaExpireTime],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      etime = strtol(tmpLine,NULL,10);
      }
    else
      {
      etime = MSched.Time + MCONST_DAYLEN;
      }

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaOwner],NULL,Owner,sizeof(Owner)) == FAILURE)
      strcpy(Owner,"N/A");

    MXMLGetAttr(ME,(char *)MMBAttr[mmbaLabel],NULL,Label,sizeof(Label));

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaData],NULL,tmpLine,sizeof(tmpLine)) == FAILURE)
      {
      MXMLDestroyE(&E);

      return(FAILURE);
      }

    ptr = tmpLine;

    /* NOTE:  restore checkpoint newlines - sync w/MJobToXML() */

    while ((ptr = strchr(ptr,'\7')) != NULL)
      {
      *ptr = '\n';
      }

    MXMLDestroyE(&E);

    if (MMBAdd(
          MBP,
          tmpLine,  /* I */
          Owner,
          type,
          etime,
          priority,
          &tmpMB) == FAILURE)
      {
      return(FAILURE);
      }

    if (count > 1)
      MMBSetAttr(tmpMB,mmbaCount,(void *)&count,mdfInt);

    if (Label[0] != '\0')
      MUStrDup(&tmpMB->Label,Label);
    }    /* END while (MXMLGetChild() == SUCCESS) */

  return(SUCCESS);
  }  /* END MMBFromString() */
示例#5
0
文件: MMB.c 项目: dhh1128/cbase
int MMBFromXML(

  mmb_t   **MBP,  /* I (modified) */
  mxml_t   *E)    /* I */

  {
  int     CTok;
  mxml_t *ME;

  char    tmpLine[MMAX_LINE << 1];
  char    Owner[MMAX_NAME];
  char    Source[MMAX_NAME];
  char    Label[MMAX_NAME];

  int     count;
  int     priority;

  enum MMBTypeEnum type;

  char   *ptr;

  mulong  etime;

  mmb_t  *tmpMB;

  CTok = -1;

  while (MXMLGetChild(E,"message",&CTok,&ME) == SUCCESS)
    {
    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaCount],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      count = (int)strtol(tmpLine,NULL,10);
      }
    else
      {
      count = 1;
      }

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaPriority],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      priority = (int)strtol(tmpLine,NULL,10);
      }
    else
      {
      priority = 1;
      }

    MXMLGetAttr(ME,(char *)MMBAttr[mmbaType],NULL,tmpLine,sizeof(tmpLine));

    type = (enum MMBTypeEnum)MUGetIndexCI(tmpLine,MMBType,FALSE,mmbtNONE);

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaExpireTime],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS)
      {
      etime = strtol(tmpLine,NULL,10);
      }
    else
      {
      etime = MSched.Time + MCONST_DAYLEN;
      }

    if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaOwner],NULL,Owner,sizeof(Owner)) == FAILURE)
      strcpy(Owner,"N/A");

    MXMLGetAttr(ME,(char *)MMBAttr[mmbaLabel],NULL,Label,sizeof(Label));

    MXMLGetAttr(ME,(char *)MMBAttr[mmbaSource],NULL,Source,sizeof(Source));

    if (MXMLGetAttr(
         ME,
         (char *)MMBAttr[mmbaData],
         NULL,
         tmpLine,
         sizeof(tmpLine)) == FAILURE)
      {
      return(FAILURE);
      }

    /* NOTE:  should 'pack/unpack' messages to handle '<' and '\n' characters (NYI) */ 

    if ((ptr = strchr(tmpLine,'\7')) != NULL)
      {
      /* unpack ckpt string - replace '\7' w/newlines */

      for (;ptr != NULL;ptr = strchr(ptr,'\7'))
        {
        *ptr = '\n';
        }
      }

    if (MMBAdd(
          MBP,
          tmpLine,
          Owner,
          type,
          etime,
          priority,
          &tmpMB) == FAILURE)
      {
      return(FAILURE);
      }

    if (count > 1)
      MMBSetAttr(tmpMB,mmbaCount,(void *)&count,mdfInt);

    if (Source[0] != '\0')
      MMBSetAttr(tmpMB,mmbaSource,(void *)Source,mdfString); 

    if (Label[0] != '\0')
      MUStrDup(&tmpMB->Label,Label);
    }    /* END while (MXMLGetChild() == SUCCESS) */

  return(SUCCESS);
  }   /* END MMBFromXML() */
示例#6
0
文件: MRM_XML.c 项目: dhh1128/cbase
int MRMFromXML(

  mrm_t  *R,   /* I (modified) */
  mxml_t *E)   /* I */

  {
  int aindex;

  enum MRMAttrEnum raindex;

  int pindex;
  int CTok;

  mxml_t *CE;

  const char *FName = "MRMFromXML";

  MDB(3,fSTRUCT) MLog("%s(%s,%s)\n",
    FName,
    (R != NULL) ? "R" : "NULL",
    (E != NULL) ? "E" : "NULL");

  if ((R == NULL) || (E == NULL))
    {
    return(FAILURE);
    }

  /* NOTE:  do not initialize--may be overlaying existing data */

  for (aindex = 0;aindex < E->ACount;aindex++)
    {
    raindex = (enum MRMAttrEnum)MUGetIndex(E->AName[aindex],MRMAttr,FALSE,0);

    if (raindex == mrmaNONE)
      continue;

    MRMSetAttr(R,raindex,(void **)E->AVal[aindex],mdfString,mSet);
    }  /* END for (aindex) */

  if (MXMLGetChild(E,(char *)MXO[mxoQueue],NULL,&CE) == SUCCESS)
    {
	/* NOTE: We may want to look at making this dynamic. It's only a matter of time
			 before somebody else blows this buffer again. */

    char Buffer[MMAX_BUFFER<<4];

    /* load jobs from the internal queue */

    if (MXMLGetAttr(CE,(char *)MXO[mxoJob],NULL,Buffer,sizeof(Buffer)) == SUCCESS)
      {
      MS3InitializeLocalQueue(R,Buffer);
      }
    }

  CTok = -1;
  pindex = 0;

  while (MXMLGetChild(E,"psi",&CTok,&CE) == SUCCESS)
    {
    /* set default */

    if (R->P[pindex].Type == mpstNONE)
      R->P[pindex].Type = mpstQM;

    MPSIFromXML(&R->P[pindex++],CE);
    }

  return(SUCCESS);
  }  /* END MRMFromXML() */