]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - util/callgen
8fb382816624e7c05664b76f77497b6bdfbd769a
[z.facultad/75.08/llamadas.git] / util / callgen
1 #!/usr/bin/perl -w
2 #
3 # Generador aleatorio de archivos de llamadas
4 #
5 # Leandro Lucarella - dom oct 17 18:37:05 ART 2004
6 #
7 # Bajo licencia GPL.
8 #
9 # Uso:
10 #      ./callgen [cant_archivos [min_lineas [max_lineas]]]
11 #
12 # cant_archivos         Cantidad de archivos a generar.
13 # min_lines                     Mínima cantidad de líneas que puede tener un archivo.
14 # max_lines                     Máxima cantidad de líneas que puede tener un archivo.
15 #
16 # Por la entrada estándar debe recibir los códigos de países para origen y/o
17 # destino. Toma los dos primeros caracteres por línea como un código, ignorando
18 # el resto, de manera que se puede hacer:
19 #       cat oridesti.txt | ./gencall
20
21 # Configuración
22 $CANT_ARCHS=10;
23 $MIN_LINEAS=1000;
24 $MAX_LINEAS=5000;
25
26 #{{{ Variables globales
27 our @codes; # Códigos de origen/destino
28 #}}}
29
30 #{{{ Funciones
31
32 #{{{ load_codes() - Obtiene códigos de origen/destino de la entrada estándar
33 # Uso: load_codes()
34 sub load_codes()
35 {
36         while (<>)
37         {
38                 ;
39                 push(@codes, substr($_, 0, 2));
40         }
41 }
42 #}}}
43
44 #{{{ get_rnd_code() - Obtiene un códigos de origen/destino al azar
45 # Uso: get_rnd_code()
46 sub get_rnd_code()
47 {
48         my $cant = @codes;
49         return $codes[rnd($cant-1)];
50 }
51 #}}}
52
53 #{{{ rnd() - Genera números aleatorios
54 # Uso: rnd(MAX)      - genera número de 0 a MAX (inclusive)
55 #      rnd(MIN, MAX) - genera número de MIN a MAX (inclusive)
56 #
57 # Nota: respeta el tamaño del campo más chico, es decir, si se usa rnd 01 250,
58 #       el número siempre tendrá al menos 2 dígitos rellenados con ceros, como
59 #       04, 28, 123, 08, etc
60 sub rnd($;$)
61 {
62         my ($ini, $fin) = @_;
63         if (!$fin)
64         {
65                 $fin = $ini;
66                 $ini = 0;
67         }
68         return sprintf('%0'.length($ini).'d', $ini + rand() * ($fin - $ini + 1));
69 }
70 #}}}
71
72 #{{{ Tipos de campos
73 sub aaaa() { return rnd(1999, 2004); }    # año
74 sub mm()   { return rnd("01", 12); }      # mes
75 sub dd()   { return rnd("01", 28); }      # día
76 sub hh()   { return rnd("00", 23); }      # hora
77 sub MM()   { return rnd("00", 59); }      # minutos
78 sub DDDD() { return rnd("0000", 9999); }  # código de central telefónica
79 sub char() { return chr(rnd(65, 90)); }   # caracter aleatorio
80 #}}}
81
82 #{{{ line() - Genera una línea del archivo
83 sub line()
84 {
85         my $f_linea   = rnd(100000, 99999999);
86         my $f_minutos = rnd(1, 150);
87         my $f_fecha   = aaaa().mm().dd();
88         my $f_hora    = dd().hh().MM();
89         my ($f_tipo, $f_orig, $f_dest) = ('', '', '');
90         if (rnd(1) == 1)
91         {
92                 $f_tipo = 'E';
93                 $f_orig = get_rnd_code();
94         }
95         else
96         {
97                 $f_tipo = 'S';
98                 $f_dest = get_rnd_code();
99         }
100         my $f_prest = char().char().char().char().char().char().char().char().char();
101         return "$f_linea;$f_minutos;$f_fecha;$f_hora;$f_tipo;$f_dest;$f_orig;$f_prest";
102 }
103 #}}}
104
105 #{{{ gen() - Genera un archivo con entre MIN y MAX llamadas
106 # Uso: gen(MIN, MAX)
107 sub gen($$)
108 {
109         my ($ini, $fin) = @_;
110         my $file = aaaa().mm().dd().hh().MM().'.'.DDDD();
111         # Mientras exista uno, buscamos un nuevo nombre.
112         $file = aaaa().mm().dd().hh().MM().'.'.DDDD() while (-e $file);
113         open(FH, ">$file") or die("No puedo abrir el archivo $file!\n");
114         for (my $i = rnd($ini, $fin); $i > 0; --$i)
115         {
116                 print FH line()."\n";
117         }
118 }
119 #}}}
120
121 #}}}
122
123 #{{{ Programa
124 srand;
125 my $cant = $ARGV[0] ? $ARGV[0] : $CANT_ARCHS;
126 load_codes();
127 for (my $i = 0; $i < $cant; ++$i)
128 {
129         gen($ARGV[1] ? $ARGV[1] : $MIN_LINEAS, $ARGV[2] ? $ARGV[2] : $MAX_LINEAS);
130 }
131 #}}}
132
133 # vim: set fdm=marker ts=4 sw=4 :