working on "duff" example led me to futzing with gdb, found out the gdb tutorial is kinda (a lot) outdated
This commit is contained in:
37
gowrikumar/src/11-duff.c
Normal file
37
gowrikumar/src/11-duff.c
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* :author: Dan Buch (daniel.buch@gmail.com)
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void duff(register char *to, register char *from, register int count)
|
||||
{
|
||||
register int n = (count + 7) / 8;
|
||||
switch (count % 8) {
|
||||
case 0: do { *to++ = *from++;
|
||||
case 7: *to++ = *from++;
|
||||
case 6: *to++ = *from++;
|
||||
case 5: *to++ = *from++;
|
||||
case 4: *to++ = *from++;
|
||||
case 3: *to++ = *from++;
|
||||
case 2: *to++ = *from++;
|
||||
case 1: *to++ = *from++;
|
||||
} while (--n > 0);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
char * to = "dogs cats babies";
|
||||
char * from = "monkey hat pants";
|
||||
int i = 16;
|
||||
printf("to = %s\n", to);
|
||||
printf("from = %s\n", from);
|
||||
/* And here comes the segfault... */
|
||||
duff(to, from, i);
|
||||
printf("to = %s\n", to);
|
||||
printf("from = %s\n", from);
|
||||
}
|
||||
|
||||
/* vim:filetype=c:fileencoding=utf-8
|
||||
*/
|
40
gowrikumar/src/11b-duff.c
Normal file
40
gowrikumar/src/11b-duff.c
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* :author: Dan Buch (daniel.buch@gmail.com)
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void duff(register char *to, register char *from, register int count)
|
||||
{
|
||||
register int n;
|
||||
|
||||
int remainder = count % 8;
|
||||
if (remainder == 0) {
|
||||
n = (count + 7) / 8;
|
||||
do {
|
||||
*to++ = *from++;
|
||||
} while (--n > 0);
|
||||
} else if (remainder <= 7 && remainder > 0) {
|
||||
int i;
|
||||
int c;
|
||||
for (i = 0; (c = from[i] && c != EOF); i++) {
|
||||
to[i] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
char * to = "dogs cats babies";
|
||||
char * from = "monkey hat pants";
|
||||
int i = 11;
|
||||
printf("to = %s\n", to);
|
||||
printf("from = %s\n", from);
|
||||
/* And here comes the segfault... */
|
||||
duff(to, from, i);
|
||||
printf("to = %s\n", to);
|
||||
printf("from = %s\n", from);
|
||||
}
|
||||
|
||||
/* vim:filetype=c:fileencoding=utf-8
|
||||
*/
|
Reference in New Issue
Block a user