source: branches/port5/PERL2ARB/ARB_ext.c

Last change on this file was 6100, checked in by westram, 15 years ago
  • fix warning "format not a string literal and no format arguments"
    • GB_export_error → GB_export_error/GB_export_errorf
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.1 KB
Line 
1void GBP_callback(GBDATA *gbd, int *cl, GB_CB_TYPE cb_type){
2    char *perl_func;
3    char *perl_cl;
4    dSP ;
5    I32 i;
6    SV *sv;
7    perl_func = (char *)cl;
8    perl_cl = perl_func + strlen(perl_func) + 1;
9
10    PUSHMARK(sp);
11    sv =  sv_newmortal();
12    sv_setref_pv(sv, "GBDATAPtr", (void*)gbd);
13    XPUSHs(sv);
14    XPUSHs(sv_2mortal(newSVpv(perl_cl, 0)));
15    if (cb_type & GB_CB_DELETE) {
16        XPUSHs(sv_2mortal(newSVpv("DELETED", 0)));
17    }else{
18        XPUSHs(sv_2mortal(newSVpv("CHANGED", 0)));
19    }
20
21    PUTBACK;
22    i = perl_call_pv(perl_func,G_DISCARD);
23    if (i) {
24        croak("Your perl function '%s' should not return any values",perl_func);
25    }
26    return; 
27}
28
29
30static GB_HASH *gbp_cp_hash_table = 0;
31
32GB_ERROR GBP_add_callback(GBDATA *gbd, char *perl_func, char *perl_cl){
33    char     *data  = 0;
34    char     *arg   = 0;
35    GB_ERROR  error = 0;
36
37    if (gbp_cp_hash_table ==0) gbp_cp_hash_table = GBS_create_hash(4096, GB_MIND_CASE);
38   
39    data = (char *)calloc(1,strlen(perl_func) + strlen(perl_cl) + 100);
40    arg  = (char *)calloc(1,strlen(perl_func) + strlen(perl_cl) + 2);
41    sprintf(arg,"%s%c%s",perl_func,'\0',perl_cl);
42    sprintf(data,"%p:%s%c%s",gbd,perl_func,'\1',perl_cl);
43    if (!GBS_read_hash(gbp_cp_hash_table,data)){
44        GBS_write_hash(gbp_cp_hash_table,data,(long)data);
45        error = GB_add_callback(gbd,GB_CB_DELETE|GB_CB_CHANGED,GBP_callback, (int *)arg);
46    }else{
47        free(arg);
48    }
49    free(data);
50    return error;
51}
52
53GB_ERROR GBP_remove_callback(GBDATA *gbd, char *perl_func, char *perl_cl){
54    char *data = 0;
55    char *arg = 0;
56    if (gbp_cp_hash_table ==0) gbp_cp_hash_table = GBS_create_hash(4096, GB_MIND_CASE);
57    data = (char *)calloc(1,strlen(perl_func) + strlen(perl_cl) + 100);
58    sprintf(data,"%p:%s%c%s",gbd,perl_func,'\1',perl_cl);
59    arg =(char *)GBS_read_hash(gbp_cp_hash_table,data);
60    if (!arg){
61        free(data);
62        return GB_export_errorf("Sorry: You never installed a callback '%s:%s'",perl_func,perl_cl);
63    }else{
64        GBS_write_hash(gbp_cp_hash_table,data,0);
65        free(data);
66        free(arg);
67        GB_remove_callback(gbd,GB_CB_DELETE|GB_CB_CHANGED,GBP_callback, (int *)data);
68    }
69    return 0;
70}
71
72
73char *static_pntr = 0;
Note: See TracBrowser for help on using the repository browser.