Mostrando entradas con la etiqueta patch. Mostrar todas las entradas
Mostrando entradas con la etiqueta patch. Mostrar todas las entradas

viernes, 19 de agosto de 2011

Aplicando parches con diff.

En los proyectos de software libre es común que los programadores envíen sus parches de código fuente a un proyecto dado. La forma de aplicar los parches es con el comando patch.

Supongamos que tenemos el siguiente código fuente:
fib1.c
#include 
#include 

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  if (n <= 0)
    return 0;
  if (n == 1)
    return 1;
  return fib(n - 1) + fib(n - 2);
}

int main(int argc, char** argv)
{
  if (argc < 2) {
    fprintf(stderr, "Need an argument.\n");
    return 1;
  }

  printf("%d\n", fib(atoi(argv[1])));
  return 0;
}
Y hemos recibido el siguiente parche: fib-linear-time.patch
--- fib1.c 
+++ fib2.c 
@@ -4,11 +4,17 @@
 /* Find the nth Fibonacci number. */
 static int fib(int n)
 {
-  if (n <= 0)
-    return 0;
-  if (n == 1)
-    return 1;
-  return fib(n - 1) + fib(n - 2);
+  int prev = 1;
+  int current = 0;
+  int i;
+
+  for (i = 0; i < n; i++) {
+    int next = current + prev;
+    prev = current;
+    current = next;
+  }
+
+  return current;
 }
 
 int main(int argc, char** argv)
Para aplicar el parche simplemente debemos ejecutar la siguiente orden desde consola:
patch < fib-linear-time.patch
Y con esto nuestro archivo fib1.c quedaría de la forma siguiente: fib1.c
#include 
#include 

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  int prev = 1;
  int current = 0;
  int i;

  for (i = 0; i < n; i++) {
    int next = current + prev;
    prev = current;
    current = next;
  }

  return current;
}

int main(int argc, char** argv)
{
  if (argc < 2) {
    fprintf(stderr, "Need an argument.\n");
    return 1;
  }

  printf("%d\n", fib(atoi(argv[1])));
  return 0;
}