|
rpm
5.4.4
|
00001 00005 #include "system.h" 00006 00007 #include "rpm-rb.h" 00008 #include "rpmds-rb.h" 00009 #include "rpmfi-rb.h" 00010 #include "rpmhdr-rb.h" 00011 00012 #ifdef NOTYET 00013 #include <argv.h> 00014 #include <mire.h> 00015 #endif 00016 00017 #define _RPMDS_INTERNAL 00018 #include <rpmtag.h> 00019 #include <rpmtypes.h> 00020 #include <rpmds.h> 00021 #include <rpmfi.h> 00022 #include <rpmio.h> 00023 00024 #include <rpmcli.h> /* XXX rpmHeaderFormats */ 00025 00026 #include "../debug.h" 00027 00028 VALUE rpmhdrClass; 00029 00030 /*@unchecked@*/ 00031 static int _debug = 0; 00032 00033 /* --- helpers */ 00034 static void * 00035 rpmhdr_ptr(VALUE s) 00036 { 00037 void *ptr; 00038 Data_Get_Struct(s, void, ptr); 00039 return ptr; 00040 } 00041 00042 static VALUE 00043 rpmhdrLoadTag(Header h, const char * name) 00044 { 00045 HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); 00046 VALUE v = Qfalse; 00047 int i; 00048 00049 if (_debug) 00050 fprintf(stderr, "==> %s(%p,%s)\n", __FUNCTION__, h, name); 00051 00052 he->tag = tagValue(name); 00053 if (headerGet(h, he, 0)) { 00054 if (_debug < 0) 00055 fprintf(stderr, "\t%s(%u) %u %p[%u]\n", name, (unsigned)he->tag, (unsigned)he->t, he->p.ptr, (unsigned)he->c); 00056 switch (he->t) { 00057 default: 00058 goto exit; 00059 /*@notreached@*/ break; 00060 case RPM_BIN_TYPE: /* XXX return as array of octets for now. */ 00061 case RPM_UINT8_TYPE: 00062 v = rb_ary_new(); 00063 for (i = 0; i < (int)he->c; i++) 00064 rb_ary_push(v, INT2FIX(he->p.ui8p[i])); 00065 break; 00066 case RPM_UINT16_TYPE: 00067 v = rb_ary_new(); 00068 for (i = 0; i < (int)he->c; i++) 00069 rb_ary_push(v, INT2FIX(he->p.ui16p[i])); 00070 break; 00071 case RPM_UINT32_TYPE: 00072 v = rb_ary_new(); 00073 for (i = 0; i < (int)he->c; i++) 00074 rb_ary_push(v, INT2FIX(he->p.ui32p[i])); 00075 break; 00076 case RPM_UINT64_TYPE: 00077 v = rb_ary_new(); 00078 for (i = 0; i < (int)he->c; i++) 00079 rb_ary_push(v, INT2FIX(he->p.ui64p[i])); 00080 break; 00081 case RPM_STRING_ARRAY_TYPE: 00082 v = rb_ary_new(); 00083 for (i = 0; i < (int)he->c; i++) 00084 rb_ary_push(v, rb_str_new2(he->p.argv[i])); 00085 break; 00086 case RPM_I18NSTRING_TYPE: /* XXX FIXME: is this ever seen? */ 00087 case RPM_STRING_TYPE: 00088 v = rb_str_new2(he->p.str); 00089 break; 00090 } 00091 } 00092 00093 exit: 00094 he->p.ptr = _free(he->p.ptr); 00095 return v; 00096 } 00097 /* --- Object methods */ 00098 static VALUE 00099 rpmhdr_sprintf(VALUE s, VALUE v) 00100 { 00101 Header h = rpmhdr_ptr(s); 00102 const char *qfmt = StringValueCStr(v); 00103 const char *q; 00104 const char *errstr = NULL; 00105 00106 if (_debug) 00107 fprintf(stderr, "==> %s(0x%lx, 0x%lx) h %p\n", __FUNCTION__, s, v, h); 00108 00109 if ((q = headerSprintf(h, qfmt, NULL, rpmHeaderFormats, &errstr)) == NULL) 00110 q = errstr; 00111 00112 return rb_str_new2(q); 00113 } 00114 00115 static VALUE 00116 rpmhdr_getorigin(VALUE s) 00117 { 00118 Header h = rpmhdr_ptr(s); 00119 00120 if (_debug) 00121 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h); 00122 00123 return rb_str_new2(headerGetOrigin(h)); 00124 } 00125 00126 static VALUE 00127 rpmhdr_setorigin(VALUE s, VALUE v) 00128 { 00129 Header h = rpmhdr_ptr(s); 00130 00131 if (_debug) 00132 fprintf(stderr, "==> %s(0x%lx, 0x%lx) h %p\n", __FUNCTION__, s, v, h); 00133 00134 (void) headerSetOrigin(h, StringValueCStr(v)); 00135 return rb_str_new2(headerGetOrigin(h)); 00136 } 00137 00138 static VALUE 00139 rpmhdr_ds(int argc, VALUE *argv, VALUE s) 00140 { 00141 VALUE v_tag; 00142 Header h = rpmhdr_ptr(s); 00143 rpmTag tag = RPMTAG_PROVIDENAME; 00144 int flags = 0; 00145 00146 rb_scan_args(argc, argv, "01", &v_tag); 00147 00148 if (!NIL_P(v_tag)) 00149 tag = FIX2INT(v_tag); 00150 00151 if (_debug) 00152 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h); 00153 00154 return rpmrb_NewDs( rpmdsNew(h, tag, flags) ); 00155 } 00156 00157 static VALUE 00158 rpmhdr_fi(int argc, VALUE *argv, VALUE s) 00159 { 00160 VALUE v_tag; 00161 Header h = rpmhdr_ptr(s); 00162 rpmTag tag = RPMTAG_BASENAMES; 00163 int flags = 0; 00164 00165 rb_scan_args(argc, argv, "01", &v_tag); 00166 00167 if (!NIL_P(v_tag)) 00168 tag = FIX2INT(v_tag); 00169 00170 if (_debug) 00171 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h); 00172 00173 return rpmrb_NewFi( rpmfiNew(NULL, h, tag, flags) ); 00174 } 00175 00176 static void 00177 initMethods(VALUE klass) 00178 { 00179 rb_define_method(klass, "sprintf", rpmhdr_sprintf, 1); 00180 rb_define_method(klass, "getorigin", rpmhdr_getorigin, 0); 00181 rb_define_method(klass, "setorigin", rpmhdr_setorigin, 1); 00182 rb_define_method(klass, "ds", rpmhdr_ds, -1); 00183 rb_define_method(klass, "fi", rpmhdr_fi, -1); 00184 } 00185 00186 /* --- Object properties */ 00187 static VALUE 00188 rpmhdr_debug_get(VALUE s) 00189 { 00190 if (_debug) 00191 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s); 00192 return INT2FIX(_debug); 00193 } 00194 00195 static VALUE 00196 rpmhdr_debug_set(VALUE s, VALUE v) 00197 { 00198 if (_debug) 00199 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v); 00200 return INT2FIX(_debug = FIX2INT(v)); 00201 } 00202 00203 static VALUE 00204 rpmhdr__get(VALUE s, VALUE v) 00205 { 00206 Header h = rpmhdr_ptr(s); 00207 char * vstr = StringValueCStr(v); 00208 00209 if (_debug) 00210 fprintf(stderr, "==> %s(0x%lx) %s\n", __FUNCTION__, s, vstr); 00211 00212 return rpmhdrLoadTag(h, vstr); 00213 } 00214 00215 static void 00216 initProperties(VALUE klass) 00217 { 00218 rb_define_method(klass, "debug", rpmhdr_debug_get, 0); 00219 rb_define_method(klass, "debug=", rpmhdr_debug_set, 1); 00220 rb_define_method(klass, "[]", rpmhdr__get, 1); 00221 } 00222 00223 /* --- Object ctors/dtors */ 00224 static void 00225 rpmhdr_free(Header h) 00226 { 00227 if (_debug) 00228 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, h); 00229 00230 h = headerFree(h); 00231 } 00232 00233 static VALUE 00234 rpmhdr_new(int argc, VALUE *argv, VALUE s) 00235 { 00236 Header h; 00237 00238 rb_scan_args(argc, argv, "00"); 00239 00240 h = headerNew(); 00241 00242 if (_debug) 00243 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, h); 00244 return Data_Wrap_Struct(s, 0, rpmhdr_free, h); 00245 } 00246 00247 /* --- Class initialization */ 00248 void 00249 Init_rpmhdr(void) 00250 { 00251 rpmhdrClass = rb_define_class("Hdr", rb_cObject); 00252 if (_debug) 00253 fprintf(stderr, "==> %s() rpmhdrClass 0x%lx\n", __FUNCTION__, rpmhdrClass); 00254 #ifdef NOTYET 00255 rb_include_module(rpmhdrClass, rb_mEnumerable); 00256 #endif 00257 rb_define_singleton_method(rpmhdrClass, "new", rpmhdr_new, -1); 00258 initProperties(rpmhdrClass); 00259 initMethods(rpmhdrClass); 00260 } 00261 00262 VALUE 00263 rpmrb_NewHdr(void *_h) 00264 { 00265 return Data_Wrap_Struct(rpmhdrClass, 0, rpmhdr_free, _h); 00266 }
1.7.5.1