home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / ma64.dms / ma64.adf / FTPMount-1.0 / Source / verify_code.h < prev    next >
Text File  |  1995-09-06  |  11KB  |  469 lines

  1. /*
  2.  * This source file is Copyright 1995 by Evan Scott.
  3.  * All rights reserved.
  4.  * Permission is granted to distribute this file provided no
  5.  * fees beyond distribution costs are levied.
  6.  */
  7.  
  8. #ifdef VERIFY
  9. unsigned char verify_buffer[200];
  10.  
  11. static int make_int(int pos, int n)
  12. {
  13.     if (!n) return pos;
  14.  
  15.     pos = make_int(pos, n / 10);
  16.     verify_buffer[pos] = (n % 10) + '0';
  17.  
  18.     return pos + 1;
  19. }
  20.  
  21. static int make_int_f(int pos, int n)
  22. {
  23.     if (n == 0) {
  24.         verify_buffer[pos++] = '0';
  25.         return pos;
  26.     }
  27.  
  28.     if (n < 0) {
  29.         verify_buffer[pos++] = '-';
  30.         return make_int(pos, -n);
  31.     } else {
  32.         return make_int(pos, n);
  33.     }
  34. }
  35.  
  36. static int make_string(int pos, char *s)
  37. {
  38.     strcpy(&verify_buffer[pos], s);
  39.     return (int)(pos + strlen(s));
  40. }
  41.  
  42. static int make_char(int pos, char c)
  43. {
  44.     verify_buffer[pos] = c;
  45.  
  46.     return pos + 1;
  47. }
  48.  
  49. void __saveds verify_alert(char *file, int line, char *a, char *b)
  50. {
  51.     int i;
  52.  
  53.     Forbid();
  54.  
  55.     i = 0;
  56.     
  57.     i = make_char(i, 0);
  58.     i = make_char(i, 10);
  59.     i = make_char(i, 15);
  60.     i = make_string(i, file);
  61.     i = make_string(i, " line ");
  62.     i = make_int(i, line);
  63.     i = make_string(i, ": ");
  64.     i = make_string(i, a);
  65.     i = make_string(i, " is not a ");
  66.     i = make_string(i, b);
  67.     i = make_char(i, 0);
  68.     i = make_char(i, 0);
  69.  
  70. //    sprintf(verify_buffer, "%c%c%cVerify alert in %s line %d: %s is not a %s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
  71.     DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  72.     Permit();
  73. }
  74.  
  75. void __saveds truth_alert(char *file, int line, char *a)
  76. {
  77.     int i;
  78.  
  79.     Forbid();
  80.  
  81.     i = 0;
  82.  
  83.     i = make_char(i, 0);
  84.     i = make_char(i, 10);
  85.     i = make_char(i, 15);
  86.     i = make_string(i, file);
  87.     i = make_string(i, " line ");
  88.     i = make_int(i, line);
  89.     i = make_string(i, ": ");
  90.     i = make_string(i, a);
  91.     i = make_string(i, " is not TRUE");
  92.     i = make_char(i, 0);
  93.     i = make_char(i, 0);
  94.     
  95. //    sprintf(verify_buffer, "%c%c%c%s line %d: %s is not TRUE%c%c", 0, 10, 15, file, line, a, 0, 0);
  96.     DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  97.     Permit();
  98. }
  99.  
  100. void __saveds false_alert(char *file, int line, char *a)
  101. {
  102.     int i;
  103.  
  104.     Forbid();
  105.     
  106.     i = 0;
  107.  
  108.     i = make_char(i, 0);
  109.     i = make_char(i, 10);
  110.     i = make_char(i, 15);
  111.     i = make_string(i, file);
  112.     i = make_string(i, " line ");
  113.     i = make_int(i, line);
  114.     i = make_string(i, ": ");
  115.     i = make_string(i, a);
  116.     i = make_string(i, " is not FALSE");
  117.     i = make_char(i, 0);
  118.     i = make_char(i, 0);
  119.  
  120. //    sprintf(verify_buffer, "%c%c%c%s line %d: %s is not FALSE%c%c", 0, 10, 15, file, line, a, 0, 0);
  121.     DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  122.     Permit();
  123. }
  124.  
  125. void __saveds int_alert(char *file, int line, char *a, int b)
  126. {
  127.     int i;
  128.  
  129.     Forbid();
  130.     i = 0;
  131.  
  132.     i = make_char(i, 0);
  133.     i = make_char(i, 10);
  134.     i = make_char(i, 15);
  135.     i = make_string(i, file);
  136.     i = make_string(i, " line ");
  137.     i = make_int(i, line);
  138.     i = make_string(i, ": ");
  139.     i = make_string(i, a);
  140.     i = make_char(i, '=');
  141.     i = make_int_f(i, b);
  142.     i = make_char(i, 0);
  143.     i = make_char(i, 0);
  144.     
  145. //    sprintf(verify_buffer, "%c%c%c%s line %d: %s=%d%c%c", 0, 10, 15, file, line, a, b, 0, 0);
  146.     DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  147.     Permit();
  148. }
  149.  
  150. void __saveds string_alert(char *file, int line, char *a, char *b)
  151. {
  152.     int i;
  153.  
  154.     Forbid();
  155.     
  156.     i = 0;
  157.  
  158.     i = make_char(i, 0);
  159.     i = make_char(i, 10);
  160.     i = make_char(i, 15);
  161.     i = make_string(i, file);
  162.     i = make_string(i, " line ");
  163.     i = make_int(i, line);
  164.     i = make_string(i, ": ");
  165.     i = make_string(i, a);
  166.     i = make_char(i, '=');
  167.     i = make_string(i, b);
  168.     i = make_char(i, 0);
  169.     i = make_char(i, 0);
  170.  
  171. //    sprintf(verify_buffer, "%c%c%c%s line %d: %s=%s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
  172.     DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  173.     Permit();
  174. }
  175.  
  176. /* struct List memlist; */
  177.  
  178. void __saveds track_init(void)
  179. {
  180.     struct Task *me;
  181.     
  182.     me = FindTask(0);
  183.     truth(me != 0);
  184.     truth(me->tc_UserData == 0);
  185.     me->tc_UserData = 0;
  186. }
  187.  
  188. void * __saveds track_malloc(int size, unsigned long type, unsigned long flags, char *file, int line, char *a, char *b)
  189. {
  190.     struct bink *block;
  191.     int i;
  192.     
  193.     if (size <= 0 || size > 100000) {  /* the positive is arbitrary */
  194.         Forbid();
  195.         
  196.         i = 0;
  197.         
  198.         i = make_char(i, 0);
  199.         i = make_char(i, 10);
  200.         i = make_char(i, 15);
  201.         i = make_string(i, "Illegal malloc size of ");
  202.         i = make_int_f(i, size);
  203.         i = make_string(i, " in ");
  204.         i = make_string(i,  file);
  205.         i = make_string(i, " line ");
  206.         i = make_int(i, line);
  207.         i = make_string(i, ": allocating ");
  208.         i = make_string(i, a);
  209.         i = make_string(i, " to be ");
  210.         i = make_string(i, b);
  211.         i = make_char(i, 0);
  212.         i = make_char(i, 0);
  213.         
  214. //        sprintf(verify_buffer, "%c%c%cIllegal malloc size of %d in %s line %d: allocating %s to be %s%c%c", 0, 10, 15, size, file, line, a, b, 0, 0);
  215.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  216.         Permit();
  217.         return 0;
  218.     }
  219.     
  220.     block = (struct bink *)AllocMem(size + sizeof(struct bink), flags);
  221.     if (!block) {
  222.         Forbid();
  223.         
  224.         i = 0;
  225.         
  226.         i = make_char(i, 0);
  227.         i = make_char(i, 10);
  228.         i = make_char(i, 15);
  229.         i = make_string(i, "Malloc failure in ");
  230.         i = make_int_f(i, size);
  231.         i = make_string(i, " in ");
  232.         i = make_string(i,  file);
  233.         i = make_string(i, " line ");
  234.         i = make_int(i, line);
  235.         i = make_string(i, ": allocating ");
  236.         i = make_string(i, a);
  237.         i = make_string(i, " to be ");
  238.         i = make_string(i, b);
  239.         i = make_char(i, 0);
  240.         i = make_char(i, 0);
  241.  
  242. //        sprintf(verify_buffer, "%c%c%cMalloc failure in %s line %d: allocating %s to be %s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
  243.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
  244.         Permit();
  245.         return 0;
  246.     }
  247.     
  248.     block->prev = (struct bink **)&(FindTask(0)->tc_UserData);
  249.     block->next = *(block->prev);
  250.     *(block->prev) = block;
  251.     if (block->next) block->next->prev = &(block->next);
  252.  
  253.     block->type = type;
  254.     block->size = size;
  255.     block->file = file;
  256.     block->line = line;
  257.     block->typename = b;
  258.  
  259.     return (void *)((unsigned char *)block + sizeof(struct bink));
  260. }
  261.  
  262. void __saveds track_free(void *block, unsigned long type, char *file, int line, char *a, char *b)
  263. {
  264.     int i;
  265.     struct bink *rblock;
  266.     rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
  267.  
  268.     if (rblock->type != type) {
  269.         Forbid();
  270.         
  271.         i = 0;
  272.         
  273.         i = make_char(i, 0);
  274.         i = make_char(i, 10);
  275.         i = make_char(i, 15);
  276.         i = make_string(i, "Illegal FREE in ");
  277.         i = make_string(i, file);
  278.         i = make_string(i, " line ");
  279.         i = make_int(i, line);
  280.         i = make_char(i, ':');
  281.         i = make_char(i, 0);
  282.         i = make_char(i, 1);
  283.         
  284.         i = make_char(i, 0);
  285.         i = make_char(i, 10);
  286.         i = make_char(i, 25);
  287.         i = make_string(i, "freeing ");
  288.         i = make_string(i, a);
  289.         i = make_string(i, " which should be ");
  290.         i = make_string(i, b);
  291.         i = make_char(i, 0);
  292.         i = make_char(i, 1);
  293.         
  294.         i = make_char(i, 0);
  295.         i = make_char(i, 10);
  296.         i = make_char(i, 35);
  297.         i = make_string(i, "Allocated in ");
  298.         i = make_string(i, rblock->file);
  299.         i = make_string(i, " line ");
  300.         i = make_int(i, rblock->line);
  301.         i = make_char(i, 0);
  302.         i = make_char(i, 0);
  303.  
  304. /*        sprintf(verify_buffer, "%c%c%cIllegal FREE in %s line %d:%c%c"
  305.              "%c%c%cfreeing %s which should be %s%c%c"
  306.              "%c%c%cAllocated in %s line %d%c%c",
  307.               0, 10, 15, file, line, 0, 1,
  308.               0, 10, 25, a, b, 0, 1,
  309.               0, 10, 35, rblock->file, rblock->line, 0, 0); */
  310.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
  311.         Permit();
  312.         return;
  313.     }
  314.     
  315.     *(rblock->prev) = rblock->next;
  316.     if (rblock->next) rblock->next->prev = rblock->prev;
  317.  
  318.     rblock->type = 0xffffffff;
  319.     FreeMem(rblock, rblock->size + sizeof(struct bink));
  320. }
  321.  
  322. void __saveds track_disown(void *block, unsigned long type, char *file, int line, char *a, char *b)
  323. {
  324.     int i;
  325.     struct bink *rblock;
  326.     rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
  327.  
  328.     if (rblock->type != type) {
  329.         Forbid();
  330.         
  331.         i = 0;
  332.         
  333.         i = make_char(i, 0);
  334.         i = make_char(i, 10);
  335.         i = make_char(i, 15);
  336.         i = make_string(i, "Illegal DISOWN in ");
  337.         i = make_string(i, file);
  338.         i = make_string(i, " line ");
  339.         i = make_int(i, line);
  340.         i = make_char(i, ':');
  341.         i = make_char(i, 0);
  342.         i = make_char(i, 1);
  343.         
  344.         i = make_char(i, 0);
  345.         i = make_char(i, 10);
  346.         i = make_char(i, 25);
  347.         i = make_string(i, "disowning ");
  348.         i = make_string(i, a);
  349.         i = make_string(i, " which should be ");
  350.         i = make_string(i, b);
  351.         i = make_char(i, 0);
  352.         i = make_char(i, 1);
  353.         
  354.         i = make_char(i, 0);
  355.         i = make_char(i, 10);
  356.         i = make_char(i, 35);
  357.         i = make_string(i, "Allocated in ");
  358.         i = make_string(i, rblock->file);
  359.         i = make_string(i, " line ");
  360.         i = make_int(i, rblock->line);
  361.         i = make_char(i, 0);
  362.         i = make_char(i, 0);
  363.  
  364.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
  365.         Permit();
  366.         return;
  367.     }
  368.     
  369.     *(rblock->prev) = rblock->next;
  370.     if (rblock->next) rblock->next->prev = rblock->prev;
  371. }
  372.  
  373. void __saveds track_adopt(void *block, unsigned long type, char *file, int line, char *a, char *b)
  374. {
  375.     int i;
  376.     struct bink *rblock;
  377.     rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
  378.  
  379.     if (rblock->type != type) {
  380.         Forbid();
  381.         
  382.         i = 0;
  383.         
  384.         i = make_char(i, 0);
  385.         i = make_char(i, 10);
  386.         i = make_char(i, 15);
  387.         i = make_string(i, "Illegal ADOPT in ");
  388.         i = make_string(i, file);
  389.         i = make_string(i, " line ");
  390.         i = make_int(i, line);
  391.         i = make_char(i, ':');
  392.         i = make_char(i, 0);
  393.         i = make_char(i, 1);
  394.         
  395.         i = make_char(i, 0);
  396.         i = make_char(i, 10);
  397.         i = make_char(i, 25);
  398.         i = make_string(i, "adopting ");
  399.         i = make_string(i, a);
  400.         i = make_string(i, " which should be ");
  401.         i = make_string(i, b);
  402.         i = make_char(i, 0);
  403.         i = make_char(i, 1);
  404.         
  405.         i = make_char(i, 0);
  406.         i = make_char(i, 10);
  407.         i = make_char(i, 35);
  408.         i = make_string(i, "Allocated in ");
  409.         i = make_string(i, rblock->file);
  410.         i = make_string(i, " line ");
  411.         i = make_int(i, rblock->line);
  412.         i = make_char(i, 0);
  413.         i = make_char(i, 0);
  414.  
  415.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
  416.         Permit();
  417.         return;
  418.     }
  419.     
  420.     rblock->prev = (struct bink **)&(FindTask(0)->tc_UserData);
  421.     rblock->next = *(rblock->prev);
  422.     *(rblock->prev) = rblock;
  423.     if (rblock->next) rblock->next->prev = &(rblock->next);
  424. }
  425.  
  426. void __saveds track_check(void)
  427. {
  428.     struct bink *a;
  429.     int i;
  430.     
  431.     for (a = (struct bink *)FindTask(0)->tc_UserData; a; a = a->next) {
  432.         Forbid();
  433.         
  434.         i = 0;
  435.         
  436.         i = make_char(i, 0);
  437.         i = make_char(i, 10);
  438.         i = make_char(i, 15);
  439.         i = make_char(i, '(');
  440.         i = make_string(i, FindTask(0)->tc_Node.ln_Name);
  441.         i = make_string(i, ") Unfreed block of type ");
  442.         i = make_string(i, a->typename);
  443.         i = make_char(i, 0);
  444.         i = make_char(i, 1);
  445.  
  446.         i = make_char(i, 0);
  447.         i = make_char(i, 10);
  448.         i = make_char(i, 25);
  449.         i = make_string(i, "Allocated in ");
  450.         i = make_string(i, a->file);
  451.         i = make_string(i, " line ");
  452.         i = make_int(i, a->line);
  453.         i = make_char(i, 0);
  454.         i = make_char(i, 0);
  455.  
  456. /*        sprintf(verify_buffer, "%c%c%c(%s) Unfreed block of type %s%c%c"
  457.              "%c%c%cAllocated in %s line %d%c%c",
  458.               0, 10, 15, FindTask(0)->tc_Node.ln_Name, a->typename, 0, 1,
  459.               0, 10, 25, a->file, a->line, 0, 0); */
  460.         DisplayAlert(RECOVERY_ALERT, verify_buffer, 45);
  461.         a->type = ~0;
  462.         Permit();
  463. /*        FreeMem(a, a->size); */
  464.     }
  465.     
  466.     FindTask(0)->tc_UserData = 0;
  467. }
  468. #endif
  469.