avoffset.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:3k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)avoffset.c 1.13 99/10/18 Copyright 1987 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)avoffset.c 1.13 99/10/18 Copyright 1987 J. Schilling";
  5. #endif
  6. /*
  7.  * This program is a tool to generate the file "avoffset.h".
  8.  * It is used by functions that trace the stack to get to the top of the stack.
  9.  *
  10.  * It generates two defines:
  11.  * AV_OFFSET - offset of argv relative to the main() frame pointer
  12.  * FP_INDIR - number of stack frames above main()
  13.  *   before encountering a NULL pointer.
  14.  *
  15.  * Copyright (c) 1987 J. Schilling
  16.  */
  17. /*
  18.  * This program is free software; you can redistribute it and/or modify
  19.  * it under the terms of the GNU General Public License as published by
  20.  * the Free Software Foundation; either version 2, or (at your option)
  21.  * any later version.
  22.  *
  23.  * This program is distributed in the hope that it will be useful,
  24.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.  * GNU General Public License for more details.
  27.  *
  28.  * You should have received a copy of the GNU General Public License
  29.  * along with this program; see the file COPYING.  If not, write to
  30.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  31.  */
  32. #include <mconfig.h>
  33. #include <stdio.h>
  34. #include <standard.h>
  35. #include <stdxlib.h>
  36. #include <signal.h>
  37. #ifdef NO_SCANSTACK
  38. # ifdef HAVE_SCANSTACK
  39. # undef HAVE_SCANSTACK
  40. # endif
  41. #endif
  42. #ifdef HAVE_SCANSTACK
  43. # include <stkframe.h>
  44. #endif
  45. LOCAL RETSIGTYPE handler __PR((int signo));
  46. EXPORT int main __PR((int ac, char** av));
  47. LOCAL RETSIGTYPE
  48. handler(signo)
  49. int signo;
  50. {
  51. fprintf(stderr, "Warning: Cannot scan stack on this environment.n");
  52. exit(0);
  53. }
  54. int main(ac, av)
  55. int ac;
  56. char **av;
  57. {
  58. #ifdef HAVE_SCANSTACK
  59. register struct frame *fp = (struct frame *)getfp();
  60. register int i = 0;
  61. #endif
  62. signal(SIGSEGV, handler);
  63. printf("/*n");
  64. printf(" * This file has been generated automaticallyn");
  65. printf(" * by %sn", sccsid);
  66. printf(" * do not edit by hand.n");
  67. printf(" *n");
  68. printf(" * This file includes definitions for AV_OFFSET and FP_INDIR.n");
  69. printf(" * FP_INDIR is the number of fp chain elements above 'main'.n");
  70. printf(" * AV_OFFSET is the offset of &av[0] relative to the frame pointer in 'main'.n");
  71. printf(" *n");
  72. printf(" * If getav0() does not work on a specific architecturen");
  73. printf(" * the program which generated this include file may dump core.n");
  74. printf(" * In this case, the generated include file does not includen");
  75. printf(" * definitions for AV_OFFSET and FP_INDIR but ends after this comment.n");
  76. printf(" * If AV_OFFSET or FP_INDIR are missing in this file, all programsn");
  77. printf(" * which use the definitions are automatically disabled.n");
  78. printf(" */n");
  79. fflush(stdout);
  80. #ifdef HAVE_SCANSTACK
  81. while (fp->fr_savfp) {
  82. fp = (struct frame *)fp->fr_savfp;
  83. if (fp->fr_savpc == 0)
  84. break;
  85. i++;
  86. }
  87. /*
  88.  * Do not add any printf()'s before this line to allow avoffset
  89.  * to abort without printing more than the comment above.
  90.  */
  91. fp = (struct frame *)getfp();
  92. printf("#define AV_OFFSET %dn", (int)(av-(char **)fp));
  93. printf("#define FP_INDIR %dn", i);
  94. #endif
  95. exit(0);
  96. return (0); /* keep lint happy */
  97. }