]> git.llucax.com Git - z.facultad/75.29/susanita.git/blob - src/parser.cpp
f15b9c7ee2bec68585456461c7029755c3b3085c
[z.facultad/75.29/susanita.git] / src / parser.cpp
1 #include "parser.h"
2 #include <string>
3 #include <cassert>
4 #include <sstream>
5 #include <fstream>
6 #include <iostream>
7 #include <algorithm>
8
9 Parser::
10 Parser(Susanita& s):
11         susanita(s)
12 {
13 }
14
15 // Para no exportar los símbolos (uso interno de este módulo)
16 namespace
17 {
18         /// Saca espacios de una palabra
19         std::string strip(std::string s)
20         {
21                 std::istringstream ss(s);
22                 ss >> s;
23                 return s;
24         }
25
26         /// Devuelve palabra hasta el caracter indicado
27         std::string get_hasta(std::istream& is, char hasta)
28         {
29                 std::string s;
30                 std::getline(is, s, hasta);
31                 return strip(s);
32         }
33 }
34
35 bool
36 Parser::
37 input(const std::string& filename)
38 {
39         std::ifstream f(filename.c_str());
40         if (!f)
41                 return false;
42         Persona::sexo_type sexo = Persona::M;
43         Persona::sexo_type opuesto = Persona::F;
44         std::string l;
45         while (std::getline(f, l))
46         {
47                 l = strip(l);
48                 // la linea vacia alterna de sexo
49                 if (l.empty())
50                 {
51                         sexo = Persona::F;
52                         opuesto = Persona::M;
53                         continue;
54                 }
55
56                 // obtenemos el nombre y la lista
57                 std::istringstream ss(l);
58                 std::string nombre = get_hasta(ss, ':');
59                 Persona* pp = susanita.get_persona(nombre);
60                 if (!pp)
61                 {
62                         pp = new Persona(nombre, sexo);
63                         susanita.add_persona(pp);
64                 }
65
66                 Persona::prefs_type prefs;
67                 while (ss)
68                 {
69                         std::string nombre = get_hasta(ss, ',');
70                         Persona* ppp = susanita.get_persona(nombre);
71                         if (!ppp)
72                         {
73                                 ppp = new Persona(nombre, opuesto);
74                                 susanita.add_persona(ppp);
75                         }
76                         pp->prefs.push_back(ppp);
77                 }
78         }
79         return true;
80 }
81
82 void
83 Parser::
84 output() const
85 {
86         for (Susanita::personas_type::const_iterator ih
87                         = susanita.hombres.begin();
88                         ih != susanita.hombres.end(); ++ih)
89         {
90                 Persona& h = **ih;
91                 assert(h.estado == Persona::COMPROMETIDO);
92                 std::cout << h.nombre << ", " << h.pareja->nombre << "\n";
93         }
94         std::cout << "\n";
95         for (Susanita::personas_type::const_iterator im
96                         = susanita.mujeres.begin();
97                         im != susanita.mujeres.end(); ++im)
98         {
99                 Persona& m = **im;
100                 assert(m.estado == Persona::COMPROMETIDO);
101                 std::cout << m.nombre << ", " << m.pareja->nombre << "\n";
102         }
103 }
104