>From the archives:

On Wed May 30 19:10:28 EDT 2001, [EMAIL PROTECTED] wrote:
> On Wed May 30 18:57:33 EDT 2001, [EMAIL PROTECTED] wrote:
> > >you can't use typestr anymore.  it's a reserved word.
> > 
> > But what does it do?  I just spent a few minutes looking
> > at the compiler source, and it was not obvious to me.
> 
> Typestr was one of the things to come out of Ken's parting
> flurry of activity. Here's the complete documentation as we have
> it from his show-and-tell a couple of days before he left:
> 
> #include      <u.h>
> #include      <libc.h>
> 
> typestr       struct  _cmplx  Cmplx;
> struct        _cmplx
> {
>       double  r;
>       double  i;
> };
> int   Zconv(va_list*, Fconv*);
> 
> #pragma       varargck        type    "Z"     Cmplx
> 
> void
> main(void)
> {
>       Cmplx a, b;
>       int ia[10];
>       double d;
> 
>       fmtinstall('Z', Zconv);
>       a = (Cmplx){1, 0};
>       b = (Cmplx){0, 1};
> 
>       a = -((a + b) - (b - a)) + -((a - b) - (b + a));
>       print("a = %Z\n", a);
>       a += b;
>       print("a = %Z\n", a);
> 
>       if(a == a)
>               print("ok\n");
> 
>       a = (d = a);
>       print("d = %g\n", d);
>       print("a = %Z\n", a);
> 
>       a = (Cmplx)1.0;
>       print("a = %Z\n", a);
> }
> 
> /*
>  * print conversion
>  */
> int
> Zconv(va_list *arg, Fconv *fp)
> {
>       char s[50];
>       Cmplx z;
> 
>       z = va_arg(*arg, Cmplx);
>       sprint(s, "(%g %g)", z.r, z.i);
>       strconv(s, fp);
>       return sizeof(z);
> }
> 
> /*
>  * operators
>  */
> Cmplx
> _cmplx_pos_(Cmplx a)
> {
>       Cmplx r;
> 
>       r.r = +a.r;
>       r.i = +a.i;
>       return r;
> }
> 
> Cmplx
> _cmplx_neg_(Cmplx a)
> {
>       Cmplx r;
> 
>       r.r = -a.r;
>       r.i = -a.i;
>       return r;
> }
> 
> Cmplx
> _cmplx_add_(Cmplx a, Cmplx b)
> {
>       Cmplx r;
> 
>       r.r = a.r + b.r;
>       r.i = a.i + b.i;
>       return r;
> }
> 
> Cmplx
> _cmplx_sub_(Cmplx a, Cmplx b)
> {
>       Cmplx r;
> 
>       r.r = a.r - b.r;
>       r.i = a.i - b.i;
>       return r;
> }
> 
> int
> _cmplx_eq_(Cmplx a, Cmplx b)
> {
>       Cmplx r;
> 
>       return a.r == b.r && a.i == b.i;
> }
> 
> /*
>  * assignment-op (can be made from assig and op)
>  */
> Cmplx
> _cmplx_asadd_(Cmplx *a, Cmplx b)
> {
>       *a = *a + b;
>       return *a;
> }
> 
> Cmplx
> _cmplx_assub_(Cmplx *a, Cmplx b)
> {
>       *a = *a - b;
>       return *a;
> }
> 
> /*
>  * conversions
>  */
> int
> _cmplx_i_(Cmplx a)
> {
>       return sqrt(a.r*a.r + a.i*a.i);
> }
> 
> double
> _cmplx_d_(Cmplx a)
> {
>       return sqrt(a.r*a.r + a.i*a.i);
> }
> 
> Cmplx
> _d_cmplx_(double a)
> {
>       Cmplx r;
> 
>       r.r = a;
>       r.i = 0;
>       return r;
> }

Reply via email to