File: luaext_parse_basic_io.cc

package info (click to toggle)
monotone 0.48-3
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 20,096 kB
  • ctags: 8,077
  • sloc: cpp: 81,000; sh: 6,402; perl: 1,241; lisp: 1,045; makefile: 655; python: 566; sql: 112; ansic: 52
file content (86 lines) | stat: -rw-r--r-- 2,413 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright (C) 2006 Timothy Brownawell <tbrownaw@gmail.com>
//
// This program is made available under the GNU GPL version 2.0 or
// greater. See the accompanying file COPYING for details.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE.

#include "base.hh"
#include "lua.hh"

#include "basic_io.hh"

using std::vector;
using std::string;
using std::pair;
using std::make_pair;

LUAEXT(parse_basic_io, )
{
  // This has no notion of a 'stanza'. It assumes a 'line' is a symbol
  // followed by one or more string or hex values. It returns a table of
  // lines.
  vector<pair<string, vector<string> > > res;
  const string str(luaL_checkstring(LS, -1), lua_strlen(LS, -1));
  basic_io::input_source in(str, "monotone_parse_basic_io_for_lua");
  in.made_from = origin::user;
  basic_io::tokenizer tok(in);
  try
    {
      string got;
      basic_io::token_type tt;
      do
        {
          tt = tok.get_token(got);
          switch (tt)
            {
            case basic_io::TOK_SYMBOL:
              res.push_back(make_pair(got, vector<string>()));
              break;
            case basic_io::TOK_STRING:
            case basic_io::TOK_HEX:
              E(!res.empty(), origin::user, F("bad input to parse_basic_io"));
              res.back().second.push_back(got);
              break;
            default:
              break;
            }
        }
      while (tt != basic_io::TOK_NONE);
    }
  catch (recoverable_failure & e)
    {// there was a syntax error in our string
      lua_pushnil(LS);
      return 1;
    }
  lua_newtable(LS);
  int n = 1;
  for (vector<pair<string, vector<string> > >::const_iterator i = res.begin();
        i != res.end(); ++i)
    {
      lua_newtable(LS);
      lua_pushstring(LS, i->first.c_str());
      lua_setfield(LS, -2, "name");
      lua_newtable(LS);
      int m = 1;
      for (vector<string>::const_iterator j = i->second.begin();
            j != i->second.end(); ++j)
        {
          lua_pushstring(LS, j->c_str());
          lua_rawseti(LS, -2, m++);
        }
      lua_setfield(LS, -2, "values");
      lua_rawseti(LS, -2, n++);
    }
  return 1;
}

// Local Variables:
// mode: C++
// fill-column: 76
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: