Chemistry-MolecularMass

 view release on metacpan or  search on metacpan

MolecularMass/MolecularMass.xs  view on Meta::CPAN


/***********************************************************/

char *matching_bracket(char *s, char *t)
{
   char left;
   char right;
   int i = 1;

   left = *s;
   right = other_bracket(*s);
   ++s;

   while (s < t)
   {
      if (*s == right) --i;
      if (*s == left) ++i;
      if (i == 0) break;
      ++s;
   }
   if (i == 0) return (s);
   return (NULL);
}

/***********************************************************/

char other_bracket(char b)
{
   if (b == '[') return (']');
   if (b == '{') return ('}');
   if (b == '(') return (')');
   if (b == '<') return ('>');
   if (b == ']') return ('[');
   if (b == '}') return ('{');
   if (b == ')') return ('(');
   if (b == '>') return ('<');
   return ('\0');
}

/************************************************************/
/*                                                          */
/*      XSUB stuff                                          */
/*                                                          */
/************************************************************/

MODULE = Chemistry::MolecularMass            PACKAGE = Chemistry::MolecularMass

int
verify_parens(s)
	char *s;
	CODE:
		RETVAL = verify_brackets(s);
	OUTPUT:
		RETVAL

void
parse_formula(s)
	char *s;
	PREINIT:
		Atom_count *i;
	PPCODE:
		i = parse_formula_c(s);

		if(i == NULL)
		{
		   /* do push nothing on the stack --
		      an empty list is implicitly returned */
		}
		else
		{
		   while(i != NULL)
		   {
		      EXTEND(SP, 2);
		      PUSHs(newSVpv(i->element_symbol, 0));
		      PUSHs(newSViv(i->count));
		      i = i->next;
		   }
		}



( run in 0.508 second using v1.01-cache-2.11-cpan-ad19def0cd9 )