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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)getav0.c 1.9 99/09/11 Copyright 1985 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)getav0.c 1.9 99/09/11 Copyright 1985 J. Schilling";
  5. #endif
  6. /*
  7.  * Get arg vector by scanning the stack
  8.  *
  9.  * Copyright (c) 1985 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26. #include <mconfig.h>
  27. #include <sigblk.h>
  28. #include <avoffset.h>
  29. #include <standard.h>
  30. #if !defined(AV_OFFSET) || !defined(FP_INDIR)
  31. # ifdef HAVE_SCANSTACK
  32. # undef HAVE_SCANSTACK
  33. # endif
  34. #endif
  35. #ifdef NO_SCANSTACK
  36. # ifdef HAVE_SCANSTACK
  37. # undef HAVE_SCANSTACK
  38. # endif
  39. #endif
  40. #ifdef HAVE_SCANSTACK
  41. #include <stkframe.h>
  42. #define is_even(p) ((((long)(p)) & 1) == 0)
  43. #define even(p) (((long)(p)) & ~1L)
  44. #ifdef __future__
  45. #define even(p) (((long)(p)) - 1)/* will this work with 64 bit ?? */
  46. #endif
  47. char **getavp()
  48. {
  49. register struct frame *fp;
  50. register struct frame *ofp;
  51.  char **av;
  52. #if FP_INDIR > 0
  53. register int i = 0;
  54. #endif
  55. ofp = fp = (struct frame *)getfp();
  56. while (fp) {
  57. #if FP_INDIR > 0
  58. i++;
  59. #endif
  60. ofp = fp;
  61. if (!is_even(fp->fr_savfp)) {
  62. fp = (struct frame *)even(fp->fr_savfp);
  63. fp = (struct frame *)((SIGBLK *)fp)->sb_savfp;
  64. continue;
  65. }
  66. fp = fp->fr_savfp;
  67. }
  68. #if FP_INDIR > 0
  69. i -= FP_INDIR;
  70.         ofp = fp = (struct frame *)getfp();
  71. while (fp) {
  72. if (--i < 0)
  73. break;
  74. ofp = fp;
  75. if (!is_even(fp->fr_savfp)) {
  76. fp = (struct frame *)even(fp->fr_savfp);
  77. fp = (struct frame *)((SIGBLK *)fp)->sb_savfp;
  78. continue;
  79. }
  80. fp = fp->fr_savfp;
  81. }
  82. #endif
  83.         av = (char **)ofp + AV_OFFSET; /* aus avoffset.h */
  84. /* (wird generiert mit av_offset) */
  85. return (av);
  86. }
  87. char *getav0()
  88. {
  89. return (getavp()[0]);
  90. }
  91. #else
  92. char *getav0()
  93. {
  94. return ("???");
  95. }
  96. #endif /* HAVE_SCANSTACK */