summaryrefslogtreecommitdiffstats
path: root/src/Atom.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/Atom.vala')
-rw-r--r--src/Atom.vala54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/Atom.vala b/src/Atom.vala
new file mode 100644
index 0000000..bb3a6fd
--- /dev/null
+++ b/src/Atom.vala
@@ -0,0 +1,54 @@
+namespace Eva {
+ public class Atom : Object, Term {
+ public string value {get; construct;}
+
+ public Atom(string v) {
+ assert(v.validate());
+ Object(value: v);
+ }
+
+ public string to_string() {
+ if(value.length == 0)
+ return "''";
+
+ bool special = false;
+ unichar c = value.get_char();
+
+ if(!c.islower())
+ special = true;
+
+ for(unowned string rest = value.next_char(); rest.length != 0 && !special; rest = rest.next_char()) {
+ c = rest.get_char();
+
+ if(!(c == '_' || c.isalnum()))
+ special = true;
+ }
+
+ if(!special) {
+ return value;
+ }
+ else {
+ return "'" + value.replace("\\", "\\\\").replace("'", "\\'") + "'";
+ }
+ }
+
+ protected bool do_match(Term o, Gee.Map<string, Term> vars, Gee.Map<string, string> aliases) {
+ if(o is Var) {
+ return o.do_match(this, vars, aliases);
+ }
+
+ if(o is Atom) {
+ return value == (o as Atom).value;
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void encode(Erl.Buffer buffer) {
+ char[]? array = string_to_array(value);
+ assert(array != null);
+ buffer.encode_atom(array);
+ }
+ }
+}