]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - inst/callgen
Bugfix.
[z.facultad/75.08/llamadas.git] / inst / 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 $MIN_ANIO   = "1999";
26 $MAX_ANIO   = "2004";
27 $MIN_COD    = "0000";
28 $MAX_COD    = "9999";
29
30 #{{{ Variables globales
31 our @codes; # Códigos de origen/destino
32 #}}}
33
34 #{{{ Funciones
35
36 #{{{ load_codes() - Obtiene códigos de origen/destino de la entrada estándar
37 # Uso: load_codes()
38 sub load_codes()
39 {
40         push(@codes, substr($_, 0, 2)) while (<STDIN>);
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($MIN_ANIO, $MAX_ANIO); } # 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($MIN_COD, $MAX_COD); }   # 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 :