/* @(#)gen_macros.c 2.1 93/05/19 */ /******************************************************************************/ /* function : gen_macros.c */ /* */ /* subsystem : chgen */ /* */ /* input : */ /* */ /* output : (writes to schema .h output file) */ /* */ /* returns : void */ /* */ /* author : Cheng */ /* */ /* created : July, 1989 */ /* */ /* revisions : 93s523: modified code to work with table abbrev's of size */ /* hcg_abbr_size. */ /* 11/30/2000 kmiu -NT port: included prototypes.h */ /* 11/30/2000 kmiu -Removed unreferenced variables */ /* 11/30/2000 kmiu -Added two "void"s to gen_pr_add_macros(), */ /* gen_pr_link_macros(), gen_pr_link_macros(), */ /* gen_pr_free_macros() to match them with */ /* there prototypes in prototypes.h */ /* 11/30/2000 kmiu -Removed leading type cast in */ /* (pa *) ca%scurr2->p%s_fpp (etc.) on NT only */ /* 12/02/2000 kmiu -Added else stmt to if (!cli_nobp) when */ /* printing out child link and unlink macros. */ /* Without the else stmt, the link and unlink */ /* macros for nobp are also printed out when */ /* only the bp macros should be */ /* 12/02/2000 kmiu -Made a similar change for parent link and */ /* unlink macros. */ /* 2kf522 kmiu & mottesen STL modifications: Modified macros*/ /* to use STL iterators instead of row ptrs. */ /* Old versions of macros are ifdef'd out. */ /* (#ifndef USE_STL) */ /* kmiu & mottesen Fixed bug in old version of */ /* unlink_parent_nobp_m which was using an */ /* invalid XXcurr2 that had never been set */ /* */ /* description : This routine traverses the contents of the PINDEX and */ /* PATHTABLE structures, outputing access macro definitions */ /* to the output schema .h file. */ /* */ /******************************************************************************/ #include #include #include "chgen_define.h" #include "chgen_externs.h" #include "prototypes.h" void gen_macros() { static char rcsid[] = "$Id: gen_macros.c,v 1.2.4.1 1999/05/04 16:59:47 jkarner Exp $"; char child_abbrev[ABBREV_NAME_LENGTH], parent_abbrev[ABBREV_NAME_LENGTH]; char temp_string[ABBREV_NAME_LENGTH]; struct rr_type *curr_ptr ; int i, j, m; fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* The following macros are called access macros. Each macro represents */\n"); fprintf(schh_fp,"/* a path upwards through the schema from the first listed table (the child) */\n"); fprintf(schh_fp,"/* to the second listed table (the parent). Actually, the parent could be */\n"); fprintf(schh_fp,"/* an ancestor (grandparent, etc...). The macro itself is designed to be */\n"); fprintf(schh_fp,"/* used in code where the user would normally type in a potentially long */\n"); fprintf(schh_fp,"/* structure access statement, up along xxid_pp pointers. The macros not only*/\n"); fprintf(schh_fp,"/* minimize typing and chances of error, they also give the user a very small */\n"); fprintf(schh_fp,"/* degree of data independence. For example, if a new table is developed and */\n"); fprintf(schh_fp,"/* is placed between two tables in the original schema, the macros will */\n"); fprintf(schh_fp,"/* reflect the change, and the user does not have to change any code. */\n"); fprintf(schh_fp,"/* One major restriction is that a macro will only be generated if the path */\n"); fprintf(schh_fp,"/* is unique. However, access macros can be compounded together, letting */\n"); fprintf(schh_fp,"/* the user specify what to do to get around a point of ambiguity in the */\n"); fprintf(schh_fp,"/* parent chain. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); for ( i = 0 ; i < MAXTABLES ; i++ ) for ( j = 0 ; j < MAXTABLES ; j++ ) { if (PINDEX[i][j].PathIsUnique == 1) { strncpy_null(child_abbrev,PATHTABLE[PINDEX[i][j].UniqPathindex].PathName,hcg_abbr_size); strncpy_null(parent_abbrev,(char *)&(PATHTABLE[PINDEX[i][j].UniqPathindex].PathName[hcg_abbr_size+2]),hcg_abbr_size); fprintf ( schh_fp, "#define " ); fprintf ( schh_fp, "%s__%s ",child_abbrev,parent_abbrev); if (PINDEX[i][j].PathIsUnique > 1) fprintf ( schh_fp, "/* path is not unique */" ) ; m = hcg_abbr_size ; while ( m < hcg_abbr_size*PATHTABLE[PINDEX[i][j].UniqPathindex].PathLength) { strncpy_null(temp_string, (char *)&PATHTABLE[PINDEX[i][j].UniqPathindex].PathBody[m], hcg_abbr_size); fprintf ( schh_fp, "%sid_pp->", temp_string); m += hcg_abbr_size ; } strncpy_null(temp_string, (char *)&PATHTABLE[PINDEX[i][j].UniqPathindex].PathBody[m], hcg_abbr_size); fprintf ( schh_fp, "%sid_pp", temp_string); fprintf ( schh_fp, "\n" ) ; curr_ptr = cp_table; while (curr_ptr) /* Looking for alternative paths. */ { if((strncmp(child_abbrev, curr_ptr->firstid, hcg_abbr_size)==0)&& (strncmp(parent_abbrev, curr_ptr->secondid, hcg_abbr_size)==0)&& (strlen(curr_ptr->secondid)>hcg_abbr_size+2)) { fprintf ( schh_fp, "#define " ); strncpy_null(temp_string,curr_ptr->secondid, hcg_abbr_size); fprintf ( schh_fp, "%s__%s ", child_abbrev, temp_string); if (PINDEX[i][j].PathIsUnique > 1) fprintf ( schh_fp, "/* path is not unique */" ) ; m = hcg_abbr_size ; while ( m < hcg_abbr_size*PATHTABLE[PINDEX[i][j].UniqPathindex].PathLength) { strncpy_null(temp_string, (char *)&PATHTABLE[PINDEX[i][j].UniqPathindex].PathBody[m], hcg_abbr_size); fprintf ( schh_fp, "%sid_pp->", temp_string); m += hcg_abbr_size; } fprintf ( schh_fp, "%s_pp",curr_ptr->secondid ) ; fprintf ( schh_fp, "\n" ) ; } curr_ptr = curr_ptr->next_ptr ; } } } fprintf ( schh_fp, "\n\n\n"); fprintf(schh_fp,"/* Not implemented for USE_STL yet */\n"); fprintf(schh_fp,"#endif /* USE_STL */\n"); gen_pr_add_macros(); gen_pr_link_macros(); gen_pr_unlink_macros(); gen_pr_free_macros(); return; } void gen_pr_add_macros(void) { char *sep, *bq, *eq; if (cli_ansi) { bq = "#"; eq = ""; sep = "##"; } else { sep = "/**/"; bq = eq = "\""; } fprintf(schh_fp,"\ /******************************************************************************/\n\ /* This macro is used to generate the next available primary key value for the*/\n\ /* specified table, using the specified view. */\n\ /******************************************************************************/\n\ \n\ #define pr_gen_key(key,tbl_abbrv,version_id,entry_id) \\\n\ (key) = *null_key();\\\n\ set_abbr(&(key), (tbl_abbrv));\\\n\ set_version(&(key), (version_id));\\\n\ set_row(&(key), (entry_id))\n\ "); /* kmiu-removed extra slash on preceding line */ fprintf(schh_fp,"\ \n\ #define pr_gen_pkey(viewname,tbl,pkey) \\\n\ if (find_view_idx(viewname)) \\\n\ pr_gen_key(pkey,hcg_table_seq_list[tbl%s_idx].ttabbrev, \\\n\ (char) hcg_view_list.view_list[hcg_view_idx].version_list[tbl%s_idx], \\\n\ hcg_ts_list[tbl%s_idx].ts_list[hcg_view_list.view_list[hcg_view_idx].version_list[tbl%s_idx]].maxrow+1)\n\ \n\ \n\ #ifndef USE_STL \n\ #define pr_check_fkey(ctbl_abbr,ctbl_ptr,ckey,ptbl_abbr,pkey,ptbl_ptr) \\\n\ key1 = ctbl_ptr->get_%sckey(); \\\n\ key2 = ptbl_ptr->get_pkid(); \\\n\ if ( is_null_key(&key1) || key1 == 0 ) {\\\n\ if (!hcg_default_fkey) {\\\n\ printf(\"Warning: foreign key %%s is not set for table %%s element 0x%%8.8x\\n\", \\\n\ %sckey%s, %sctbl_abbr%s, ctbl_ptr );\\\n\ pr_gen_key( ckey,%sptbl_abbr%s, 0, 0);\\\n\ }\\\n\ else if ( (ptbl_ptr) && ( !is_null_key(&key2) ) && ( key2 != 0) ) {\\\n\ ctbl_ptr->set_%sckey (key2);\\\n\ }\\\n\ else {\\\n\ pr_gen_key( ckey, %sptbl_abbr%s, 0, 0);\\\n\ }\\\n\ }\n\ #endif /* USE_STL */ \n\ \n\ /******************************************************************************/\n\ /* This macro is used set the default value of non-key fields of type cX or tX*/\n\ /******************************************************************************/\n\ \n\ #ifndef USE_STL\n\ #define pr_check_str(tbl_abbr,tbl_ptr,fld,length) \\\n\ if ( (tbl_ptr)->fld[0] == '\\0' ) \\\n\ {\\\n\ int i = sizeof((tbl_ptr)->fld) - 2;\\\n\ printf(\"Warning: string field %%s is not set for table %%s element 0x%%8.8x\\n\", \\\n\ %sfld%s, %stbl_abbr%s, tbl_ptr);\\\n\ for((tbl_ptr)->fld[i] = '\\0'; i>=0; (tbl_ptr)->fld[i--] = '?');\\\n\ }\n\ #endif /* USE_STL */\n\ \n\ ", sep, sep, sep, sep, sep, bq, eq, bq, eq, bq, eq, sep, bq, eq, bq, eq, bq, eq, bq, eq ); } void gen_pr_link_macros(void) { char *sep = (cli_ansi)? "##" : "/**/" ; fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will allocate a block of memory large enough to hold the*/\n"); fprintf(schh_fp,"/* specified table type. It also flushes the block to binary 0 (zero), so */\n"); fprintf(schh_fp,"/* that pointer fields are pre-nulled. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp,"\n#define alloc_element(tbl) \\\n"); fprintf(schh_fp,"\ttbl%selt = (tbl *)malloc( sizeof(tbl) ); \\\n",sep); fprintf(schh_fp,"\tclear_mem(tbl%selt,sizeof(tbl))\n",sep); fprintf(schh_fp,"#endif /* USE_STL */ \n\n"); if (!cli_noorder) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will insert a row into a table. The pkey parameter is */\n"); fprintf(schh_fp,"/* the name of the primary key field for the table in question. The row is */\n"); fprintf(schh_fp,"/* linked into the tables row chain at the alphabetically correct location, */\n"); fprintf(schh_fp,"/* sorted by primary key. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define insert_element(tbl) \\\n"); fprintf(schh_fp, "if (tbl%sbegin == NULL) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " tbl%sbegin = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, " tbl%send = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, "} \\\n"); fprintf(schh_fp, "else \\\n"); fprintf(schh_fp, "if (key_compare1(tbl%send->get_pkid(),tbl%selt->get_pkid()) < 0) \\\n",sep,sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " tbl%send->next_ptr = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, " tbl%selt->prev_ptr = tbl%send; \\\n",sep,sep); fprintf(schh_fp, " tbl%send = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, "} \\\n"); fprintf(schh_fp, "else \\\n"); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " tbl%stemp = tbl%sbegin; \\\n",sep, sep); fprintf(schh_fp, " tbl%scurr = tbl%sbegin; \\\n",sep, sep); fprintf(schh_fp, " while ((tbl%scurr != NULL) && (key_compare1(tbl%scurr->get_pkid(),tbl%selt->get_pkid()) < 0)) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " tbl%stemp = tbl%scurr; \\\n",sep,sep); fprintf(schh_fp, " tbl%scurr = tbl%scurr->next_ptr; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " if ((tbl%scurr != NULL) && (key_compare1(tbl%scurr->get_pkid(),tbl%selt->get_pkid()) == 0)) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " dup_row_warning(tbl%selt->get_pkid()); \\\n",sep); fprintf(schh_fp, " free(tbl%selt); \\\n",sep); /* fprintf(schh_fp, " break; \\\n"); */ fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " if (tbl%scurr == tbl%sbegin) \\\n",sep ,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " tbl%selt->next_ptr = tbl%sbegin; \\\n",sep, sep); fprintf(schh_fp, " tbl%sbegin->prev_ptr = tbl%selt; \\\n",sep, sep); fprintf(schh_fp, " tbl%sbegin = tbl%selt; \\\n",sep, sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " tbl%selt->next_ptr = tbl%scurr; \\\n",sep,sep); fprintf(schh_fp, " tbl%selt->prev_ptr = tbl%stemp; \\\n",sep,sep); fprintf(schh_fp, " tbl%stemp->next_ptr = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, " if (tbl%scurr != NULL) \\\n",sep); fprintf(schh_fp, " tbl%scurr->prev_ptr = tbl%selt; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, "} \\\n"); fprintf(schh_fp, "tbl%scurr = tbl%selt\n",sep,sep); fprintf(schh_fp, "#endif /* USE_STL */\n"); } else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will insert a row into a table. Since the -order */\n"); fprintf(schh_fp,"/* command-line qualifier was used to generate this code, the element is NOT */\n"); fprintf(schh_fp,"/* inserted in primary-key sorted order, it is inserted at the end of the */\n"); fprintf(schh_fp,"/* table. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define insert_element(tbl) \\\n"); fprintf(schh_fp, "\ttbl%scurr = tbl%selt;\\\n",sep,sep); fprintf(schh_fp, "\tif (tbl%sbegin) tbl%send->next_ptr = tbl%selt; else tbl%sbegin = tbl%selt; \\\n",sep,sep,sep,sep,sep); fprintf(schh_fp, "\ttbl%selt->prev_ptr = tbl%send; \\\n",sep,sep); fprintf(schh_fp, "\ttbl%send = tbl%selt\n",sep,sep); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified child table, linking the */\n"); fprintf(schh_fp,"/* first child it finds for this parent row. This is acceptable since it is */\n"); fprintf(schh_fp,"/* supposed to be a singleton relationship. */\n"); fprintf(schh_fp,"/* The assert macro aborts if more than one child is linked in - RJL 94/12/6 */\n"); fprintf(schh_fp,"/* assert (loosely) allows NULL or self-pointer in the current parent */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_child_1(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "assert(pa%scurr->c%s_fcp == NULL || pa%scurr->c%s_fcp == pa%scurr);\\\n",sep,sep,sep,sep,sep); fprintf(schh_fp, "pa%scurr = pa%selt; \\\n",sep,sep); fprintf(schh_fp, "ca%scurr2 = ca%sbegin; \\\n",sep,sep); fprintf(schh_fp, "while(ca%scurr2) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " if (key_compare1(ca%scurr2->get_%scf(),pa%scurr->get_pkid()) == 0) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2->p%s_pp = pa%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr->c%s_fcp = ca%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " break; \\\n"); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%scurr2 = ca%scurr2->next_ptr; \\\n",sep,sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp,"#endif /* USE_STL */\n\n"); if (!cli_nobp) { if (!cli_noorder) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified child table, linking any */\n"); fprintf(schh_fp,"/* children of this parent row. It is identical to link_child_nobp except */\n"); fprintf(schh_fp,"/* that back pointers are also filled in. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_child_bp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "pa%scurr = pa%selt; \\\n",sep,sep); fprintf(schh_fp, "ca%scurr2 = ca%sbegin; \\\n",sep, sep); fprintf(schh_fp, "while(ca%scurr2) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " if (key_compare1(ca%scurr2->get_%scf(),pa%scurr->get_pkid()) == 0) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2->p%s_pp = pa%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " ca%stemp2 = pa%scurr->c%s_bcp; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr->c%s_bcp = ca%scurr2; \\\n",sep,sep,sep); /* kmiu - added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%scurr; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr2->p%s_fpp = pa%scurr; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " if (pa%scurr->c%s_fcp == NULL) \\\n",sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%scurr->c%s_fcp = ca%scurr2; \\\n",sep,sep,sep); /* kmiu - added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr2->p%s_bpp = pa%scurr; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr2->p%s_bpp = pa%scurr; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " { \\\n"); /* kmiu - added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (ca *) ca%scurr2->p%s_bpp = ca%stemp2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr2->p%s_bpp = ca%stemp2; \\\n",sep,sep,sep); #endif /* kmiu - added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (ca *) ca%stemp2->p%s_fpp = ca%scurr2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%stemp2->p%s_fpp = ca%scurr2; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%scurr2 = ca%scurr2->next_ptr; \\\n",sep,sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* if (!cli_noorder) */ else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified child table, linking any */\n"); fprintf(schh_fp,"/* children of this parent row. It is identical to link_child_nobp except */\n"); fprintf(schh_fp,"/* that back pointers are also filled in. Since the -noorder command-line */\n"); fprintf(schh_fp,"/* qualifier was used to generate this code, the child is inserted as the */\n"); fprintf(schh_fp,"/* FIRST child in the chain. This requires considerably less code than */\n"); fprintf(schh_fp,"/* inserting at the end of the chain. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_child_bp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "pa%scurr = pa%selt; \\\n",sep,sep); fprintf(schh_fp, "ca%scurr2 = ca%sbegin; \\\n",sep,sep); fprintf(schh_fp, "while(ca%scurr2) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " if (key_compare1(ca%scurr2->get_%scf(),pa%scurr->get_pkid()) == 0) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2->p%s_pp = pa%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " (pa *) ca%scurr2->p%s_bpp = pa%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%scurr->c%s_fcp; \\\n",sep,sep,sep,sep); fprintf(schh_fp, " ca%stemp2 = pa%scurr->c%s_fcp; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr->c%s_fcp = ca%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " if (ca%stemp2 != NULL) \\\n",sep); fprintf(schh_fp, " (ca *) ca%stemp2->p%s_bpp = ca%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%scurr2 = ca%scurr2->next_ptr; \\\n",sep,sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* if !cli_noorder */ } else /* if (!cli_nobp) - kmiu*/ { if (!cli_noorder) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified child table, linking any */\n"); fprintf(schh_fp,"/* children of this parent row. It is identical to link_child_bp except */\n"); fprintf(schh_fp,"/* that back pointers are not filled in. Because there are no back-ptrs, */\n"); fprintf(schh_fp,"/* the last child in the chain must be found via a search loop over the */\n"); fprintf(schh_fp,"/* children. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_child_nobp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "pa%scurr = pa%selt; \\\n",sep,sep); fprintf(schh_fp, "ca%scurr2 = ca%sbegin; \\\n",sep,sep); fprintf(schh_fp, "while(ca%scurr2) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " if (key_compare1(ca%scurr2->get_%scf(),pa%scurr->get_pkid()) == 0) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2->p%s_pp = pa%scurr; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%scurr2->p%s_fpp = pa%scurr; \\\n",sep,sep,sep); #else fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%scurr; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " if (pa%scurr->c%s_fcp == NULL) \\\n",sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%scurr->c%s_fcp = ca%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " for (ca%stemp2 = pa%scurr->c%s_fcp; (pa *) ca%stemp2->p%s_fpp != pa%scurr; ca%stemp2 = (ca *)ca%stemp2->p%s_fpp); \\\n",sep,sep,sep,sep,sep,sep,sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%stemp2->p%s_fpp = ca%scurr2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " (ca *) ca%stemp2->p%s_fpp = ca%scurr2; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%stemp2 = ca%scurr2; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%scurr2 = ca%scurr2->next_ptr; \\\n",sep,sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* if (!cli_noorder) */ else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified child table, linking any */\n"); fprintf(schh_fp,"/* children of this parent row. It is identical to link_child_bp except */\n"); fprintf(schh_fp,"/* that back pointers are not filled in. Because there are no back-ptrs, */\n"); fprintf(schh_fp,"/* the last child in the chain must be found via a search loop over the */\n"); fprintf(schh_fp,"/* children. Since the -noorder command-line was used to generate this code, */\n"); fprintf(schh_fp,"/* the child is inserted as the FIRST child in the chain. This requires */\n"); fprintf(schh_fp,"/* considerably less code than inserting at the end of the chain. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_child_nobp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "pa%scurr = pa%selt; \\\n",sep,sep); fprintf(schh_fp, "ca%scurr2 = ca%sbegin; \\\n",sep,sep); fprintf(schh_fp, "while(ca%scurr2) \\\n",sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " if (key_compare1(ca%scurr2->get_%scf(),pa%scurr->get_pkid()) == 0) \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2->p%s_pp = pa%scurr; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%scurr2->p%s_fpp = pa%scurr->c%s_fcp; \\\n",sep,sep,sep,sep); #else fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%scurr->c%s_fcp; \\\n",sep,sep,sep,sep); #endif fprintf(schh_fp, " pa%scurr->c%s_fcp = ca%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " ca%scurr2 = ca%scurr2->next_ptr; \\\n",sep,sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* if !cli_noorder */ } /* else if !cli_nobp - kmiu*/ fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified parent table, linking any */\n"); fprintf(schh_fp,"/* parents of this child row. It is identical to link_parent_nobp except */\n"); fprintf(schh_fp,"/* that it is assumed to be a singleton child. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp, "#ifndef USE_STL \n"); fprintf(schh_fp, "#define link_parent_1(ca,pa,cf,pk,p,c) \\\n"); if (!cli_noorder) fprintf(schh_fp, " for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) < 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); else fprintf(schh_fp, " for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) != 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); fprintf(schh_fp, " if ((pa%scurr2 != NULL) && (key_compare1(ca%scurr->get_%scf(),pa%scurr2->get_pkid()) == 0)) \\\n",sep,sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr->p%s_pp = pa%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr2->c%s_fcp = ca%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " }"); if (cli_noforward) { fprintf(schh_fp, "\\\nif (ca%scurr->p%s_pp == NULL) \\\n",sep,sep); fprintf(schh_fp, " forward_ref_warning(ca%scurr->get_pkid(),ca%scurr->get_%scf())",sep,sep,sep); } fprintf(schh_fp, "\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); if (!cli_nobp) { if (!cli_noorder) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified parent table, linking any */\n"); fprintf(schh_fp,"/* parents of this child row. It is identical to link_parent_nobp except */\n"); fprintf(schh_fp,"/* that back pointers are also filled in. */\n"); fprintf(schh_fp,"/* */\n"); } else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified parent table, linking any */\n"); fprintf(schh_fp,"/* parents of this child row. It is identical to link_parent_nobp except */\n"); fprintf(schh_fp,"/* that back pointers are also filled in. Since the -noorder command-line */\n"); fprintf(schh_fp,"/* qualifier was used to generate this code, the child is inserted as */\n"); fprintf(schh_fp,"/* the FIRST child in the chain. This requires considerably less code than */\n"); fprintf(schh_fp,"/* inserting at the end of the chain. */\n"); fprintf(schh_fp,"/* */\n"); } if (cli_noforward) { fprintf(schh_fp,"/* NOTE: Since the -noforward command-line qualifier was used to generate this*/\n"); fprintf(schh_fp,"/* code, a check is included at the bottom of this macro. The check */\n"); fprintf(schh_fp,"/* ensures that the parent record was found. If not, a warning is */\n"); fprintf(schh_fp,"/* printed. In addition, using this flag means that calls to link_ */\n"); fprintf(schh_fp,"/* child_{no}bp are not included in pr_add. Link child is only needed */\n"); fprintf(schh_fp,"/* when there is a risk of forward references in the data file. */\n"); } else { fprintf(schh_fp,"/* NOTE: Since the -noforward command-line qualifier was NOT used to generate */\n"); fprintf(schh_fp,"/* this code, no check is included to ensure that a parent row was */\n"); fprintf(schh_fp,"/* actually found. Performance and code size are sacrificed here, since*/\n"); fprintf(schh_fp,"/* calls to link_child_{no}bp are included in the caller (pr_add). */\n"); fprintf(schh_fp,"/* Link child is only needed when there is a risk of forward references */\n"); fprintf(schh_fp,"/* in the data file. */\n"); } fprintf(schh_fp,"/* */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); if (!cli_noorder) { fprintf(schh_fp, "#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_parent_bp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, " for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) < 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); fprintf(schh_fp, " if ((pa%scurr2 != NULL) && (key_compare1(ca%scurr->get_%scf(),pa%scurr2->get_pkid()) == 0)) \\\n",sep,sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr->p%s_pp = pa%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " ca%stemp = pa%scurr2->c%s_bcp; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr2->c%s_bcp = ca%scurr; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr->p%s_fpp = pa%scurr2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr->p%s_fpp = pa%scurr2; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " if (pa%scurr2->c%s_fcp == NULL) \\\n",sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%scurr2->c%s_fcp = ca%scurr; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr->p%s_bpp = pa%scurr2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr->p%s_bpp = pa%scurr2; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " { \\\n"); /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (ca *) ca%scurr->p%s_bpp = ca%stemp; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr->p%s_bpp = ca%stemp; \\\n",sep,sep,sep); #endif /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (ca *) ca%stemp->p%s_fpp = ca%scurr; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%stemp->p%s_fpp = ca%scurr; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " }"); if (cli_noforward) { fprintf(schh_fp, "\\\nif (ca%scurr->p%s_pp == NULL) \\\n",sep,sep); fprintf(schh_fp, " forward_ref_warning(ca%scurr->get_pkid(),ca%scurr->get_%scf())",sep,sep,sep); } fprintf(schh_fp, "\n"); fprintf(schh_fp, "#endif /* USE_STL */ \n\n"); } /* if !cli_noorder */ else { fprintf(schh_fp, "#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_parent_bp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, " for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) != 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); fprintf(schh_fp, " if ((pa%scurr2 != NULL) && (key_compare1(ca%scurr->get_%scf(),pa%scurr2->get_pkid()) == 0)) \\\n",sep,sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr->p%s_pp = pa%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " (pa *) ca%scurr->p%s_bpp = pa%scurr2; \\\n",sep,sep,sep); fprintf(schh_fp, " (pa *) ca%scurr->p%s_fpp = pa%scurr2->c%s_fcp; \\\n",sep,sep,sep,sep); fprintf(schh_fp, " ca%stemp = pa%scurr2->c%s_fcp; \\\n",sep,sep,sep); fprintf(schh_fp, " pa%scurr2->c%s_fcp = ca%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " if (ca%stemp != NULL) \\\n",sep); fprintf(schh_fp, " (ca *) ca%stemp->p%s_bpp = ca%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " }"); if (cli_noforward) { fprintf(schh_fp, "\\\nif (ca%scurr->p%s_pp == NULL) \\\n",sep,sep); fprintf(schh_fp, " forward_ref_warning(ca%scurr->get_pkid(),ca%scurr->get_%scf())",sep,sep,sep); } fprintf(schh_fp, "\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* else of if !cli_noorder */ } /* if !cli_nobp */ else /* kmiu */ { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified parent table, linking any */\n"); fprintf(schh_fp,"/* parents of this child row. It is identical to link_parent_nobp except */\n"); fprintf(schh_fp,"/* that back pointers are not filled in. Because there are no back-ptrs, */\n"); fprintf(schh_fp,"/* the last child in the chain must be found via a search loop over the */\n"); fprintf(schh_fp,"/* children. */\n"); fprintf(schh_fp,"/* */\n"); if (cli_noforward) { fprintf(schh_fp,"/* NOTE: Since the -noforward command-line qualifier was used to generate this*/\n"); fprintf(schh_fp,"/* code, a check is included at the bototom of this macro. The check */\n"); fprintf(schh_fp,"/* ensures that the parent record was found. If not, a warning is */\n"); fprintf(schh_fp,"/* printed. In addition, using this flag means that calls to link_ */\n"); fprintf(schh_fp,"/* child_{no}bp are not included in pr_add. Link child is only needed */\n"); fprintf(schh_fp,"/* when there is a risk of forward references in the data file. */\n"); } else { fprintf(schh_fp,"/* NOTE: Since the -noforward command-line qualifier was NOT used to generate */\n"); fprintf(schh_fp,"/* this code, no check is included to ensure that a parent row was */\n"); fprintf(schh_fp,"/* actually found. Performance and code size are sacrificed here, since*/\n"); fprintf(schh_fp,"/* calls to link_child_{no}bp are included in the caller (pr_add). */\n"); fprintf(schh_fp,"/* Link child is only needed when there is a risk of forward references */\n"); fprintf(schh_fp,"/* in the data file. */\n"); } fprintf(schh_fp,"/* */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); if (!cli_noorder) { fprintf(schh_fp, "#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_parent_nobp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) < 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); fprintf(schh_fp, "if ((pa%scurr2 != NULL) && (key_compare1(ca%scurr->get_%scf(),pa%scurr2->get_pkid()) == 0)) \\\n",sep,sep,sep,sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " ca%scurr->p%s_pp = pa%scurr2; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%scurr->p%s_fpp = pa%scurr2; \\\n",sep,sep,sep); #else fprintf(schh_fp, " (pa *) ca%scurr->p%s_fpp = pa%scurr2; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " if (pa%scurr2->c%s_fcp == NULL) \\\n",sep,sep); fprintf(schh_fp, " pa%scurr2->c%s_fcp = ca%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " for (ca%stemp2 = pa%scurr2->c%s_fcp; (pa *) ca%stemp2->p%s_fpp != pa%scurr2; ca%stemp2 = (ca *)ca%stemp2->p%s_fpp); \\\n",sep,sep,sep,sep,sep,sep,sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%stemp2->p%s_fpp = ca%scurr; \\\n",sep,sep,sep); #else fprintf(schh_fp, " (ca *) ca%stemp2->p%s_fpp = ca%scurr; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, "}"); if (cli_noforward) { fprintf(schh_fp, "\\\nif (ca%scurr->p%s_pp == NULL) \\\n",sep,sep); fprintf(schh_fp, " forward_ref_warning(ca%scurr->get_pkid(),ca%scurr->get_%scf())",sep,sep,sep); } fprintf(schh_fp, "\n\n"); fprintf(schh_fp, "#endif /* USE_STL */\n"); } /* if !cli_noorder */ else { fprintf(schh_fp, "#ifndef USE_STL\n"); fprintf(schh_fp, "#define link_parent_nobp_m(ca,pa,cf,pk,p,c) \\\n"); fprintf(schh_fp, "for (pa%scurr2 = pa%sbegin; (pa%scurr2 != NULL) && (key_compare1(pa%scurr2->get_pkid(),ca%scurr->get_%scf()) != 0); pa%scurr2 = pa%scurr2->next_ptr); \\\n",sep,sep,sep,sep,sep,sep,sep,sep); fprintf(schh_fp, "if ((pa%scurr2 != NULL) && (key_compare1(ca%scurr->get_%scf(),pa%scurr2->get_pkid()) == 0)) \\\n",sep,sep,sep,sep); fprintf(schh_fp, "{ \\\n"); fprintf(schh_fp, " ca%scurr->p%s_pp = pa%scurr2; \\\n",sep,sep,sep); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%scurr->p%s_fpp = pa%scurr2->c%s_fcp; \\\n",sep,sep,sep,sep); #else fprintf(schh_fp, " (pa *) ca%scurr->p%s_fpp = pa%scurr2->c%s_fcp; \\\n",sep,sep,sep,sep); #endif fprintf(schh_fp, " pa%scurr2->c%s_fcp = ca%scurr; \\\n",sep,sep,sep); fprintf(schh_fp, "}"); if (cli_noforward) { fprintf(schh_fp, "\\\nif (ca%scurr->p%s_pp == NULL) \\\n",sep,sep); fprintf(schh_fp, " forward_ref_warning(ca%scurr->get_pkid(),ca%scurr->get_%scf())",sep,sep,sep); } fprintf(schh_fp, "\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* if !cli_noorder */ } /* else of if !cli_nobp -kmiu */ } void gen_pr_unlink_macros(void) { char *sep = (cli_ansi)? "##" : "/**/" ; fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_delete to physically delete a row. It */\n"); fprintf(schh_fp,"/* also unlinks the row from its table's row chain. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp, "/* New version of del_row - 93/2/8 by RJL and CMurphy: */\n"); fprintf(schh_fp, "/* tbl == tbl*//*end != NULL (and rcount = 1) means a single-row table */\n"); fprintf(schh_fp, "/* tbl == tbl*//*end == NULL (and rcount = 0) means an empty table -RJL */\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define del_row(tbl) \\\n"); fprintf(schh_fp, "if (tbl%send == NULL) \\\n",sep); fprintf(schh_fp, "printf(\"del_row error: empty table\");\\\n"); fprintf(schh_fp, "else \\\n"); fprintf(schh_fp, "if (tbl%scurr == NULL) \\\n",sep); fprintf(schh_fp, " printf(\"del_row error: NULL curr row ptr\");\\\n"); fprintf(schh_fp, "else\\\n"); fprintf(schh_fp, "{\\\n"); /*** 95s523,chwang,5,11,95. Add few lines to delete arow from btree. ***/ /*** ---lines begin--- ***/ fprintf(schh_fp, "if( tbl%sbtidx == BTREESEARCH ) \\\n",sep); fprintf(schh_fp, "{ \\\n"); /* fprintf(schh_fp, " sprintf(tempbtree,\"tbl\"); \\\n"); ntansala */ fprintf(schh_fp, " sprintf(tempbtree,#tbl); \\\n"); fprintf(schh_fp, " tempbtree[HCG_ABBR_SIZE]=\'\\0\'; \\\n"); fprintf(schh_fp, " pr_del_bt(tempbtree,tbl%scurr->get_pkid()); \\\n",sep); fprintf(schh_fp, "} \\\n"); /*** ---lines end--- ***/ fprintf(schh_fp, "if (tbl%send == tbl%scurr) /*last row: next_ptr = NULL - RJL 93/2/8 */\\\n",sep,sep); fprintf(schh_fp, " tbl%send = tbl%scurr->prev_ptr; /* = NULL iff curr row = first row */\\\n",sep,sep); fprintf(schh_fp, "if (tbl%sbegin == tbl%scurr) /* first row: prev_ptr = NULL - RJL 93/2/8 */\\\n",sep,sep); fprintf(schh_fp, " tbl%sbegin = tbl%scurr->next_ptr; /* = NULL iff curr row = last row */\\\n",sep,sep); fprintf(schh_fp, "if (tbl%scurr->prev_ptr != NULL) \\\n",sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " tbl%scurr->prev_ptr->next_ptr = tbl%scurr->next_ptr; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, "if (tbl%scurr->next_ptr != NULL) \\\n",sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " tbl%scurr->next_ptr->prev_ptr = tbl%scurr->prev_ptr; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); /*** 93s523 ***/ #ifdef NOTNOW fprintf(schh_fp, "tbl%scurr->tbl%sid[4] = '\\0'; /* sentinel for next line char[2] */\\\n",sep,sep); /* I don't know about this one - MM */ #endif fprintf(schh_fp, "key1 = tbl%scurr->get_pkid(); \\\n",sep); fprintf(schh_fp, "hcg_ts_list[tbl%s_idx].ts_list[get_version(&key1)].rcount--; \\\n",sep,sep,sep); fprintf(schh_fp, "hcg_table_seq_list[tbl%s_idx].rcount--;\\\n",sep); fprintf(schh_fp, "free(tbl%scurr);\\\n",sep); fprintf(schh_fp, "}\n"); fprintf(schh_fp, "#endif /* USE_STL */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* parent table. It is identical to unlink_parent_nobp except that its is */\n"); fprintf(schh_fp,"/* for a singleton child. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_parent_1(ca,pa,p,c) \\\n"); fprintf(schh_fp, "pa%stemp = ca%scurr->p%s_pp; \\\n",sep,sep,sep); fprintf(schh_fp, "if (pa%stemp != NULL) \\\n",sep); fprintf(schh_fp, " pa%stemp->c%s_fcp = NULL\n",sep,sep); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); if (!cli_nobp) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* parent table. It is identical to unlink_parent_nobp except that back */\n"); fprintf(schh_fp,"/* pointers are also unlinked. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_parent_bp_m(ca,pa,p,c) \\\n"); fprintf(schh_fp, "pa%stemp = ca%scurr->p%s_pp; \\\n",sep,sep,sep); fprintf(schh_fp, "ca%stemp = ca%scurr; /* Change CEM & RJL 20 APR 93*/ \\\n",sep,sep,sep); fprintf(schh_fp, "if (pa%stemp != NULL) \\\n",sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " if (( pa%stemp->c%s_fcp == ca%stemp) && \\\n",sep,sep,sep); fprintf(schh_fp, " ( (pa *) ca%scurr->p%s_fpp == pa%stemp))\t/* only child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%stemp->c%s_fcp = NULL; \\\n",sep,sep); fprintf(schh_fp, " pa%stemp->c%s_bcp = NULL; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " if ( pa%stemp->c%s_fcp == ca%stemp )\t/* first child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%stemp->c%s_fcp = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr2->p%s_bpp = pa%stemp; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr2->p%s_bpp = pa%stemp; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " if ( (pa *) ca%scurr->p%s_fpp == pa%stemp)\t/* last child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%stemp->c%s_bcp = (ca *)ca%scurr->p%s_bpp; \\\n",sep,sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_bpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ /* kmiu-added ifdef */ #ifndef WIN32 fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%stemp; \\\n",sep,sep,sep); #else fprintf(schh_fp, " ca%scurr2->p%s_fpp = pa%stemp; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else\t\t\t\t\t\t\t\t/* middle of child chain case */ \\\n"); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_bpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%scurr2->p%s_fpp = ca%scurr->p%s_fpp; \\\n",sep,sep,sep,sep); fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%scurr2->p%s_bpp = ca%scurr->p%s_bpp; \\\n",sep,sep,sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " }\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* parent table. It is identical to unlink_parent_bp except that back */\n"); fprintf(schh_fp,"/* pointers are not unlinked. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_parent_nobp_m(ca,pa,p,c) \\\n"); fprintf(schh_fp, "pa%stemp = ca%scurr->p%s_pp; \\\n",sep,sep,sep); fprintf(schh_fp, "ca%stemp = ca%scurr; /* Change CEM & RJL 20 APR 93*/ \\\n",sep,sep,sep); fprintf(schh_fp, "if (pa%stemp != NULL) \\\n",sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " if (( pa%stemp->c%s_fcp == ca%stemp) && \\\n",sep,sep,sep); fprintf(schh_fp, " ( (pa *) ca%scurr->p%s_fpp == pa%stemp))\t/* only child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%stemp->c%s_fcp = NULL; \\\n",sep,sep); fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " if ( pa%stemp->c%s_fcp == ca%stemp )\t/* first child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " pa%stemp->c%s_fcp = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else \\\n"); fprintf(schh_fp, " if ( (pa *) ca%scurr->p%s_fpp == pa%stemp)\t/* last child case */ \\\n",sep,sep,sep); fprintf(schh_fp, " { \\\n"); /* kmiu-added ifdef */ #ifdef WIN32 fprintf(schh_fp, " ca%scurr2->p%s_fpp = pa%stemp; \\\n",sep,sep,sep); #else fprintf(schh_fp, " (pa *) ca%scurr2->p%s_fpp = pa%stemp; \\\n",sep,sep,sep); #endif fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " else\t\t\t\t\t\t\t\t/* middle of child chain case */ \\\n"); fprintf(schh_fp, " { \\\n"); /* kmiu--REMOVED NEXT LINE because it causes an access violation on NT and it appears ** to have been replaced by the line following it */ /* fprintf(schh_fp, " ca%scurr2->p%s_fpp = ca%scurr->p%s_fpp; \\\n",sep,sep,sep,sep);*/ fprintf(schh_fp, " ca%scurr2 = (ca *)ca%scurr->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " } \\\n"); fprintf(schh_fp, " }\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } /* else of if (!cli_nobp) */ fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* child table. It is identical to link_child_nobp except that it is for a */\n"); fprintf(schh_fp,"/* singleton child. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_child_1(ca,pa,p,c) \\\n"); fprintf(schh_fp, "ca%stemp = (ca *) pa%scurr->c%s_fcp; \\\n",sep,sep,sep); fprintf(schh_fp, "if (ca%stemp != NULL) \\\n",sep); fprintf(schh_fp, " ca%stemp->p%s_pp = NULL\n",sep,sep); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); if (!cli_nobp) { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* child table. It is identical to link_child_nobp except that back pointers */\n"); fprintf(schh_fp,"/* are also unlinked. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_child_bp_m(ca,pa,p,c) \\\n"); fprintf(schh_fp, "ca%stemp = (ca *) pa%scurr->c%s_fcp; \\\n",sep,sep,sep); fprintf(schh_fp, "while ((ca%stemp != NULL) && \\\n",sep); fprintf(schh_fp, " ((pa *) ca%stemp != pa%scurr)) \\\n",sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%stemp2 = (ca *)ca%stemp->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%stemp->p%s_bpp = ca%stemp->p%s_fpp = ca%stemp->p%s_pp = NULL; \\\n",sep,sep,sep,sep,sep,sep); fprintf(schh_fp, " ca%stemp = ca%stemp2; \\\n",sep,sep); fprintf(schh_fp, " }\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } else { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro is used by pr_del to unlink a row from the specified */\n"); fprintf(schh_fp,"/* child table. It is identical to link_child_bp except that back pointers */\n"); fprintf(schh_fp,"/* are not unlinked. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp, "#define unlink_child_nobp_m(ca,pa,p,c) \\\n"); fprintf(schh_fp, "ca%stemp = (ca *) pa%scurr->c%s_fcp; \\\n",sep,sep,sep); fprintf(schh_fp, "while ((ca%stemp != NULL) && \\\n",sep); fprintf(schh_fp, " ((pa *) ca%stemp != pa%scurr)) \\\n",sep,sep); fprintf(schh_fp, " { \\\n"); fprintf(schh_fp, " ca%stemp2 = (ca *) ca%stemp->p%s_fpp; \\\n",sep,sep,sep); /* 93su523 PGEN merge */ fprintf(schh_fp, " ca%stemp->p%s_fpp = ca%stemp->p%s_pp = NULL; \\\n",sep,sep,sep,sep); fprintf(schh_fp, " ca%stemp = ca%stemp2; \\\n",sep,sep); fprintf(schh_fp, " }\n"); fprintf(schh_fp, "#endif /* USE_STL */\n\n"); } } void gen_pr_free_macros(void) { char *sep = (cli_ansi)? "##" : "/**/" ; fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* This private macro will loop over the specified table, freeing the memory */\n"); fprintf(schh_fp,"/* allocated to each row. It should not be used by users, since it does not */\n"); fprintf(schh_fp,"/* go out to parents and children, nulling out pointers to the deleted rows. */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"#ifndef USE_STL\n"); fprintf(schh_fp,"#define free_table(tbl) \\\n"); fprintf(schh_fp,"\ttbl%scurr = tbl%sbegin;\\\n",sep,sep); fprintf(schh_fp,"\twhile(tbl%scurr)\\\n",sep); fprintf(schh_fp,"\t{\\\n"); fprintf(schh_fp,"\t\ttbl%stemp = tbl%scurr; \\\n",sep,sep); fprintf(schh_fp,"\t\ttbl%scurr = tbl%scurr->next_ptr; \\\n",sep,sep); fprintf(schh_fp,"\t\tfree(tbl%stemp); \\\n",sep); fprintf(schh_fp,"\t}\\\n"); fprintf(schh_fp,"\ttbl%sbegin = tbl%stemp = tbl%selt = NULL /* curr already nulled by loop */\n",sep, sep,sep); fprintf(schh_fp,"#endif /* USE_STL */\n\n"); }