levy@ttrdc.UUCP (Daniel R. Levy) (11/02/85)
I have a question that I hope some wizard can answer, with respect to achieving multiple function-entries in C. I know this is possible in Fortran; a module might look like: subroutine a(i,j) i = j/i entry b(i,j) i = i + j return end and the resulting assembly code would look something like this (please excuse the length--this is from the f77 compiler with the -Sg options; more text follows): .globl a_ .globl b_ .align 4 .text .align 4 a_: save &.R1 addw2 &.F1,%sp jmp .L13 .L14: divw3 *0(%ap),*4(%ap),*0(%ap) jmp .L17 .align 4 b_: save &.R1 addw2 &.F1,%sp jmp .L16 .L17: addw3 *4(%ap),*0(%ap),*0(%ap) jmp .L12 .L12: .L11: ret &0 .set .R1,0 .set .FSP1,12 .L13: movw 0(%ap),4(%fp) movw 4(%ap),8(%fp) addw3 &4,%fp,%ap .set .F1,0+.FSP1 jmp .L14 .L16: movw 0(%ap),4(%fp) movw 4(%ap),8(%fp) addw3 &4,%fp,%ap .set .F1,0+.FSP1 jmp .L17 Now in C, I am aware of the setjmp and longjmp facilities, which allow you to mark a place in a higher level module and return to it later at will from a lower level module. But this seems to be very much the reverse, where you want to jump into the middle of a lower level module. This can conceivably be a great code-saving technique, where two "different" functions that have a lot in common can share that code without putting the code in yet another function and increasing the function-calling overhead. But I am at a loss as to how to express this in C. Any hints or pointers [:-)] will be appreciated.... -- ------------------------------- Disclaimer: The views contained herein are | dan levy | yvel nad | my own and are not at all those of my em- | an engihacker @ | ployer or the administrator of any computer | at&t computer systems division | upon which I may hack. | skokie, illinois | -------------------------------- Path: ..!ihnp4!ttrdc!levy -- ------------------------------- Disclaimer: The views contained herein are | dan levy | yvel nad | my own and are not at all those of my em- | an engihacker @ | ployer or the administrator of any computer | at&t computer systems division | upon which I may hack. | skokie, illinois | -------------------------------- Path: ..!ihnp4!ttrdc!levy
bilbo.niket@LOCUS.UCLA.EDU (Niket K. Patwardhan) (11/04/85)
Can't do it. But (if you can stand it) you might try func(x,x,x, caseid) { switch(caseid) { case 1: blah blah blah ; break; case 2: blah blah; break; } /* Common stuff */ } BTW, original K&R C had "entry" defined as a keyword but never told you what to do with it! Look it up, you will find it in the list of reserved keywords!