|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 14254 (0x37ae)
Types: TextFile
Names: »imagesbr.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/others/image/imagesbr.c«
/* imagesbr.c - image subroutines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/others/image/RCS/imagesbr.c,v 7.0 89/11/23 21:59:58 mrose Rel $";
#endif
/*
* $Header: /f/osi/others/image/RCS/imagesbr.c,v 7.0 89/11/23 21:59:58 mrose Rel $
*
*
* $Log: imagesbr.c,v $
* Revision 7.0 89/11/23 21:59:58 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include <ctype.h>
#include <stdio.h>
#include <varargs.h>
#include "imagesbr.h"
#include "quipu/bind.h"
#include "quipu/ds_search.h"
#include "quipu/entry.h"
/* \f
GENERAL */
static char *myname = "image";
int recording = 0;
static LLog _pgm_log = {
"./image.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
LLOG_FATAL, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK
};
LLog *pgm_log = &_pgm_log;
/* \f
AKA */
struct aka {
struct aka *ak_forw;
struct aka *ak_back;
char *ak_domain;
char *ak_local;
struct dn_seq *ak_bases;
struct type_IMAGE_Image *ak_image;
};
static struct aka akas;
static struct aka *AHead = &akas;
static int stay_bound = 0;
DN local_dn;
struct dn_seq *dm2dn_seq ();
extern char *local_dit;
struct dn_seq *dn_seq_push ();
int dn_seq_print ();
/* \f
*/
void init_aka (pgm, stayopen, dit)
char *pgm,
*dit;
int stayopen;
{
char *cp;
register struct aka *ak;
static int once_only = 0;
if (once_only == 0) {
int argp;
char *arg[2],
**argptr;
quipu_syntaxes ();
argp = 0;
arg[argp++] = myname;
arg[argp] = NULLCP;
dsap_init (&argp, (argptr = arg, &argptr));
once_only = 1;
}
stay_bound = stayopen;
myname = pgm;
AHead -> ak_forw = AHead -> ak_back = AHead;
if ((ak = (struct aka *) calloc (1, sizeof *ak)) == NULL)
adios (NULLCP, "out of memory");
ak -> ak_domain = ak -> ak_local = "";
insque (ak, AHead -> ak_back);
if ((local_dn = str2dn (cp = dit ? dit: local_dit)) == NULLDN)
adios (NULLCP, "local_dit invalid: \"%s\"", cp);
}
/* \f
*/
static struct aka *mbox2ak (local, domain)
char *local,
*domain;
{
register struct aka *ak,
*am;
if (domain == NULL)
domain = "";
if (local == NULL)
local = "";
for (ak = AHead -> ak_forw; ak != AHead; ak = ak -> ak_forw)
if (!lexequ (domain, ak -> ak_domain)
|| !lexequ (local, ak -> ak_local)) {
if (recording)
LLOG (pgm_log, LLOG_NOTICE,
("hit \"%s\" \"%s\"", domain, local));
return ak;
}
if ((am = (struct aka *) calloc (1, sizeof *am)) == NULL
|| (am -> ak_domain = strdup (domain)) == NULL
|| (am -> ak_local = strdup (local)) == NULL)
adios (NULLCP, "out of memory");
if (recording)
LLOG (pgm_log, LLOG_NOTICE, ("miss \"%s\" \"%s\"", domain, local));
if (index (domain, '.'))
am -> ak_bases = dm2dn_seq (domain);
else
am -> ak_bases = dn_seq_push (local_dn, NULLDNSEQ);
insque (ak = am, AHead);
return ak;
}
/* \f
DIRECTORY */
#define ADOMAIN "associatedDomain"
#define PHOTO "photo"
#define USERID "userid"
static int bound = 0;
static int dlevel = 0;
struct dn_seq *dm2dn_seq_aux ();
static struct dn_seq *dm2dn_seq (dm)
char *dm;
{
register char *dp;
for (dp = dm; *dp; dp++)
if (isupper (*dp))
*dp = tolower (*dp);
dlevel = 0;
if (!bound && do_bind () == NOTOK)
return NULLDNSEQ;
return dm2dn_seq_aux (dm, NULLDN, NULLDNSEQ);
}
/* \f
*/
static struct dn_seq *dm2dn_seq_aux (dm, dn, dlist)
char *dm;
DN dn;
struct dn_seq *dlist;
{
register char *dp;
char buffer[BUFSIZ];
struct ds_search_arg search_arg;
register struct ds_search_arg *sa = &search_arg;
struct ds_search_result search_result;
register CommonArgs *ca;
register struct ds_search_result *sr = &search_result;
struct DSError error;
register struct DSError *se = &error;
PS ps;
if ((ps = ps_alloc (str_open))
&& str_setup (ps, buffer, sizeof buffer, 1) != NOTOK) {
dn_print (ps, dn, READOUT);
*ps -> ps_ptr = NULL;
}
else
buffer[0] = NULL;
if (ps)
(void) ps_free (ps);
if (debug)
fprintf (stderr, "dlevel=%d dm=%s dn=%s\n", dlevel, dm, buffer);
bzero ((char *) sa, sizeof *sa);
ca = &sa -> sra_common;
ca -> ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN;
ca -> ca_servicecontrol.svc_prio = SVC_PRIO_LOW;
ca -> ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;
ca -> ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT;
ca -> ca_servicecontrol.svc_scopeofreferral = SVC_REFSCOPE_NONE;
sa -> sra_baseobject = dn;
sa -> sra_subset = SRA_ONELEVEL;
sa -> sra_searchaliases = FALSE;
dp = dm;
for (;;) {
int i;
EntryInfo *ptr;
register filter *fi;
register AttributeType at;
if (debug)
fprintf (stderr, "-- dlevel=%d dp=%s(%d) dn=%s\n",
dlevel, dp, strlen (dp), buffer);
if ((i = strlen (dp)) < dlevel)
break;
sa -> sra_filter = fi = filter_alloc ();
bzero ((char *) fi, sizeof *fi);
fi -> flt_type = FILTER_ITEM;
fi -> FUITEM.fi_type = FILTERITEM_EQUALITY;
if ((fi -> FUITEM.UNAVA.ava_type = at = AttrT_new (ADOMAIN)) == NULL)
adios ("invalid attribute type \"%s\"", ADOMAIN);
fi -> FUITEM.UNAVA.ava_value =
str2AttrV (dp, at -> at_table -> oa_syntax);
if (ds_search (sa, se, sr) != DS_OK) {
if (recording)
LLOG (pgm_log, LLOG_EXCEPTIONS,
("search operation failed"));
(void) ds_unbind ();
bound = 0;
goto free_filter;
}
if (sr -> srr_correlated != TRUE)
correlate_search_results (sr);
if (sr -> CSR_entries == NULLENTRYINFO) {
if (recording)
LLOG (pgm_log, LLOG_NOTICE,
("search for %s \"%s\" at baseobject \"%s\" failed",
ADOMAIN, dp, buffer));
filter_free (sa -> sra_filter);
if (dp = index (dp, '.'))
dp++;
if (dp == NULL)
break;
continue;
}
if (recording)
LLOG (pgm_log, LLOG_NOTICE,
("search for %s \"%s\" at baseobject \"%s\" succeeded",
ADOMAIN, dp, buffer));
if (i > dlevel) {
dlevel = i;
if (dlist)
dn_seq_free (dlist), dlist = NULLDNSEQ;
}
if (i == dlevel)
for (ptr = sr -> CSR_entries; ptr; ptr = ptr -> ent_next) {
struct dn_seq *dprev = dlist;
(void) dn_decode (ptr -> ent_dn);
dlist = dm2dn_seq_aux (dm, ptr -> ent_dn, dlist);
if (dprev == dlist)
dlist = dn_seq_push (ptr -> ent_dn, dlist);
else
if (i < dlevel)
break;
}
entryinfo_free (sr -> CSR_entries, 0);
free_filter: ;
filter_free (sa -> sra_filter);
break;
}
return dlist;
}
/* \f
*/
static PE image_search (ak)
register struct aka *ak;
{
register struct dn_seq *dlist;
struct ds_search_arg search_arg;
register struct ds_search_arg *sa = &search_arg;
struct ds_search_result search_result;
register CommonArgs *ca;
register struct ds_search_result *sr = &search_result;
struct DSError error;
register struct DSError *se = &error;
PE pe = NULLPE;
bzero ((char *) sa, sizeof *sa);
ca = &sa -> sra_common;
ca -> ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN;
ca -> ca_servicecontrol.svc_prio = SVC_PRIO_LOW;
ca -> ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;
ca -> ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT;
ca -> ca_servicecontrol.svc_scopeofreferral = SVC_REFSCOPE_NONE;
sa -> sra_subset = SRA_WHOLESUBTREE;
sa -> sra_searchaliases = TRUE;
if (recording) {
LLOG (pgm_log, LLOG_NOTICE, ("searching for %s %s",
ak -> ak_domain, ak -> ak_local));
pslog (pgm_log, LLOG_NOTICE, " using baseobjects ",
dn_seq_print, (caddr_t) ak -> ak_bases);
}
for (dlist = ak -> ak_bases; dlist; dlist = dlist -> dns_next) {
register filter *fi;
register AttributeType at;
if ((sa -> sra_baseobject = dlist -> dns_dn) == NULL)
continue;
sa -> sra_filter = fi = filter_alloc ();
bzero ((char *) fi, sizeof *fi);
fi -> flt_type = FILTER_ITEM;
fi -> FUITEM.fi_type = FILTERITEM_EQUALITY;
if ((fi -> FUITEM.UNAVA.ava_type = at = AttrT_new (USERID)) == NULL)
adios ("invalid attribute type \"%s\"", USERID);
fi -> FUITEM.UNAVA.ava_value =
str2AttrV (ak -> ak_local, at -> at_table -> oa_syntax);
sa -> sra_eis.eis_allattributes = FALSE;
sa -> sra_eis.eis_select = as_comp_new (str2AttrT (PHOTO), NULLAV,
NULLACL_INFO);
sa -> sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
if (ds_search (sa, se, sr) != DS_OK) {
if (recording)
LLOG (pgm_log, LLOG_EXCEPTIONS, ("search operation failed"));
(void) ds_unbind ();
bound = 0;
goto free_filter;
}
if (sr -> srr_correlated != TRUE)
correlate_search_results (sr);
if (sr -> CSR_entries == NULLENTRYINFO) {
if (recording)
pslog (pgm_log, LLOG_NOTICE,
"search failed at baseobject ", dn_print,
(caddr_t) dlist -> dns_dn);
filter_free (sa -> sra_filter);
continue;
}
if (sr -> CSR_entries -> ent_attr == NULLATTR) {
if (recording)
pslog (pgm_log, LLOG_NOTICE,
"search succeeded (but no attribute) at baseobject ",
dn_print, (caddr_t) dlist -> dns_dn);
}
else {
pe = (PE) sr -> CSR_entries -> ent_attr -> attr_value ->
avseq_av.av_struct;
sr -> CSR_entries -> ent_attr -> attr_value -> avseq_av.av_struct =
NULL;
if (recording)
pslog (pgm_log, LLOG_NOTICE, "search succeeded at baseobject ",
dn_print, (caddr_t) dlist -> dns_dn);
}
entryinfo_free (sr -> CSR_entries, 0);
free_filter: ;
filter_free (sa -> sra_filter);
break;
}
return pe;
}
/* \f
*/
static do_bind ()
{
struct ds_bind_arg bind_arg,
bind_result;
register struct ds_bind_arg *ba = &bind_arg,
*br = &bind_result;
struct ds_bind_error bind_error;
register struct ds_bind_error *be = &bind_error;
bzero ((char *) ba, sizeof *ba);
ba -> dba_version = DBA_VERSION_V1988;
if (ds_bind (ba, be, br) != DS_OK) {
if (recording)
LLOG (pgm_log, LLOG_EXCEPTIONS,
("directory bind failed: %s",
be -> dbe_type == DBE_TYPE_SECURITY ? "security error"
: "DSA unavailable"));
return NOTOK;
}
bound = 1;
return OK;
}
/* \f
IMAGE */
static int passno;
static int x, y, maxx;
static struct type_IMAGE_Image *im = NULL;
/* \f
*/
struct type_IMAGE_Image *fetch_image (local, domain)
char *local,
*domain;
{
PE pe;
register struct aka *ak;
if ((ak = mbox2ak (local, domain)) == NULL)
return NULL;
if (ak -> ak_image)
return ak -> ak_image;
if (!bound && do_bind () == NOTOK)
return NULL;
if ((pe = image_search (ak)) == NULLPE)
return NULL;
if (!stay_bound) {
(void) ds_unbind ();
bound = 0;
}
im = NULL;
if (pe_pullup (pe) == NOTOK) {
if (debug)
fprintf (stderr, "pe_pullup: %s\n", pe_error (pe -> pe_errno));
goto out;
}
if (prim2bit (pe) == NULLPE) {
if (debug)
fprintf (stderr, "prim2bit: %s\n", pe_error (pe -> pe_errno));
goto out;
}
for (passno = 1; passno < 3; passno++)
if (decode_t4 (pe -> pe_prim, PHOTO, ps_get_abs (pe))
== NOTOK) {
fprintf (stderr, "\n");
if (im) {
qb_free (im -> data);
free ((char *) im);
im = NULL;
}
break;
}
out: ;
pe_free (pe);
return (ak -> ak_image = im);
}
/* \f
*/
/* ARGSUSED */
photo_start(name)
char *name;
{
if (passno == 1)
maxx = 0;
x = y = 0;
return OK;
}
/* ARGSUSED */
photo_end (name)
char *name;
{
int len;
register struct qbuf *qb,
*pb;
if (passno == 1) {
x = maxx, y--;
if (debug)
fprintf (stderr, "ending pass one for \"%s\", %dx%d\n",
name, x, y);
if ((im = (struct type_IMAGE_Image *) calloc (1, sizeof *im))
== NULL) {
if (debug)
fprintf (stderr, "calloc fails");
return NOTOK;
}
im -> width = x, im -> height = y;
len = ((im -> width + 7) / 8) * im -> height;
if ((im -> data = qb = (struct qbuf *) malloc (sizeof *qb)) == NULL) {
if (debug)
fprintf (stderr, "unable to allocate qbuf");
return NOTOK;
}
qb -> qb_forw = qb -> qb_back = qb;
qb -> qb_data = NULL, qb -> qb_len = len;
if ((pb = (struct qbuf *) calloc ((unsigned) (sizeof *pb + len), 1))
== NULL) {
if (debug)
fprintf (stderr, "unable to allocate qbuf (%d+%d)",
sizeof *qb, len);
return NOTOK;
}
pb -> qb_data = pb -> qb_base, pb -> qb_len = len;
insque (pb, qb);
}
return OK;
}
photo_black (length)
int length;
{
if (passno == 2) {
register int i,
j;
register unsigned char *cp;
cp = (unsigned char *) im -> data -> qb_forw -> qb_data
+ ((im -> width + 7) / 8) * y + x / 8;
i = x % 8;
for (j = length; j > 0; j--) {
*cp |= 1 << i;
if (++i == 8)
cp++, i = 0;
}
}
x += length;
return OK;
}
photo_white (length)
int length;
{
x += length;
return OK;
}
/* ARGSUSED */
photo_line_end (line)
caddr_t line;
{
if (passno == 1 && x > maxx)
maxx = x;
x = 0, y++;
return OK;
}
/* \f
ERRORS */
#ifndef lint
void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
if (errsw != NOTOK) {
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif
/* \f
MISC */
#ifndef lint
char *strdup (s)
char *s;
{
char *p;
if (p = malloc ((unsigned) (strlen (s) + 1)))
(void) strcpy (p, s);
return p;
}
#endif