generator.go 3.9 KB

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