Mercurial Hosting > luan
annotate src/luan/modules/parsers/Csv.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Mon, 12 Nov 2018 02:10:41 -0700 |
| parents | 88b5b81cad4a |
| children | f41919741100 |
| rev | line source |
|---|---|
| 585 | 1 package luan.modules.parsers; |
| 2 | |
| 1267 | 3 import luan.LuanState; |
| 585 | 4 import luan.LuanTable; |
|
1111
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
5 import luan.lib.parser.Parser; |
|
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
6 import luan.lib.parser.ParseException; |
| 585 | 7 |
| 8 | |
| 9 public final class Csv { | |
| 10 | |
| 1267 | 11 public static LuanTable toList(LuanState luan,String line) throws ParseException { |
| 12 return new Csv(line).parse(luan); | |
| 585 | 13 } |
| 14 | |
| 15 private final Parser parser; | |
| 16 | |
| 17 private Csv(String line) { | |
| 18 this.parser = new Parser(line); | |
| 19 } | |
| 20 | |
| 21 private ParseException exception(String msg) { | |
| 22 return new ParseException(parser,msg); | |
| 23 } | |
| 24 | |
| 1267 | 25 private LuanTable parse(LuanState luan) throws ParseException { |
| 26 LuanTable list = new LuanTable(luan); | |
| 585 | 27 while(true) { |
| 28 Spaces(); | |
| 29 String field = parseField(); | |
| 30 list.rawPut(list.rawLength()+1,field); | |
| 31 Spaces(); | |
| 32 if( parser.endOfInput() ) | |
| 33 return list; | |
| 34 if( !parser.match(',') ) | |
| 35 throw exception("unexpected char"); | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 private String parseField() throws ParseException { | |
| 40 parser.begin(); | |
| 41 String rtn; | |
| 42 if( parser.match('"') ) { | |
| 43 int start = parser.currentIndex(); | |
| 44 do { | |
| 45 if( parser.endOfInput() ) { | |
| 46 parser.failure(); | |
| 47 throw exception("unclosed quote"); | |
| 48 } | |
| 49 } while( parser.noneOf("\"") ); | |
| 50 rtn = parser.textFrom(start); | |
| 51 parser.match('"'); | |
| 52 } else { | |
| 53 int start = parser.currentIndex(); | |
| 54 while( !parser.endOfInput() && parser.noneOf(",") ); | |
| 55 rtn = parser.textFrom(start).trim(); | |
| 56 } | |
| 57 return parser.success(rtn); | |
| 58 } | |
| 59 | |
| 60 private void Spaces() { | |
| 61 while( parser.anyOf(" \t") ); | |
| 62 } | |
| 63 | |
| 64 } |
