interface(extern-c){
  externalLibs = library:: pkgconfig("libxml-2.0").

  include {
      externalLibs = ["stdio.h"]
  }.
}

import raw ("scripts/virtualization/test1.assembly.lp").
import raw ("scripts/virtualization/virtualization.lp").

Annotation = type variant {
  Num:: int,
  String:: string,
  Func:: {name::string, arguments::[Annotation]}
}.

DictEntry = type {Annotation, Id}.
  
extractDictEntry = function(entry:: Annotation):: DictEntry; interpretation(force){
  resultWrong = { String("wrong"), 0 }:: DictEntry.
  
  switch variant (entry)::  DictEntry
  case (Num)    { resultWrong }
  case (String) { resultWrong }
  case (Func){
    domAnn = entry["arguments"][0]:: Annotation.
    
    switch variant ( entry["arguments"][1]->id ):: Annotation
    case (Num)    { {domAnn, id} }
    case (String) { resultWrong }
    case (Func)   { resultWrong }   
  }
}

encodeDomain = function(key::Annotation):: int; interpretation(force){
  dict = intrinsic query("virtDictDomains")::[Annotation].

  id = loop fold(dict->entryAnn::Annotation, 0->id):: int {
      entry = extractDictEntry(entryAnn):: DictEntry.
      
      if(entry[0] == key):: int { entry[1] } else { id }
  }.
  
  id
  
  /*
  buf = "000000000"::string.
  seq
    { sprintf(buf, "%d", id).}
    { buf}
  */
}


main = function:: int; entry {
  encodeDomain(Func({"domainB", []}))
}

/*
openfile = function(fileName::string, prefixPackedAnn:: Annotation) {
  prefixStr = encodeDomain(prefixPackedAnn):: string.
  
  fopen(prefixStr + fileName)
}

main = function:: entry (
  seq
    { context::virtualization(domainA). openFile("test1", intrinsic query("openFileAdditionalArgsDomA")[0]) }
    { context::virtualization(domainB). openFile("test1", intrinsic query("openFileAdditionalArgsDomB")[0]) }
)
*/
