Exemplo n.º 1
0
	double parse_factors(char *& expression)
	{
		FAIL_CHECK;
		double num1 = parse_atom(expression);
		FAIL_CHECK;
		for (;;)
		{
			skip_spaces(expression);
			char op = *expression;
			char *position = expression;
			if (op != '/' && op != '*')
			{
				// nothing for us, pass it back
				return num1;
			}
			expression++;
			double num2 = parse_atom(expression);
			FAIL_CHECK;
			if (op == '/')
			{
				if (num2 == 0)
				{
					RETURN_FAILURE(DIV_ZERO, expression);
				}
				num1 /= num2;
			}
			else
			{
				num1 *= num2;
			}
		}
	}
Exemplo n.º 2
0
static expression_t*
parse_expression (scanner_t *scanner)
{
	expression_t *exp = parse_atom (scanner);

	while (LA_ID ("-") || LA_ID ("+")) {
		char *text;
		CONSUME_IDENTIFIER (text);
		expression_t *left = exp;
		exp = g_new0 (expression_t, 1);
		exp->type = !strcmp ("+", text) ? EXPRESSION_ADD: EXPRESSION_SUB;
		exp->data.bin.left = left;
		exp->data.bin.right = parse_atom (scanner);
	}
	return exp;
}
Exemplo n.º 3
0
/* The `input' will be free. Don't assign it directly. */
LispObject parse_sexp(char *input, int *offset)
{
    if ('\0' == *input)
        return NULL;
    while ('\0' != *input && isblank(*input))
        input++;
    if ('\'' == *input) {
        LispObject obj;
        /* Symbol quote; */

        /* quote = S("QUOTE"); */
        obj = parse_input(input + 1);

        /* return make_cons(S("QUOTE"), make_cons(obj, lt_nil)); */
        return make_list(S("QUOTE"), obj);
    }
    if ('(' == input[0]) {
        Cons cons;

        cons = parse_cons(input + 1, offset);
        (*offset)++;

	return cons;
    } else
        return parse_atom(input, offset);
}
Exemplo n.º 4
0
static int
delete_prop_xi1(Display *dpy, int argc, char** argv, char* n, char *desc)
{
    XDevice     *dev;
    XDeviceInfo *info;
    char        *name;
    Atom        prop;

    info = find_device_info(dpy, argv[0], False);
    if (!info)
    {
        fprintf(stderr, "unable to find device %s\n", argv[0]);
        return EXIT_FAILURE;
    }

    dev = XOpenDevice(dpy, info->id);
    if (!dev)
    {
        fprintf(stderr, "unable to open device '%s'\n", info->name);
        return EXIT_FAILURE;
    }

    name = argv[1];

    prop = parse_atom(dpy, name);

    XDeleteDeviceProperty(dpy, dev, prop);

    XCloseDevice(dpy, dev);
    return EXIT_SUCCESS;
}
Exemplo n.º 5
0
Arquivo: read.c Projeto: miklos1/scene
/**
 * Reads externalizable Lisp datum.
 *
 * For successful reads, a Lisp object is returned and `report` is not called.
 *
 * In case of syntax error, `report` is called at least once, and the return
 * value must not be used.
 *
 * If the return value is `unspecific`, but `report` is not called, that means
 * that no tokens left in the data source. @todo
 *
 * @param lexer
 *        Lexer state used to retrieve tokens.
 * @param rep
 *        Reference to error-reporter object.
 * @param arg
 *        Additional data which will be passed to `report` in case of a call.
 * @return Lisp object, or `unspecific`. @todo
 */
obj_t read_datum(struct Lexer *lexer, Reporter rep)
{
	struct Parser state;
	state.lexer  = lexer;
	state.rep    = rep;
	state.ready  = 0;

	register_quotation_symbols();
	return parse_atom(&state);
}
Exemplo n.º 6
0
Arquivo: read.c Projeto: miklos1/scene
static obj_t parse_quotation(string sym, struct Parser *st)
{
	struct token *t = peek(st);
	switch (t->type) {
	case END:
	case DOT:
	case CPAREN:
		reportlocf(st->rep, t->loc, "missing datum after quotation");
		return unspecific;
	default:
		return cons(make_symbol(sym), cons(parse_atom(st), null_obj));
	}
}
Exemplo n.º 7
0
/*
 * Make sure the format string is well formed, and parse out
 * the used atoms.
 */
