1: # include <ingres.h> 2: # undef MAXNAME 3: # include "../equel/constants.h" 4: # include "IIglobals.h" 5: # include <sccs.h> 6: # include <errors.h> 7: 8: SCCSID(@(#)IIw_left.c 8.2 2/8/85) 9: 10: /* 11: ** IIw_left -- writes down a "tupret's" target list. 12: ** 13: ** Parameters: 14: ** string -- a char * to a string containing everything 15: ** inside the equivalent "retrieve" statement, 16: ** but instead of result domain names, the string 17: ** should have '%<ingres_type>', where <ingres_type> 18: ** is the ingres type of the resulting C variable. 19: ** To escape a '%' use 2 ("%%"). 20: ** 'String' is left unchanged after the call. 21: ** argv -- a vector of pointers to the 22: ** corresponding C variables. 23: ** 24: ** Usage: 25: ** argv [0] = &double_var; 26: ** argv [1] = &int_var; 27: ** IIw_left("%f8 = i.double, %i2=i.ifield", argv); 28: ** 29: ** Required by: 30: ** parametrized retrieves without a target relation 31: ** 32: ** Requires: 33: ** Uses the ret_sym array IIretsym, and the old equel 34: ** method for doing tuprets. NOTE that this does not 35: ** allow dynamic (before each tuple) resolution of 36: ** the result C variables as does the new tupret method. 37: ** 38: ** Error numbers: 39: ** 1003 -- 1 parameter, the erroneous string. 40: ** "Bad format for a domain in a param retrieve 41: ** without a result relation" 42: */ 43: 44: 45: IIw_left(string, argv) 46: char *string; 47: char **argv; 48: { 49: register char *b_st, *e_st; 50: register char **av; 51: int type; 52: char *IIitos(); 53: 54: if (IIdebug) 55: printf("ent IIw_left : string \"%s\"\n", 56: string); 57: av = argv; 58: for (b_st = e_st = string; *e_st; ) 59: { 60: if (*e_st != '%') 61: { 62: e_st++; 63: continue; 64: } 65: 66: /* provide escape method */ 67: if (e_st [1] == '%') 68: { 69: e_st [1] = '\0'; 70: IIwrite(b_st); 71: /* leave string intact */ 72: e_st [1] = '%'; 73: b_st = e_st = &e_st [2]; 74: continue; 75: } 76: *e_st = '\0'; 77: IIwrite(b_st); 78: *e_st++ = '%'; 79: IIwrite(" RET_VAR "); 80: 81: switch (*e_st) 82: { 83: 84: case 'f' : 85: switch (*++e_st) 86: { 87: 88: case '8' : 89: type = opDOUBLE; 90: break; 91: 92: case '4' : 93: type = opFLOAT; 94: break; 95: 96: default : 97: goto error_label; 98: } 99: break; 100: 101: case 'i' : 102: switch (*++e_st) 103: { 104: 105: case '4' : 106: type = opLONG; 107: break; 108: 109: case '2' : 110: type = opSHORT; 111: break; 112: 113: default : 114: goto error_label; 115: } 116: break; 117: 118: case 'c' : 119: type = opSTRING; 120: break; 121: } 122: IIretrieve(*av++, type); 123: b_st = ++e_st; 124: } 125: IIwrite(b_st); 126: return; 127: 128: 129: error_label : 130: IIerror(BADRET, 1, &string); 131: IIerrflag = 1003; 132: /* make sure that part already written down will 133: * cause an error, and ignore that error 134: */ 135: IIwrite(","); 136: IIo_print = IIprint_err; 137: IIprint_err = IIno_err; 138: }