Globali
{
   //Non sarai così stupido da metterlo vuoto, vero?!
   listSeparator "" ";"
}

Funzioni
{
   string lstTok ( VAR string lista )
   {
      Result = strTok( lista, $listSeparator)
   }

   number lstLen ( string lista )
   {
      Result = 0
      if( lista == "") { EXITSUB() }

      Result = 1
      listaPos = 0
      listaSepLen = STRLEN($listSeparator)
      while( numSet( listaPos, STR_INDEX_OF( lista, listaPos, $listSeparator)) >= 0)
      {
         inc(Result)
         listaPos = listaPos + listaSepLen
      }
   }

   number lstMatch ( string lista , string elemento )
   {
      Result = 0

      if( lista == "") { EXITSUB() }

      listaSep = $listSeparator
      while( listaSep == $listSeparator)
      {
         if( strSep( lista, listaSep) == elemento) { inc(Result) }
      }
   }

   number lstAdd ( VAR string lista , string elemento )
   {
      Result = 1

      if( lista == "") { lista = elemento EXITSUB() }

      lista = STRCAT( lista, $listSeparator, elemento)
   }

   number lstDel ( VAR string lista , string elemento )
   {
      Result = 0

      if( lista == "") { EXITSUB() }

      elementoSep = $listSeparator
      while( elementoSep == $listSeparator)
      {
         elm = strSep( elemento, elementoSep)

         listaNew = ""

         listaSep = $listSeparator
         while( listaSep == $listSeparator)
         {
            listaElm = strSep( lista, listaSep)
            if( listaElm == elm) { inc(Result) continue }

            lstAdd( listaNew, listaElm)
         }

         lista = listaNew
      }
   }

   number lstClean ( VAR string lista )
   {
      Result = lstDel( lista, "")
   }

   number lstAddUniq ( VAR string lista , string elemento )
   {
      Result = 0
      if( lista == "") { lista = elemento EXITSUB() }

      if( lstDel( lista, elemento) <= 0) { Result = 1 }
      lstAdd( lista, elemento)
   }

   number lstDedup ( VAR string lista )
   {
      Result = 0

      if( lista == "") { EXITSUB() }

      listaNew = ""

      listaNum=0
      listaSep = $listSeparator
      while( listaSep == $listSeparator)
      {
         listaElm = strSep( lista, listaSep)

         Result = Result + lstDel( lista, listaElm)

         //HACK: lstAdd non aggiunge elementi vuoti a liste vuote, quindi baro e lo tratto come elemento finale
         if( listaNew == "" & listaElm == "") { lstAdd( lista, listaElm) continue }

         lstAdd( listaNew, listaElm)
      }

      lista = listaNew
   }

   number lstToArr ( string lista , number idx , string array , number converti )
   {
      Result = -1

      if( array == "")      { EXITSUB() }

      if( idx != -1
        & IS_IDX(idx) != 1) { EXITSUB() }

      Result = 0
      listaSep = $listSeparator
      while( listaSep == $listSeparator)
      {
         listaElm = strSep( lista, listaSep)

         VAR_VALUE_SET( idx, array, inc(Result))
         if( converti > 0) { VAR_VALUE_SET( idx, GetArrayVar( array, Result), ATOI(listaElm)) }
         else              { VAR_VALUESTR_SET( idx, GetArrayVar( array, Result), listaElm)    }
      }
   }

   string lstFromArr ( number idx , string array )
   {
      Result = ""

      if( array == "")      { EXITSUB() }

      if( idx != -1
        & IS_IDX(idx) != 1) { EXITSUB() }

      arrayLen = VAR_VAL( idx, array)
      if( arrayLen <= 0)    { EXITSUB() }

      arrayNum = 0
      while( inc(arrayNum) <= arrayLen)
      {
         lstAdd( Result, strVal( idx, GetArrayVar( array, arrayNum)))
      }
   }

   string lstVars ( number idx , string variabili , string formato )
   {
      Result = ""

      if( variabili == "")  { EXITSUB() }

      if( idx != -1
        & IS_IDX(idx) != 1) { EXITSUB() }

      if( formato == "") { formato = "{}" }

      variabile = ""
      while( strSet( variabile, lstTok(variabili)) != "")
      {
         if( EVAL( "vars = FMT( formato, variabile)") < 0)
         {
            DISPLAY2( FMT( "lstVars: formato {} non valido!", formato))
            EXITSUB()
         }

         if( VAR_EXIST( idx, vars))  { lstAdd( Result, vars) continue }

         LISTA_VARIABILI( idx, 0, "vars", vars)
         varNum = 0
         while( inc(varNum) <= vars) { lstAdd( Result, vars[varNum])  }
      }
   }

   string lstVals ( number idx , string variabili , string formato )
   {
      Result = ""

      if( idx != -1
        & IS_IDX(idx) != 1) { EXITSUB() }

      variabili = lstVars( idx, variabili, formato)
      if( variabili == "")  { EXITSUB() }

      variabile = ""
      while( strSet( variabile, lstTok(variabili)) != "")
      {
         lstAdd( Result, strVal( idx, variabile))
      }
   }
}
