generator.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package mod
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "container/list"
  7. "math/rand"
  8. "time"
  9. "unicode"
  10. "strings"
  11. "strconv"
  12. )
  13. func caricaFile(file_da_leggere string) *os.File {
  14. /*
  15. lettura file.
  16. nel caso di errore, ritorna nil
  17. */
  18. /*
  19. verificare anche che il file non sia qualche altra cosa
  20. */
  21. fi,err := os.Stat(file_da_leggere)
  22. if err != nil {
  23. fmt.Println("Errore analisi file",err)
  24. return nil
  25. }
  26. switch mode := fi.Mode(); {
  27. case mode.IsDir():
  28. // do directory stuff
  29. fmt.Println("directory")
  30. return nil
  31. case mode.IsRegular():
  32. // do file stuff
  33. fmt.Println("file")
  34. }
  35. /*
  36. apertura quindi del file
  37. */
  38. f,err := os.Open(file_da_leggere)
  39. if err != nil {
  40. fmt.Println("Errore apertura files",err)
  41. return nil
  42. }
  43. // fmt.Println("Valore tornato:",f)
  44. return f
  45. }
  46. func scansioneFile(result *os.File) *list.List {
  47. /*
  48. effettua la lettura del file attraverso
  49. un apposito buffer.
  50. */
  51. l := list.New()
  52. fs := bufio.NewScanner(result)
  53. for fs.Scan() {
  54. /*
  55. l è una lista che viene
  56. alimentata leggendo il file di testo bufferizzato
  57. */
  58. l.PushBack(fs.Text())
  59. }
  60. if err := fs.Err(); err != nil {
  61. fmt.Println("Errore finale:",err)
  62. return nil
  63. }
  64. return l
  65. }
  66. func returnRandom(l int) int {
  67. /*
  68. ritorna un numero random da 0 a l
  69. ogni volta resetta il contatore
  70. */
  71. r1 := rand.NewSource(time.Now().UnixNano())
  72. s1 := rand.New(r1)
  73. return s1.Intn(l)+1
  74. }
  75. func returnStringCharUp(stringa string) string {
  76. /*
  77. prende una stringa e cambia lo stato di un carattere (da lower a upper e viceversa)
  78. */
  79. lunghezza := len(stringa)
  80. random := returnRandom(lunghezza) -1
  81. s := []byte(stringa)
  82. if unicode.IsUpper(rune(s[random])) {
  83. s[random]=byte(unicode.ToLower(rune(s[random])))
  84. } else {
  85. s[random]=byte(unicode.ToUpper(rune(s[random])))
  86. }
  87. return string(s)
  88. }
  89. func returnStringToLower(stringa string) string {
  90. /*
  91. ritorna la stringa passata in lower.mode
  92. */
  93. return strings.ToLower(stringa)
  94. }
  95. func estraeDaFile(filedaleggere string) string {
  96. /*
  97. effettua la lettura vera e propria del file
  98. */
  99. result := caricaFile(filedaleggere)
  100. if result == nil {
  101. fmt.Printf("Errore di lettura file '%s', esco.\n",filedaleggere)
  102. os.Exit(98)
  103. }
  104. /*
  105. effettua la scansione e il caricamento in memoria
  106. */
  107. l := scansioneFile(result)
  108. if l == nil {
  109. fmt.Println("Errore di lettura, esco.")
  110. return ""
  111. }
  112. defer result.Close()
  113. // estrae un valore a caso da 0 alla lunghezza del file.
  114. position := returnRandom(l.Len())
  115. counter := 0
  116. risultato1 := " "
  117. /*
  118. estrae una riga dal file in base a 'position'
  119. */
  120. for e := l.Front(); e != nil; e = e.Next() {
  121. if position == counter {
  122. risultato1 = fmt.Sprintf("%s",e.Value)
  123. }
  124. counter++
  125. }
  126. return risultato1
  127. }
  128. func RunNumber(lunghezza int) string {
  129. /*
  130. ritorna il numero di elementi indicati racchiusi in una string
  131. */
  132. risultato := ""
  133. for i:=0;i<lunghezza;i++ {
  134. risultato = risultato + strconv.Itoa(returnRandom(9))
  135. }
  136. return risultato
  137. }
  138. func Run(filedaleggere string, verbose bool) string {
  139. /*
  140. vengono effettuati diversi passaggi:
  141. lettura del file
  142. passaggio della frase estratta a tutto minuscolo
  143. scelta random di una lettera da far diventare maiuscola
  144. estrazione di simboli
  145. esrazione di numeri
  146. */
  147. fmt.Println("Verbose",verbose)
  148. risultato1 := estraeDaFile(filedaleggere)
  149. risultato1 = returnStringToLower(risultato1)
  150. risultato1 = returnStringCharUp(risultato1)
  151. /* estrae un simbolo */
  152. var simboli string = "\"'!?,.;:#%"
  153. simbolo1 := simboli[returnRandom(len(simboli))-1]
  154. simbolo2 := simboli[returnRandom(len(simboli))-1]
  155. elementi := []int{returnRandom(9),returnRandom(9),returnRandom(9),returnRandom(9)}
  156. stringa := fmt.Sprintf("%d%d%c%s%c%d%d",elementi[0],elementi[1],simbolo1,risultato1,simbolo2,elementi[2],elementi[3])
  157. return stringa
  158. // qui ci sarebbe da aggiungere un sistema per personalizzare il formato sulla base della stringa che dovrebbe venir passata
  159. }