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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)avoffset.c 1.12 99/09/11 Copyright 1987 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)avoffset.c 1.12 99/09/11 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. #ifdef NO_SCANSTACK
  37. # ifdef HAVE_SCANSTACK
  38. # undef HAVE_SCANSTACK
  39. # endif
  40. #endif
  41. #ifdef HAVE_SCANSTACK
  42. # include <stkframe.h>
  43. #endif
  44. EXPORT int main __PR((int ac, char** av));
  45. int main(ac, av)
  46. int ac;
  47. char **av;
  48. {
  49. #ifdef HAVE_SCANSTACK
  50. register struct frame *fp = (struct frame *)getfp();
  51. register int i = 0;
  52. #endif
  53. printf("/*n");
  54. printf(" * This file has been generated automaticallyn");
  55. printf(" * by %sn", sccsid);
  56. printf(" * do not edit by hand.n");
  57. printf(" *n");
  58. printf(" * This file includes definitions for AV_OFFSET and FP_INDIR.n");
  59. printf(" * FP_INDIR is the number of fp chain elements above 'main'.n");
  60. printf(" * AV_OFFSET is the offset of &av[0] relative to the frame pointer in 'main'.n");
  61. printf(" *n");
  62. printf(" * If getav0() does not work on a specific architecturen");
  63. printf(" * the program which generated this include file may dump core.n");
  64. printf(" * In this case, the generated include file does not includen");
  65. printf(" * definitions for AV_OFFSET and FP_INDIR but ends after this comment.n");
  66. printf(" * If AV_OFFSET or FP_INDIR are missing in this file, all programsn");
  67. printf(" * which use the definitions are automatically disabled.n");
  68. printf(" */n");
  69. fflush(stdout);
  70. #ifdef HAVE_SCANSTACK
  71. printf("#define AV_OFFSET %dn", (int)(av-(char **)fp));
  72. while (fp->fr_savfp) {
  73. fp = (struct frame *)fp->fr_savfp;
  74. if (fp->fr_savpc == 0)
  75. break;
  76. i++;
  77. }
  78. printf("#define FP_INDIR %dn", i);
  79. #endif
  80. exit(0);
  81. return (0); /* keep lint happy */
  82. }