// - Nome:
// - Sinossi:
// - Descrizione:
// - Parametri:
// - Risultato:
// - Variabili globali:
// - Esempi:

Funzioni
{
   number Stringa_Posizione_Carattere ( string stringa, string carattere, number occorrenze_numero , number offset )
   {
      Result = -1

      if( stringa == ""
        | carattere == "")       { EXITSUB() }

      char_pos = STR_INDEX_OF( stringa, 0, carattere)
      if( char_pos < 0)          { EXITSUB() }

      occorrenza_numero = 0
      while( char_pos != -1)
      {
         Result = char_pos
         occorrenza_numero = occorrenza_numero + 1

         char_pos = -1
         if( occorrenze_numero <= 0
           | occorrenza_numero < occorrenze_numero)
         {
            char_pos = STR_INDEX_OF( stringa, Result + 1, carattere)
         }
      }

      Result = Result + offset
   }

   string Stringa_Ripeti_Volte ( string stringa, string separatore, number volte )
   {
      Result = ""
      if( volte <= 0)                 { EXITSUB() }

      Result = stringa
      if( volte == 1)                 { EXITSUB() }

      wk_volta = 0
      while( inc(wk_volta) < volte)
      {
         Result = STRCAT( Result, separatore, stringa)
      }
   }

   string Stringa_Ripeti_Lunghezza ( string stringa, number caratteri )
   {
      Result = stringa
      if( caratteri == 0)                 { EXITSUB() }

      verso = -1
      if( caratteri < 0) { verso = 1 }
      caratteri = ABS(caratteri)

      stringa_lunghezza = STRLEN(stringa)
      if( stringa_lunghezza <= 0
        | caratteri <= stringa_lunghezza) { EXITSUB() }

      Result = ""
      Result_len = 0
      while( Result_len <= caratteri)
      {
         Result = STRCAT( Result, stringa)
         Result_len = Result_len + stringa_lunghezza
      }

      if( verso < 0) { Result = LEFT( Result, caratteri)  }
      if( verso > 0) { Result = RIGHT( Result, caratteri) }
   }

   string Stringa_Riempi_Lunghezza ( string stringa, string riempitivo , number caratteri )
   {
      Result = stringa
      if( caratteri == 0)                 { EXITSUB() }

      verso = -1
      if( caratteri < 0) { verso = 1 }
      caratteri = ABS(caratteri)

      stringa_lunghezza = STRLEN(stringa)
      if( caratteri <= stringa_lunghezza) { EXITSUB() }

      if( riempitivo == "") { riempitivo = " " }
      riempitivo = Stringa_Ripeti_Lunghezza( riempitivo, verso*(caratteri - stringa_lunghezza))

      if( verso < 0) { Result = STRCAT( riempitivo, stringa) }
      if( verso > 0) { Result = STRCAT( stringa, riempitivo) }
   }

   string Stringa_Capitalizza ( string stringa )
   {
      stringa_lunghezza = STRLEN(stringa)
      if( stringa_lunghezza <= 0) { Result = ""              EXITSUB() }
      if( stringa_lunghezza == 1) { Result = UPPER(stringa)  EXITSUB() }

      stringa = LOWER(stringa)
      Result = STRCAT( UPPER( LEFT( stringa, 1)), RIGHT( stringa, stringa_lunghezza - 1))
   }

   // Dato il valore stringa di una variabile, restituisce la prima sottostringa non vuota delimitata da separatore
   // La variabile di partenza viene man mano erosa, fino a risultare vuota.
   // Al termine viene restituita una stringa vuota
   string strTok ( VAR string stringa, string separatore )
   {
      if( stringa == "") { EXITSUB() }
      if( separatore == "")
      {
         Result  = stringa
         stringa = ""

         break
      }

      Result  = ""
      str_len = STRLEN(stringa)
      sep_len = STRLEN(separatore)

      while( Result == "")
      {
         sep_pos = STR_INDEX_OF( stringa, 0, separatore)

         if( sep_pos < 0)
         {
            Result  = stringa
            stringa = ""

            break
         }

         if( sep_pos > 0)
         {
            Result  = STRMID( 0, sep_pos, stringa)
         }

         sep_pos = sep_pos + sep_len
         stringa = STRMID( sep_pos, str_len - sep_pos, stringa)
      }
   }

   // Dato il valore stringa di una variabile, restituisce la prima sottostringa, anche vuota, delimitata da separatore.
   // La variabile di partenza viene man mano erosa, fino a risultare vuota.
   // Al termine la variabile del separatore risulterà vuota
   string strSep ( VAR string stringa, VAR string separatore )
   {
      if( separatore == "")
      {
         Result  = stringa
         stringa = ""

         EXITSUB()
      }

      str_len = STRLEN(stringa)
      sep_len = STRLEN(separatore)
      sep_pos = STR_INDEX_OF( stringa, 0, separatore)

      if( sep_pos < 0)
      {
         Result  = stringa
         stringa = ""
         separatore = ""

         EXITSUB()
      }

      Result  = STRMID( 0, sep_pos, stringa)

      sep_pos = sep_pos + sep_len
      stringa = STRMID( sep_pos, str_len - sep_pos, stringa)
   }

   string strSet ( VAR string variabile , string stringa )
   {
      Result    = stringa
      variabile = stringa
   }

   string strVal ( number idx , string variabile )
   {
      Result = ""

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

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

      varType = VAR_TYPE( idx, variabile)
      while( varType >= 0)
      {
         if( varType == 0) { Result = STR( VAR_VAL( idx, variabile)) break }
         if( varType == 1) { Result = VAR_VAL_STR( idx, variabile)   break }
         if( varType == 2) { Result = FMT( "[{},{},{}]", STR( VAR_VAL( idx, STRCAT( variabile, ".x"))), STR( VAR_VAL( idx, STRCAT( variabile, ".y"))), STR( VAR_VAL( idx, STRCAT( variabile, ".z")))) break }

         break
      }
   }

   number strToIdx ( string idxStr )
   {
      Result = -2

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

      idx = ATOI(idxStr)
      if( STR(idx) != idxStr) { EXITSUB() }

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

      Result = idx
   }

   //Duale di CHR2STR
   number strToChr ( string str , number chrMin , number chrMax )
   {
      Result = -1
      if( str == "")        { EXITSUB() }

      if( chrMin < 0
        | chrMin > 255)     { chrMin = 0   }
      if( chrMax < 0
        | chrMax > 255
        | chrMax <= chrMin) { chrMax = 255 }

      str = LEFT( str, 1)
      strVar = FMT( "wk_strToChr_{}", str)

      if( VAR_EXIST( -1, strVar)) {
         Result = VAR_VAL( -1, strVar)
         EXITSUB()
      }

      chr = chrMin - 1
      while( inc(chr) <= chrMax) {
         if( str != CHR2STR(chr)) { continue }

         Result = chr
         VAR_CREATE_NUM( -1, strVar, chr, $MODE_NOSAVE, "")

         break
      }
   }

   number alfaNum ( string str , number case )
   {
      Result = -1
      chr = strToChr( str, 65, 122)

      // A-Z
      if( chr >= 65 & chr <= 90) { Result = chr - 65      EXITSUB() }

      // a-z
      if( chr >= 97 & chr <= 122) {
         if( case != 1)          { Result = chr - 97      EXITSUB() }
         else                    { Result = chr - 65 - 6  EXITSUB() }
      }
   }
}
