ushas

carstat

Apr 27th, 2011
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.15 KB | None | 0 0
  1. #!/PUZZO DI MERDA E NON MI LAVO MAI!
  2.  
  3. #!/bin/bash
  4.  
  5. #scompone le stringhe dei file fino a ricavare l'ultima citta', quella di arrivo
  6. function trova_arrivo {
  7.     y=`expr index "$string" "$"`
  8.     #itero fino all'ultima occorrenza del carattere $
  9.     while [[ $y -ne 0 ]]; do
  10.         string=${string:$y}
  11.         y=`expr index "$string" "$"`
  12.     done
  13. }
  14.  
  15. #distinguo i due casi: ho l'opzione -a oppure non ho l'opzione -a
  16. function check_arrivo {
  17.     if [[ $arrivo = default ]]; then
  18.         inserisci
  19.     else
  20.         trova_arrivo
  21.         if [[ $string = $arrivo ]]; then
  22.             inserisci
  23.         fi
  24.     fi
  25. }
  26.  
  27. #distinguo i due casi: ho l'opzione -p oppure non ho l'opzione -p; in entrambi i casi dovro' verificare se ho o meno l'opzione -a
  28. function check_partenza {
  29.     if [[ $partenza = default ]]; then
  30.         check_arrivo
  31.     else
  32.         y=`expr index "$string" "$"`
  33.         part=${string:0:`expr $y - 1`}
  34.         string=${string:$y}
  35.         #mi interessano solo le stringhe in cui la citta' di partenza coincide con quella passata come parametro
  36.         if [[ $part = $partenza ]]; then
  37.             check_arrivo
  38.         fi
  39.     fi
  40. }
  41.  
  42. #gestisce gli array degli utenti e delle offerte e richieste a loro corrispondenti
  43. function inserisci {
  44.     bool_off=0
  45.     bool_rich=0
  46.     index_array=0
  47.    
  48.     #cerco se nell'array degli utenti l'offerente e/o il richiedente estratti dalla stringa corrente sono gia' presenti
  49.     while [[ $index_array -lt ${#utenti[@]} && ( bool_off -eq 0 || bool_rich -eq 0 ) ]]; do
  50.         if [[ -n $off && ${utenti[$index_array]} = $off ]]; then
  51.             #se c'e' gia' l'offerente, incremento l'elemento corrispondente nell'array delle offerte accettate
  52.             offerte[$index_array]=`expr ${offerte[$index_array]} + 1`
  53.             bool_off=1
  54.         elif [[ -n $rich && ${utenti[$index_array]} = $rich ]]; then
  55.             #se c'e' gia' il richiedente, incremento l'elemento corrispondente nell'array delle richieste accettate
  56.             richieste[$index_array]=`expr ${richieste[$index_array]} + 1`
  57.             bool_rich=1
  58.         fi
  59.         index_array=`expr $index_array + 1`
  60.     done
  61.        
  62.     #se l'offerente non c'e', lo aggiungo nell'array degli utenti e metto a 1 le sue offerte accettate
  63.     if [[ -n $off && $bool_off -eq 0 ]]; then
  64.         utenti[${#utenti[@]}]=$off
  65.         offerte[${#offerte[@]}]=1
  66.         richieste[${#richieste[@]}]=0
  67.     fi
  68.        
  69.     #se il richiedente non c'e', lo aggiungo nell'array degli utenti e metto a 1 le sue richieste accettate
  70.     if [[ -n $rich && $bool_rich -eq 0 ]]; then
  71.         utenti[${#utenti[@]}]=$rich
  72.         offerte[${#offerte[@]}]=0
  73.         richieste[${#richieste[@]}]=1
  74.     fi
  75. }
  76.  
  77. #metto tutti i parametri in una variabile
  78. param=("$@")
  79.  
  80. #length e' la sua lunghezza
  81. length=$#
  82.  
  83. utente=default
  84. arrivo=default
  85. partenza=default
  86.  
  87. if [[ "$#" -eq "0" ]];
  88.     then
  89.     #se non ci sono parametri, esco
  90.     exit 1
  91. fi
  92.  
  93. counter=0
  94. #inserisco i nomi dei file validi in file e li rimuovo da param
  95. while [[ $counter -lt $length ]]; do
  96.     if [[ -s ${param[$counter]} ]]; then
  97.         #accedo alla posizione pari alla lunghezza dell'array
  98.         log[${#log[@]}]=${param[$counter]}
  99.         unset param[$counter]
  100.     fi
  101.     counter=`expr $counter + 1`
  102. done
  103.  
  104. if [[ ${#log[@]} -eq 0 ]]; then
  105.     #se non ci sono file validi esco
  106.     exit 1
  107. fi
  108.  
  109. #devo aggiornare length alla lunghezza attuale di param
  110. length=`expr $length - ${#log[@]}`
  111.  
  112. counter=0
  113.  
  114. while [[ $counter -lt $length ]]; do
  115.     #ogni volta controllo che sia la prima volta che trovo questa opzione (variabile a default) e che il parametro dopo non sia un'altra opzione
  116.     case ${param[$counter]:0:2} in
  117.          -u) if [[ ${param[`expr $counter + 1`]:0:1} != "-" &&  $utente = default ]]; then
  118.                 utente=${param[`expr $counter + 1`]}
  119.             else
  120.                 exit 1
  121.             fi
  122.             ;;
  123.          -a) if [[ ${param[`expr $counter + 1`]:0:1} != "-" && $arrivo = default ]]; then
  124.                 arrivo=${param[`expr $counter + 1`]}
  125.             else
  126.                 exit 1
  127.             fi
  128.             ;;
  129.          -p) if [[ ${param[`expr $counter + 1`]:0:1} != "-" && $partenza = default ]]; then
  130.                 partenza=${param[`expr $counter + 1`]}
  131.             else
  132.                 exit 1
  133.             fi
  134.             ;;
  135.          *) exit 1
  136.             ;;
  137.     esac
  138.     #devo incrementare di 2 per arrivare alla prossima opzione
  139.     counter=`expr $counter + 2`
  140. done
  141.  
  142. counter=0
  143. #inizio a scorrere l'array dei file
  144. while [[ $counter -lt ${#log[@]} ]]; do
  145.     #apro il file corrente in sola lettura
  146.     exec 3< ${log[$counter]}
  147.     read -u 3 string
  148.     #scorro il file finche' ci sono stringhe da leggere
  149.     while [[ -n $string ]]; do
  150.         #cerco la prima occorrenza del carattere $ nella stringa corrente
  151.         y=`expr index "$string" "$"`
  152.         #l'offerente e' il pezzetto di stringa precedente
  153.         off=${string:0:`expr $y - 1`}
  154.         #la nuova stringa partira' dal carattere immediatamente seguente la prima occorrenza di $
  155.         string=${string:$y}
  156.         #faccio uguale per il richiedente
  157.         y=`expr index "$string" "$"`
  158.         rich=${string:0:`expr $y - 1`}
  159.         string=${string:$y}
  160.         if [[ $utente = default ]]; then
  161.             check_partenza
  162.         else
  163.             if [[ $off = $utente ]]; then
  164.                 rich=""
  165.                 check_partenza
  166.             fi
  167.             if [[ $rich = $utente ]]; then
  168.                 off=""
  169.                 check_partenza
  170.             fi
  171.         fi         
  172.        
  173.         #itero
  174.         read -u 3 string
  175.     done
  176.    
  177.     #chiudo il file descriptor
  178.     exec 3>&-
  179.    
  180.     #vado a leggere il file seguente
  181.     counter=`expr $counter + 1`
  182. done
  183.  
  184. #stampo i risultati
  185. cont=0
  186. while [[ cont -lt ${#utenti[@]} ]]; do
  187.     echo ${utenti[$cont]}:${offerte[$cont]}:${richieste[$cont]}
  188.     cont=`expr $cont + 1`
  189. done
  190.  
  191. exit 0
Advertisement
Add Comment
Please, Sign In to add comment