// delay.c: retardo de transmisión y de propagación de un paquete en un enlace.
//
//   ./delay <bytes> <Mbps> <km> [velocidad en m/s]
//
// Por defecto la velocidad de propagación es 2e8 m/s, la de la luz en fibra.
#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_SPEED 2e8

// Convierte un argumento a un número positivo, o termina con un mensaje.
static double parse_positive(const char *text, const char *name) {
    char *end;
    double value = strtod(text, &end);
    if (end == text || *end != '\0' || value <= 0) {
        fprintf(stderr, "delay: %s no es un número positivo: %s\n", name, text);
        exit(EXIT_FAILURE);
    }
    return value;
}

int main(int argc, char *argv[]) {
    if (argc != 4 && argc != 5) {
        fprintf(stderr, "uso: %s <bytes> <Mbps> <km> [velocidad en m/s]\n", argv[0]);
        return EXIT_FAILURE;
    }
    double bits = parse_positive(argv[1], "el tamaño") * 8;
    double rate = parse_positive(argv[2], "la velocidad") * 1e6;
    double meters = parse_positive(argv[3], "la distancia") * 1e3;
    double speed = argc == 5 ? parse_positive(argv[4], "la propagación") : DEFAULT_SPEED;

    double transmission = bits / rate;
    double propagation = meters / speed;

    printf("transmision L/R = %10.3f ms\n", transmission * 1e3);
    printf("propagacion d/s = %10.3f ms\n", propagation * 1e3);
    if (transmission > propagation) {
        printf("domina la transmision, %.1f veces mayor\n", transmission / propagation);
    } else {
        printf("domina la propagacion, %.1f veces mayor\n", propagation / transmission);
    }
    return EXIT_SUCCESS;
}