static int verify_format(const char *format)
{
	const char *cp, *sp;
	for (cp = format; *cp && (sp = find_next(cp)); ) {
		const char *ep = strchr(sp, ')');
		if (!ep)
			return error("malformed format string %s", sp);
		/* sp points at "%(" and ep points at the closing ")" */
		parse_atom(sp + 2, ep);
		cp = ep + 1;
	}
	return 0;
}
Exemplo n.º 8
0
int parse_atomlist(NLEnergy *p, Tcl_Interp *interp,
    Tcl_Obj *const obj, boolean invert, int mark) {
  char *atomsel = Array_data(&(p->atomsel));
  char *nonbsel = Array_data(&(p->nonbsel));
  char *asel = (mark > 0 ? nonbsel : atomsel);
  char *invsel = Array_data(&(p->invsel));
  char *sel = (invert ? invsel : asel);
  const int32 natoms = Topology_atom_array_length(&(p->topo));
  int32 id;
  Tcl_Obj **objv;
  int objc, n;
  int m = (mark > 0 ? mark : -mark);

  if (invert) {
    memset(invsel, 0, natoms);
  }
  if ((id=parse_atom(p,interp,obj)) >= 0) {  /* could be a singleton */
    sel[id] |= (char)m;
  }
  else {  /* its a list of atoms */
    if (TCL_ERROR==Tcl_ListObjGetElements(interp, obj, &objc, &objv)) {
      return FAIL;
    }
    for (n = 0;  n < objc;  n++) {
      if ((id=parse_atom(p,interp,objv[n])) < 0) {
        return FAIL;
      }
      sel[id] |= (char)m;
    }
  }
  if (invert) {
    for (id = 0;  id < natoms;  id++) {
      if (FALSE==invsel[id]) asel[id] |= (char)m;
    }
  }
  return OK;
}
Exemplo n.º 9
0
LispVal* lisp_read(FILE* f)
{
    eat_space(f);
    char c = peek(f);
    if (isdigit(c))
        return parse_number(f);
    else if (isalpha(c))
        return parse_atom(f);
    else if (c == '"')
        return parse_string(f);
    else if (c == '(')
        return parse_list(f);
    else
        return NULL;
}
Exemplo n.º 10
0
bool parser::parse_expr(utf8str::iterator& it, utf8str::iterator& it_end, shared_ptr<expr>& result)
{	
	if (it != it_end)
	{
		skip_whitespaces(it, it_end);
		if (parse_list(it, it_end, result))
		{
			return true;
		}
		if (parse_atom(it, it_end, result))
		{
			return true;
		}
	}	
	return false;
}
Exemplo n.º 11
0
static void
do_service_request(struct packet_handler *c,
		   struct ssh_connection *connection,
		   struct lsh_string *packet)
{
  CAST(service_handler, closure, c);

  struct simple_buffer buffer;
  unsigned msg_number;
  int name;
  
  simple_buffer_init(&buffer, packet->length, packet->data);

  if (parse_uint8(&buffer, &msg_number)
      && (msg_number == SSH_MSG_SERVICE_REQUEST)
      && parse_atom(&buffer, &name)
      && parse_eod(&buffer))
    {
      if (name)
	{
	  CAST_SUBTYPE(command, service, ALIST_GET(closure->services, name));
	  if (service)
	    {
	      /* Don't accept any further service requests */
	      connection->dispatch[SSH_MSG_SERVICE_REQUEST]
		= &connection_fail_handler;

	      /* Start service */
#if DATAFELLOWS_WORKAROUNDS
	      if (connection->peer_flags & PEER_SERVICE_ACCEPT_KLUDGE)
		C_WRITE(connection, format_service_accept_kludge());
	      else
#endif /* DATAFELLOWS_WORKAROUNDS */
		C_WRITE(connection, format_service_accept(name));
	      
	      COMMAND_CALL(service, connection,
			   closure->c, closure->e);
	      return;
	    }
	}
      EXCEPTION_RAISE(connection->e,
		      make_protocol_exception(SSH_DISCONNECT_SERVICE_NOT_AVAILABLE, NULL));
      
    }
  else
      PROTOCOL_ERROR(connection->e, "Invalid SERVICE_REQUEST message");
}
Exemplo n.º 12
0
Cons parse_cons(char *string, int *offset)
{
    Cons cur, head, pre;
    int step;

    pre = head = make_cons(lt_nil, lt_nil);
    for (int i = 0; string[i] != '\0'; i += step) {
	switch (string[i]) {
	case '(':
	    cur = make_cons(parse_cons(string + i + 1, &step), lt_nil);
	    break;
	case ' ':
        case '\n':
	    step = 1;
	    continue;
	case ')':
	    *offset = i + 2;
	    pre = CDR(head);
            free_cons(head);

	    return pre;
        case '\'': {
            /* Symbol quote; */
            LispObject obj;

            /* quote = S("QUOTE"); */
            obj = parse_sexp(string + i + 1, &step);
            /* cur = make_cons(make_cons(S("QUOTE"), make_cons(obj, lt_nil)), lt_nil); */
            cur = make_cons(make_list(S("QUOTE"), obj), lt_nil);
            step++;
            break;
        }
	default :
	    cur = make_cons(parse_atom(string + i, &step), lt_nil);
	}
        set_cdr(pre, cur);
	pre = cur;
    }
    pre = CDR(head);
    free_cons(head);

    return pre;
}
Exemplo n.º 13
0
/*
 * Make sure the format string is well formed, and parse out
 * the used atoms.
 */
static int verify_format(const char *format)
{
	const char *cp, *sp;
	static const char color_reset[] = "color:reset";

	need_color_reset_at_eol = 0;
	for (cp = format; *cp && (sp = find_next(cp)); ) {
		const char *ep = strchr(sp, ')');
		int at;

		if (!ep)
			return error("malformed format string %s", sp);
		/* sp points at "%(" and ep points at the closing ")" */
		at = parse_atom(sp + 2, ep);
		cp = ep + 1;

		if (starts_with(used_atom[at], "color:"))
			need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset);
	}
	return 0;
}
Exemplo n.º 14
0
static int
delete_prop_xi2(Display *dpy, int argc, char** argv, char* n, char *desc)
{
    XIDeviceInfo *info;
    char        *name;
    Atom        prop;

    info = xi2_find_device_info(dpy, argv[0]);
    if (!info)
    {
        fprintf(stderr, "unable to find device %s\n", argv[0]);
        return EXIT_FAILURE;
    }

    name = argv[1];

    prop = parse_atom(dpy, name);

    XIDeleteProperty(dpy, info->deviceid, prop);

    return EXIT_SUCCESS;
}
Exemplo n.º 15
0
Arquivo: rsa.c Projeto: macssh/macssh
static int
do_rsa_verify(struct verifier *v,
	      int algorithm,
	      UINT32 length,
	      const UINT8 *msg,
	      UINT32 signature_length,
	      const UINT8 *signature_data)
{
  CAST(rsa_verifier, self, v);
  mpz_t s;
  int res = 0;

  trace("do_rsa_verify: Verifying %a signature\n", algorithm);
  
  mpz_init(s);
  
  switch(algorithm)
    {
#if 0
    case ATOM_RSA_PKCS1_SHA1:
    case ATOM_RSA_PKCS1_SHA1_LOCAL:

      if (signature_length > self->size)
	goto fail;
  
      bignum_parse_u(s, signature_length, signature_data);
      break;

    case ATOM_SPKI:
#endif
    case ATOM_SSH_RSA:
      {
	struct simple_buffer buffer;
	UINT32 length;
	const UINT8 *digits;
	int atom;
	
	simple_buffer_init(&buffer, signature_length, signature_data);

	if (!(parse_atom(&buffer, &atom)
	      && (atom == ATOM_SSH_RSA)
	      && parse_string(&buffer, &length, &digits)
	      && (length <= self->size)
	      && parse_eod(&buffer) ))
	  goto fail;

	bignum_parse_u(s, length, digits);

	break;
      }
      
      /* It doesn't matter here which flavour of SPKI is used. */
    case ATOM_SPKI_SIGN_RSA:
    case ATOM_SPKI_SIGN_DSS:
      {
	struct simple_buffer buffer;
	struct sexp *e;
	
	simple_buffer_init(&buffer, signature_length, signature_data);

	if (! ( (e = sexp_parse_canonical(&buffer))
		&& parse_eod(&buffer)
		&& decode_rsa_sig_val(e, s, self->size)) )
	  goto fail;

	break;
      }
      
    default:
      fatal("do_rsa_verify: Internal error!\n");
    }
  
  res = rsa_pkcs1_verify(self, length, msg, s);

 fail:
  mpz_clear(s);
  
  return res;
}
Exemplo n.º 16
0
static struct lsh_string *
lsh_decode_key(struct lsh_string *contents)
{
  struct simple_buffer buffer;
  enum lsh_atom type;
  struct verifier *v;	

  simple_buffer_init(&buffer, STRING_LD(contents));

  if (!parse_atom(&buffer, &type))
    {
      werror("Invalid (binary) input data.\n");
      return NULL;
    }

  switch (type)
    {
    case ATOM_SSH_DSS:
      {
        werror("Reading key of type ssh-dss...\n");

        v = parse_ssh_dss_public(&buffer);
        
        if (!v)
          {
            werror("Invalid dsa key.\n");
            return NULL;
          }
	break;
      }

    case ATOM_SSH_DSA_SHA256_LOCAL:
      {
        werror("Reading key of type ssh-dsa-sha256...\n");

        v = parse_ssh_dsa_sha256_public(&buffer);
        
        if (!v)
          {
            werror("Invalid dsa-sha256 key.\n");
            return NULL;
          }
	break;
      }
    case ATOM_SSH_RSA:
      {
	werror("Reading key of type ssh-rsa...\n");

	v = parse_ssh_rsa_public(&buffer);

	if (!v)
	  {
	    werror("Invalid rsa key.\n");
	    return NULL;
	  }

	break;
      }
    default:
      werror("Unknown key type.");
      return NULL;
    }
  return PUBLIC_SPKI_KEY(v, 1);
}
Exemplo n.º 17
0
static
parse_err_t parse_sexpr(parse_state_t *state, node_t **result)
{
	node_t *ret = NULL;

	parse_err_t status = PARSE_OK;

	switch(token_type(state->ts)) {
	case TOK_END:
		return PARSE_END;

	case TOK_SYM:
	case TOK_LIT:
		status = parse_atom(state, &ret);
		break;

	case TOK_LPAREN:
		/* ( ... */

		token_chomp(state->ts);
		
		switch(token_type(state->ts)) {
		case TOK_END:
			status = PARSE_TOKEN_UNDERFLOW;
			goto error;

		case TOK_RPAREN:
			/* ( ) */
			/* consume closing rparen */
			token_chomp(state->ts);
			*result = NULL;
			goto tok_lparen_finish;

		case TOK_DOT:
			/* ( .  */
			status = PARSE_UNEXPECTED_DOT;
			goto error;

		default:
			break;
		}

		/* ( ... */
		status = parse_list(state, &ret);

		/* ... ) */
		switch(token_type(state->ts)) {
		case TOK_END:
			status = PARSE_TOKEN_UNDERFLOW;
			goto error;
		case TOK_RPAREN:
			/* consume closing rparen */
			token_chomp(state->ts);
			break;
		default:
			status = PARSE_EXPECTED_RPAREN;
			goto error;
		}

tok_lparen_finish:
		break;

	default:
		status = PARSE_EXPECTED_LPAREN_ATOM;
		goto error;
	}

	*result = ret;
	return status;

error:
	node_droproot(ret);
	return status;
}
Exemplo n.º 18
0
static int
do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc)
{
    XIDeviceInfo *info;
    Atom          prop;
    Atom          old_type;
    char         *name;
    int           i;
    Atom          float_atom;
    int           old_format, nelements = 0;
    unsigned long act_nitems, bytes_after;
    char         *endptr;
    union {
        unsigned char *c;
        int16_t *s;
        int32_t *l;
    } data;

    if (argc < 3)
    {
        fprintf(stderr, "Usage: xinput %s %s\n", n, desc);
        return EXIT_FAILURE;
    }

    info = xi2_find_device_info(dpy, argv[0]);
    if (!info)
    {
        fprintf(stderr, "unable to find device %s\n", argv[0]);
        return EXIT_FAILURE;
    }

    name = argv[1];

    prop = parse_atom(dpy, name);

    if (prop == None) {
        fprintf(stderr, "invalid property %s\n", name);
        return EXIT_FAILURE;
    }

    float_atom = XInternAtom(dpy, "FLOAT", False);

    nelements = argc - 2;
    if (type == None || format == 0) {
        if (XIGetProperty(dpy, info->deviceid, prop, 0, 0, False,
                          AnyPropertyType, &old_type, &old_format, &act_nitems,
                          &bytes_after, &data.c) != Success) {
            fprintf(stderr, "failed to get property type and format for %s\n",
                    name);
            return EXIT_FAILURE;
        } else {
            if (type == None)
                type = old_type;
            if (format == 0)
                format = old_format;
        }

        XFree(data.c);
    }

    if (type == None) {
        fprintf(stderr, "property %s doesn't exist, you need to specify "
                "its type and format\n", name);
        return EXIT_FAILURE;
    }

    data.c = calloc(nelements, sizeof(int32_t));

    for (i = 0; i < nelements; i++)
    {
        if (type == XA_INTEGER) {
            switch (format)
            {
                case 8:
                    data.c[i] = atoi(argv[2 + i]);
                    break;
                case 16:
                    data.s[i] = atoi(argv[2 + i]);
                    break;
                case 32:
                    data.l[i] = atoi(argv[2 + i]);
                    break;
                default:
                    fprintf(stderr, "unexpected size for property %s", name);
                    return EXIT_FAILURE;
            }
        } else if (type == float_atom) {
            if (format != 32) {
                fprintf(stderr, "unexpected format %d for property %s\n",
                        format, name);
                return EXIT_FAILURE;
            }
            *(float *)(data.l + i) = strtod(argv[2 + i], &endptr);
            if (endptr == argv[2 + i]) {
                fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]);
                return EXIT_FAILURE;
            }
        } else if (type == XA_ATOM) {
            if (format != 32) {
                fprintf(stderr, "unexpected format %d for property %s\n",
                        format, name);
                return EXIT_FAILURE;
            }
            data.l[i] = parse_atom(dpy, argv[2 + i]);
        } else {
            fprintf(stderr, "unexpected type for property %s\n", name);
            return EXIT_FAILURE;
        }
    }

    XIChangeProperty(dpy, info->deviceid, prop, type, format, PropModeReplace,
                          data.c, nelements);
    free(data.c);
    return EXIT_SUCCESS;
}
Exemplo n.º 19
0
Arquivo: read.c Projeto: miklos1/scene
static obj_t parse_list(struct Parser *st)
{
	struct location op = st->token.loc;
	obj_t head = unspecific;
	obj_t tail = unspecific;
	struct token *t;

	t = peek(st);
	switch (t->type) {
	case END:
		reportlocf(st->rep, op, "unmatched parenthesis");
		return unspecific;
	case CPAREN:
		/* empty list */
		next(st);
		return null_obj;
	case DOT:
		reportlocf(st->rep, t->loc, "cannot start list with dot");
		tail = cons(unspecific, unspecific);
		goto read_tail;
	default:
		head = tail = cons(parse_atom(st), unspecific);
		goto read_tail;
	}

read_tail:
	t = peek(st);
	switch (t->type) {
	case END:
		reportlocf(st->rep, op, "unmatched parenthesis");
		return unspecific;
	case CPAREN:
		/* end of list */
		next(st);
		set_cdr(tail, null_obj);
		return head;
	case DOT:
		next(st);
		goto read_last;
	default: {
		obj_t cell = cons(parse_atom(st), unspecific);
		set_cdr(tail, cell);
		tail = cell;
		goto read_tail;
	}
	}

read_last:
	t = peek(st);
	switch (t->type) {
	case END:
		reportlocf(st->rep, op, "unmatched parenthesis");
		return unspecific;
	case CPAREN:
		reportlocf(st->rep, t->loc, "missing datum after dot");
		next(st);
		return unspecific;
	case DOT:
		reportlocf(st->rep, t->loc, "missing datum after dot");
		goto read_close;
	default:
		set_cdr(tail, parse_atom(st));
		goto read_close;
	}

read_close:
	t = peek(st);
	switch (t->type) {
	case END:
		reportlocf(st->rep, op, "unmatched parenthesis");
		return unspecific;
	case CPAREN:
		next(st);
		return head;
	case DOT:
		reportlocf(st->rep, t->loc, "multiple dost in list");
		next(st);
		goto read_close;
	default:
		reportlocf(st->rep, t->loc, "extra datum after dot");
		parse_atom(st);
		goto read_close;
	}
}
Exemplo n.º 20
0
int charmm_parse_topo_defs(topo_defs *defs, FILE *file, void *v,
				void (*print_msg)(void *,const char *)) {

  char *tok[TOKLEN];
  char sbuf[BUFLEN];
  char msgbuf[BUFLEN];
  int ntok;
  int itok;
  int first;
  int skip;
  int skipall;
  int stream;
  char *s1, *s2, *s3, *s4;
  int i1, i2, i3, i4; 
  int j1, j2, j3, j4; 
  unsigned int utmp;

  first = 1;
  skip = 0;
  skipall = 0;
  stream = 0;

  if ( ! defs ) return -1;
  if ( ! file ) return -2;
  if ( print_msg == 0 ) print_msg = null_print_msg;

  while ( (ntok = charmm_get_tokens(tok,TOKLEN,sbuf,BUFLEN,file)) ) {
    if ( ! tok[0][0] ) {
      print_msg(v,tok[1]);
      continue;
    }
    if ( skipall ) {
      print_msg (v, "skipping statements at end of file due to end or return statement");
      break;
    }
    if ( first ) {
      first = 0;
      if ( ! strncmp("READ",tok[0],4) && ! strncmp("RTF",tok[1],4) ) {
        print_msg (v, "reading topology from stream file");
        first = 1;
        stream = 1;
        continue;
      } else if ( ! strncmp("READ",tok[0],4) && ! strncmp("PARA",tok[1],4) ) {
        print_msg (v, "skipping parameters in stream file");
        skip = 1;
        continue;
      } else if ( ! strncmp("READ",tok[0],4) ) {
        print_msg (v, "skipping unknown section in stream file");
        skip = 1;
        continue;
      } else if ( ntok == 2 && sscanf(tok[0],"%u",&utmp) == 1
                          && sscanf(tok[1],"%u",&utmp) == 1 ) {
        sprintf(msgbuf,"Created by CHARMM version %s %s",tok[0],tok[1]);
        print_msg(v,msgbuf);
        continue;
      }
    }

    if ( skip ) {
      if ( ! strncmp("END",tok[0],4) ) {
        debug_msg("Recognized file end statement in skipped section.");
        skip = 0;
        first = 1;
      }
    }
    else if ( ! strncmp("END",tok[0],4) ) {
      debug_msg("Recognized file end statement.");
      if ( stream ) {
        stream = 0;
        first = 1;
      } else {
        skipall = 1;
      }
    }
    else if ( ! strncmp("RETURN",tok[0],4) ) {
      debug_msg("Recognized return statement.");
        skipall = 1;
    }
    else if ( ! strncmp("ACCE",tok[0],4) ) {
      debug_msg("Recognized acceptor statement.");
    }
    else if ( ! strncmp("DONO",tok[0],4) ) {
      debug_msg("Recognized donor statement.");
    }
    else if ( ! strncmp("BOND",tok[0],4) ||
		! strncmp("DOUB",tok[0],4) ||
		! strncmp("TRIP",tok[0],4) ) {
      debug_msg("Recognized bond statement.");
      if ( ntok < 3 || (ntok-1)%2 ) {
        print_msg(v,"ERROR!  Failed to parse bond statement.");
      } else {
        for ( itok = 1; itok < ntok; itok += 2 ) {
          s1 = parse_atom(tok[itok],&i1,&j1);
          s2 = parse_atom(tok[itok+1],&i2,&j2);
          if ( topo_defs_bond(defs,0,0,s1,i1,j1,s2,i2,j2) )
            print_msg(v,"ERROR!  Failed to parse bond statement.");
        }
      }
    }
    else if ( ! strncmp("ANGL",tok[0],4) ||
		! strncmp("THET",tok[0],4) ) {
      debug_msg("Recognized angle statement.");
      if ( ntok < 4 || (ntok-1)%3 ) {
        print_msg(v,"ERROR!  Failed to parse angle statement.");
      } else {
        for ( itok = 1; itok < ntok; itok += 3 ) {
          s1 = parse_atom(tok[itok],&i1,&j1);
          s2 = parse_atom(tok[itok+1],&i2,&j2);
          s3 = parse_atom(tok[itok+2],&i3,&j3);
          if ( topo_defs_angle(defs,0,0,s1,i1,j1,s2,i2,j2,s3,i3,j3) )
            print_msg(v,"ERROR!  Failed to parse angle statement.");
        }
      }
    }
    else if ( ! strncmp("DIHE",tok[0],4) ) {
      debug_msg("Recognized dihedral statement.");
      if ( ntok < 5 || (ntok-1)%4 ) {
        print_msg(v,"ERROR!  Failed to parse dihedral statement.");
      } else {
        for ( itok = 1; itok < ntok; itok += 4 ) {
          s1 = parse_atom(tok[itok],&i1,&j1);
          s2 = parse_atom(tok[itok+1],&i2,&j2);
          s3 = parse_atom(tok[itok+2],&i3,&j3);
          s4 = parse_atom(tok[itok+3],&i4,&j4);
          if (topo_defs_dihedral(defs,0,0,s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4))
            print_msg(v,"ERROR!  Failed to parse dihedral statement.");
        }
      }
    }
    else if ( ! strncmp("IMPH",tok[0],4) ||
		! strncmp("IMPR",tok[0],4) ) {
      debug_msg("Recognized improper statement.");
      if ( ntok < 5 || (ntok-1)%4 ) {
        print_msg(v,"ERROR!  Failed to parse improper statement.");
      } else {
        for ( itok = 1; itok < ntok; itok += 4 ) {
          s1 = parse_atom(tok[itok],&i1,&j1);
          s2 = parse_atom(tok[itok+1],&i2,&j2);
          s3 = parse_atom(tok[itok+2],&i3,&j3);
          s4 = parse_atom(tok[itok+3],&i4,&j4);
          if (topo_defs_improper(defs,0,0,s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4))
            print_msg(v,"ERROR!  Failed to parse improper statement.");
        }
      }
    }
    else if ( ! strncmp("CMAP",tok[0],4) ) {
      debug_msg("Recognized CMAP statement.");
      if ( ntok != 9 ) {
        print_msg(v,"ERROR!  Failed to parse CMAP statement.");
      } else {
        const char* s[8]; int i[8], j[8];
        for ( itok = 0; itok < 8; ++itok ) {
          s[itok] = parse_atom(tok[itok+1],&i[itok],&j[itok]);
        }
        if (topo_defs_cmap(defs,0,0,s,i,j))
            print_msg(v,"ERROR!  Failed to parse CMAP statement.");
      }
    }
    else if ( ! strncmp("DECL",tok[0],4) ) {
      debug_msg("Recognized atom declaration statement.");
    }
    else if ( ! strncmp("ATOM",tok[0],4) ) {
      debug_msg("Recognized atom statement.");
      if ( ntok < 4 ) {
        print_msg(v,"ERROR!  Failed to parse atom statement.");
      } else if ( ntok > 4 ) {
        print_msg(v,"ERROR!  Explicit exclusions or fluctuating charges not supported, atom ignored.");
      } else {
        s1 = parse_atom(tok[1],&i1,&j1);
        if ( topo_defs_atom(defs,0,0, s1,i1,j1,tok[2],atof(tok[3])) ) {
          print_msg(v,"ERROR!  Failed to parse atom statement.");
        }
      }
    }
    else if ( ! strncmp("MASS",tok[0],4) ) {
      debug_msg("Recognized mass statement.");
      if ( ntok < 4 || topo_defs_type(defs,tok[2],(ntok>4?tok[4]:""),atof(tok[3]),atoi(tok[1])) ) {
        print_msg(v,"ERROR!  Failed to parse mass statement.");
      }
    }
    else if ( ! strncmp("AUTO",tok[0],4) ) {
      debug_msg("Recognized autogenerate statement.");
      for ( itok = 1; itok < ntok; itok += 1 ) {
        if ( ! strncmp("ANGL",tok[itok],4) ) {
          topo_defs_auto_angles(defs,1);
        } else if ( ! strncmp("DIHE",tok[itok],4) ) {
          topo_defs_auto_dihedrals(defs,1);
        } else {
          print_msg(v,"ERROR!  Failed to parse autogenerate statement.");
        }
      }
    }
    else if ( ! strncmp("DEFA",tok[0],4) ) {
      debug_msg("Recognized default patch statement.");
      if ( ntok < 3 || (ntok-1)%2 ) {
        print_msg(v,"ERROR!  Failed to parse default patching statement.");
      } else {
        i1 = i2 = 0;
        for ( itok = 1; itok < ntok; itok += 2 ) {
          if ( ! strncmp("FIRS",tok[itok],4) ) {
              i1 = topo_defs_default_patching_first(defs,tok[itok+1]);
          } else if ( ! strncmp("LAST",tok[itok],4) ) {
              i2 = topo_defs_default_patching_last(defs,tok[itok+1]);
          } else {
            print_msg(v,"ERROR!  Failed to parse default patching statement.");
          }
        }
        if ( i1 || i2 )
          print_msg(v,"ERROR!  Failed to parse default patching statement.");
      }
    }
    else if ( ! strncmp("BILD",tok[0],4) ||
		! strncmp("IC",tok[0],4) ) {
      debug_msg("Recognized internal coordinate statement.");
      if ( ntok < 10 ) {
        print_msg(v,"ERROR!  Failed to parse internal coordinate statement.");
      } else {
        s1 = parse_atom(tok[1],&i1,&j1);
        s2 = parse_atom(tok[2],&i2,&j2);
        s3 = tok[3] + ( tok[3][0] == '*' ? 1 : 0 );
        s3 = parse_atom(s3,&i3,&j3);
        s4 = parse_atom(tok[4],&i4,&j4);
        if ( topo_defs_conformation(defs,0,0,
		s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4,
		atof(tok[5]),atof(tok[6]),atof(tok[7]),
		(tok[3][0]=='*'?1:0),atof(tok[8]),atof(tok[9])) )
          print_msg(v,"ERROR!  Failed to parse internal coordinate statement.");
      }
    }
    else if ( ! strncmp("DELE",tok[0],4) ) {
      debug_msg("Recognized delete statement.");
      if ( ntok < 2 ) {
        print_msg(v,"ERROR!  Failed to parse delete statement.");
      } else {
        if ( ! strncmp("ATOM",tok[1],4) ) {
          if ( ntok < 3 ) {
            print_msg(v,"ERROR!  Failed to parse delete atom statement.");
          } else {
            s1 = parse_atom(tok[2],&i1,&j1);
            if ( topo_defs_atom(defs,0,1, s1,i1,j1,"DEL",0.0) ) {
              print_msg(v,"ERROR!  Failed to parse delete atom statement.");
            }
          }
        } else if ( ! strncmp("ACCE",tok[1],4) ) {
          ;
        } else if ( ! strncmp("DONO",tok[1],4) ) {
          ;
        } else if ( ! strncmp("BOND",tok[1],4) ||
		! strncmp("DOUB",tok[1],4) ||
		! strncmp("TRIP",tok[1],4) ) {
          if ( ntok < 4 || (ntok-2)%2 ) {
            print_msg(v,"ERROR!  Failed to parse delete bond statement.");
          } else {
            for ( itok = 2; itok < ntok; itok += 2 ) {
              s1 = parse_atom(tok[itok],&i1,&j1);
              s2 = parse_atom(tok[itok+1],&i2,&j2);
              if ( topo_defs_bond(defs,0,1,s1,i1,j1,s2,i2,j2) )
                print_msg(v,"ERROR!  Failed to parse delete bond statement.");
            }
          }
        } else if ( ! strncmp("ANGL",tok[1],4) ||
		! strncmp("THET",tok[1],4) ) {
          if ( ntok < 5 || (ntok-2)%3 ) {
            print_msg(v,"ERROR!  Failed to parse delete angle statement.");
          } else {
            for ( itok = 2; itok < ntok; itok += 3 ) {
              s1 = parse_atom(tok[itok],&i1,&j1);
              s2 = parse_atom(tok[itok+1],&i2,&j2);
              s3 = parse_atom(tok[itok+2],&i3,&j3);
              if ( topo_defs_angle(defs,0,1,s1,i1,j1,s2,i2,j2,s3,i3,j3) )
                print_msg(v,"ERROR!  Failed to parse delete angle statement.");
            }
          }
        } else if ( ! strncmp("DIHE",tok[1],4) ) {
          if ( ntok < 6 || (ntok-2)%4 ) {
            print_msg(v,"ERROR!  Failed to parse delete dihedral statement.");
          } else {
            for ( itok = 2; itok < ntok; itok += 4 ) {
              s1 = parse_atom(tok[itok],&i1,&j1);
              s2 = parse_atom(tok[itok+1],&i2,&j2);
              s3 = parse_atom(tok[itok+2],&i3,&j3);
              s4 = parse_atom(tok[itok+3],&i4,&j4);
              if (topo_defs_dihedral(defs,0,1,s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4))
                print_msg(v,"ERROR!  Failed to parse delete dihedral statement.");
            }
          }
        } else if ( ! strncmp("IMPH",tok[1],4) ||
		! strncmp("IMPR",tok[1],4) ) {
          if ( ntok < 6 || (ntok-2)%4 ) {
            print_msg(v,"ERROR!  Failed to parse delete improper statement.");
          } else {
            for ( itok = 2; itok < ntok; itok += 4 ) {
              s1 = parse_atom(tok[itok],&i1,&j1);
              s2 = parse_atom(tok[itok+1],&i2,&j2);
              s3 = parse_atom(tok[itok+2],&i3,&j3);
              s4 = parse_atom(tok[itok+3],&i4,&j4);
              if (topo_defs_improper(defs,0,1,s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4))
                print_msg(v,"ERROR!  Failed to parse delete improper statement.");
            }
          }
        } else if ( ! strncmp("BILD",tok[1],4) ||
		! strncmp("IC",tok[1],4) ) {
          if ( ntok < 6 ) {
            print_msg(v,"ERROR!  Failed to parse delete internal coordinate statement.");
          } else {
            s1 = parse_atom(tok[2],&i1,&j1);
            s2 = parse_atom(tok[3],&i2,&j2);
            s3 = tok[4] + ( tok[4][0] == '*' ? 1 : 0 );
            s3 = parse_atom(s3,&i3,&j3);
            s4 = parse_atom(tok[5],&i4,&j4);
            if ( topo_defs_conformation(defs,0,1,
		s1,i1,j1,s2,i2,j2,s3,i3,j3,s4,i4,j4,
		0,0,0,(tok[4][0]=='*'?1:0),0,0) )
              print_msg(v,"ERROR!  Failed to parse delete internal coordinate statement.");
          }
        } else {
          print_msg(v,"ERROR!  Failed to parse delete statement.");
        }
      }
    }
    else if ( ! strncmp("GROU",tok[0],4) ) {
      debug_msg("Recognized group statement.");
    }
    else if ( ! strncmp("PATC",tok[0],4) ) {
      debug_msg("Recognized patching statement.");
      if ( ntok < 3 || (ntok-1)%2 ) {
        print_msg(v,"ERROR!  Failed to parse patching statement.");
      } else {
        i1 = i2 = 0;
        for ( itok = 1; itok < ntok; itok += 2 ) {
          if ( ! strncmp("FIRS",tok[itok],4) ) {
              i1 = topo_defs_patching_first(defs,0,tok[itok+1]);
          } else if ( ! strncmp("LAST",tok[itok],4) ) {
              i2 = topo_defs_patching_last(defs,0,tok[itok+1]);
          } else {
            print_msg(v,"ERROR!  Failed to parse patching statement.");
          }
        }
        if ( i1 || i2 )
          print_msg(v,"ERROR!  Failed to parse patching statement.");
      }
    }
    else if ( ! strncmp("RESI",tok[0],4) ) {
      debug_msg("Recognized residue statement.");
      if ( ntok < 2 || topo_defs_residue(defs,tok[1],0) ) {
        print_msg(v,"ERROR!  Failed to parse residue statement.");
      }
    }
    else if ( ! strncmp("PRES",tok[0],4) ) {
      debug_msg("Recognized patch residue statement.");
      if ( ntok < 2 || topo_defs_residue(defs,tok[1],1) ) {
        print_msg(v,"ERROR!  Failed to parse patch residue statement.");
      }
    }
    else {
      sprintf(msgbuf,"ERROR!  FAILED TO RECOGNIZE %s",tok[0]);
      print_msg(v,msgbuf);
    }

  }

  topo_defs_end(defs);

  return 0;

}
Exemplo n.º 21
0
Arquivo: reader.c Projeto: qyqx/wisp
/* Read a single sexp from the reader. */
object_t *read_sexp (reader_t * r)
{
  /* Check for a shebang line. */
  if (r->shebang == -1)
    {
      char str[2];
      str[0] = reader_getc (r);
      str[1] = reader_getc (r);
      if (str[0] == '#' && str[1] == '!')
	{
	  /* Looks like a she-bang line. */
	  r->shebang = 1;
	  consume_line (r);
	}
      else
	{
	  r->shebang = 0;
	  reader_putc (r, str[1]);
	  reader_putc (r, str[0]);
	}
    }

  r->done = 0;
  r->error = 0;
  push (r);
  print_prompt (r);
  while (!r->eof && !r->error && (list_empty (r) || stack_height (r) > 1))
    {
      int nc, c = reader_getc (r);
      switch (c)
	{
	case EOF:
	  r->eof = 1;
	  break;

	  /* Comments */
	case ';':
	  consume_line (r);
	  break;

	  /* Dotted pair */
	case '.':
	  nc = reader_getc (r);
	  if (strchr (" \t\r\n()", nc) != NULL)
	    {
	      if (r->state->dotpair_mode > 0)
		read_error (r, "invalid dotted pair syntax");
	      else if (r->state->vector_mode > 0)
		read_error (r, "dotted pair not allowed in vector");
	      else
		{
		  r->state->dotpair_mode = 1;
		  reader_putc (r, nc);
		}
	    }
	  else
	    {
	      /* Turn it into a decimal point. */
	      reader_putc (r, nc);
	      reader_putc (r, '.');
	      reader_putc (r, '0');
	    }
	  break;

	  /* Whitespace */
	case '\n':
	  r->linecnt++;
	  print_prompt (r);
	case ' ':
	case '\t':
	case '\r':
	  break;

	  /* Parenthesis */
	case '(':
	  push (r);
	  break;
	case ')':
	  if (r->state->quote_mode)
	    read_error (r, "unbalanced parenthesis");
	  else if (r->state->vector_mode)
	    read_error (r, "unbalanced brackets");
	  else
	    addpop (r);
	  break;

	  /* Vectors */
	case '[':
	  push (r);
	  r->state->vector_mode = 1;
	  break;
	case ']':
	  if (r->state->quote_mode)
	    read_error (r, "unbalanced parenthesis");
	  else if (!r->state->vector_mode)
	    read_error (r, "unbalanced brackets");
	  else
	    addpop (r);
	  break;

	  /* Quoting */
	case '\'':
	  push (r);
	  add (r, quote);
	  if (!r->error)
	    r->state->quote_mode = 1;
	  break;

	  /* strings */
	case '"':
	  buf_read (r, "\"");
	  add (r, parse_str (r));
	  reader_getc (r);	/* Throw away other quote. */
	  break;

	  /* numbers and symbols */
	default:
	  buf_append (r, c);
	  buf_read (r, " \t\r\n()[];");
	  object_t *o = parse_atom (r);
	  if (!r->error)
	    add (r, o);
	  break;
	}
    }
  if (!r->eof && !r->error)
    consume_whitespace (r);
  if (r->error)
    return err_symbol;

  /* Check state */
  r->done = 1;
  if (stack_height (r) > 1 || r->state->quote_mode
      || r->state->dotpair_mode == 1)
    {
      read_error (r, "premature end of file");
      return err_symbol;
    }
  if (list_empty (r))
    {
      obj_destroy (pop (r));
      return NIL;
    }

  object_t *wrap = pop (r);
  object_t *sexp = UPREF (CAR (wrap));
  obj_destroy (wrap);
  return sexp;
}