text:
A Silver Star Story and Award by John Hebert
This letter is in response to the article that General Finley had in the Dec. 77 Rolling W suggesting that it would be interesting to the members if some of us who had a story to tell about our experience with the 89th Div. during WWII would write to you about it.
Well, as a sniper, aid a jet-Scout and later on a PFC Squad Leader of Co. 'F, 353d Inf. Regt, I have many stories that I could tall but for now, I would like to tell you about what happened on March 20, 1945 somewhere near Kirschroth, Germany. I was preceding my platoon as 1st Scout and noticed a number of enemy soldiers on a hill just ahead of me. I signaled back that the enemy was in sight and where and within a few seconds our platoon leader, 1st LT Oot and Platoon SGT Markley were all on their way up to size up our situation but before they got to me, all hell broke loose. Although we did not know it at that very moment, we soon found out that we had run head on into a very heavy fortified enemy position armed with artillery, anti aircraft guns, machine guns and small arms with snipers that had 10 power scopes. They opened up on us with everything they had and at that time, I did not think that many of us would survive but we somehow got our fire power turned on and were laying in some very accurate fire under the direction of LT Ott and SGT Markley.
As I recall, our artillery fire was delayed because they were on the road and had to set up when we called for support fire but once they did get set up, their fire was very much on target. We then tried to assault their position but their fire was so heavy that we had to hit the ground and about five, of us were caught in the open with no means of concealment. Along with me were Kenneth Haines and Rudy Triviso but I don't recall the others. The fire at this point was very heavy including anti aircraft shells bursting overhead. Ken Rainea and I were almost shoulder-to-shoulder when we hit the ground and there was a German machine gun firing at us. Haines opened up on the machine gun with his M1 rifle that had 8 rounds of tracers in the clip. I know that he knocked out that machine gun but right, after be fired the last round, a German sniper shot him right between the eyes and killed Haines instantly. The sniper then started to zero in on me and just missed my head and shot off a piece of the heel from my combat boot. We then made a bee line dash for some bushes to the left of our position and from there, I knocked out a machine gun and two snipers and it was from this position that I saw my buddy, Fred Kirk, who was the oldest man in our company but could keep up with all of us, get hit and I knew it was bad. The medic could not get to him so I crawled out and dragged him back to where the medic could tend to him but he was shot up very bad with small arms and shrapnel and died shortly afterward.
A short distance away on my left was Earl Nordin, who was the youngest man in the company. He also was killed by enemy fire. I don't know how many of our men were killed or wounded that day but it could have been much worse when you consider what we ran into.
I then noticed German soldiers coming toward our positions so I circled around to the left -and came up behind them and captured six of them who were trying to feel out our positions. If my memory serves me, we then called for air support and one or more P-47 or P-1 fighters came over and dropped a few bombs. As time went on, our firepower was building up; and our artillery fire was very effective and soon thereafter the Germans were waving the white flag. As 1st Scout, it was up to me to make contact with the Germans but as I got up and started to walk toward them, one or more of our men on the far left in the woods and over a hill continued to fire and as we later found out, they could not hear us yelling to cease fire. The Germans went back into their holes and opened fire on us but we did not return the fire so they must have realized what had happened. Again they waved the white flag and I went out and made contact with them. When the rest of the company came up, we looked over the German positions and found that they were constructed so well that even bombs could not knock them out. All things considered, we were very lucky that things turned out the way they did. For my part in this battle and in other encounters, I was awarded the Silver Star. I feel today as I felt then, that a lot more of our men should have been decorated for their actions, including LT Oot and SGT Markley, who were outstanding.
I hope that this article, along with others that will be sent to you, will be seen by the families of the men who were killed in action or died from their wounds so that they might know how their loved ones died while serving with the 89th Infantry Division in W.W. II.
John Hebert
Hazen Road
Silver Star-WWII version
Here is the citation for John's Silver Star:
CITATION FOR SILVER STAR
Private First, Class JOHN A. Hebert 11058178; Infantry, United States Army, distinguished, himself by gallantry in action as a scout of Company "F", 353d Infantry on two occasions in Germany. When his platoon was held by severe enemy artillery, machine gun and sniper fire near Kirschroth on 20 March 1945, Private First Class Hebert on his own initiative daringly advanced to a vantage point and killed two snipers. Then, seeing a wounded comrade, he crossed through heavy machine gun fire to him, administered. first aid under fire, and. moved the man 75 yards to a place of safety. Continuing in the attack, he captured six enemy riflemen and thereby enabled his platoon to take its objective. On 14 April he was preceding his platoon near the Saale River when he observed German soldiers near the buildings of a concentration carp. By boldly rushing forward firing his rifle, Private First Class HEBERT captured 39 enemy officers and men without a fight. His daring, bravery, determination, and devotion to duty aided. greatly in the combat effectiveness of his platoon and were in keeping with the best traditions of the armed forces of the United. States. Entered the military service from Massachusetts.


A North Olmsted group is bent on boosting exports between here and Nigeria. The Nigeria-USA Chamber of Commerce aims to help American businesses sift through trade issues and identify business opportunities in the African country, and vice versa. "Whenever people hear the word, "Nigeria,' all they ever think about are the negative things that come out of Nigeria — scams, insurance," said Lee O. Kareem, chamber president and CEO and one of the group's five founding members. But those are the actions of a few, he said. "We want Nigeria to be known for the good things," said Mr. Kareem, a native of Nigeria and the owner of two North Olmsted companies, Biotronics Inc. and Tech-Consultants .org. Launched last March, the chamber has received calls from U.S. businesses as far south as Florida, according to Mr. Kareem, who said an Atlanta business owner attended the chamber's International Trade & Investment Summit at Quicken Loans Arena last month. This summer, the chamber will host a week-long program in Nigeria that will conclude with a reverse trade mission, through which a group of Nigerian business people will travel to the United States for matchmaking with companies here. Susan Whitney said she and her staff at the U.S. Commercial Service in Cleveland, an agency of the U.S. Department of Commerce, support the local effort. Her organization helps businesses determine their best overseas markets, and also provides legitimacy checks on buyers, which helps to guard against the scams that have contributed to Nigeria's notoriety. "We think it's a great thing," Ms. Whitney, office director at the Commercial Service, said of the Nigeria-USA chamber. "Nigeria is a great country to export to." As with any country, though, Nigeria is not right for all companies. It's particularly lucrative for companies in the oil and gas industry — something Pipe Line Development Co. in Westlake knows firsthand. The company, which makes repair products for pipelines, has been exporting to Nigeria since 1984, with up to $4 million of product exported there annually, said Kim Smith, marketing manager. "It's a great place to do business, but first you must do your homework," Ms. Smith said.


MALDEN, Mass. – Bay State Soccer League side Kendall Wanderers FC put up a valiant effort in Sunday's USASA Werner Fricker U.S. Open Cup quarterfinal, but Lansdowne Bhoys FC (N.Y.) were too strong as they clinched a 3-0 win at Pine Banks Park.
Ovan Oakley opened the scoring by converting a Lukas Zargas in the 20th minute to give the Bhoys the lead going into the half. The guests pulled away in the second half Sikele Sylvester met a cross from Ibrahim Diaby at the far post to put Wanderers in deeper ditch. Glen Reid capped the scoring in the 85th minute when he collected a Marcos Nunez pass and blasted it through.
Following Oakley's goal, Wanderers best chance at an equalizer came in the 29th minute when Francis Mulkern uncorked a shot from the left flank that buzzed over the bar.
Down, but far from out, the hosts earned another quality chance in the 56th minute when Brama Samati hit a free kick near the edge of the box that forced a diving save from Abdoukarim Danso.
Not long after Samiti's chance, Sylvester tallied after Diaby worked his way around a pair of Kendall defenders to set up the chance from point blank range. Kendall's comeback hopes were effectively dashed in the 85th minute when Reid stepped up and launched a ball that bulged the back of the net.
With the win, Lansdowne Bhoys, who beat BSSL side Southie FC in National Amateur Cup play earlier this month, advance to the Fricker Cup semifinal on May 14 against FC Motown (N.J.).
Wanderers resume league play on Saturday against Southie FC.


This rain is getting soooo boring now. I always get the feeling that if its raining really hard then it means good things are on the way. It's like a "get it out of your system" kinda thing but seriously, this rain and wind is never ending! Because of this, me and the other half decided to transform our bedroom today so took a trip to The Range and spent a few penny's on paint, furniture and other bits of homeware! I will show you the outcome of this in a blog post next week hopefully!
So pretty :). I love the skirt!


3 Letters And Second Letter Is A - You Go Words!
Three letter words, and second letter a. List of 198 words that are 3 letters and second letter is a. Add length, consonants, vowels, syllables, origin, spelling and more. View word search examples.
3 letters and second letter is a was last updated on April 22, 2019.


text:
Q: Bezier Curve of N order I am trying to implement the formula for bezier curves of Nth order in my program.
It looks to me that I have done everything right but the visual result is not correct.
Here it is:
The red cube is P0 and the blue is P8.
The white cubes are the actual set of points that make the curve.
The orange cubes are the control points.
What I see is that there is a loop before the end of the curve where the curve attaches to the last (blue cube) point. Looks like there is an invisible point.
And another thing is that between P0 and P1 is also something weird going on...
Can anyone help me to resolve it?
Here is the code I use:
    private void Update()
    {
        controlPointsCoords = ControlPoints.Select(p => p.transform.position).ToArray();

        for (int p = 0; p < PointsSet.Count; p++)
        {
            PointsSet[p].transform.position = CurveDegreeN
            (
                controlPointsCoords,
                Rt(p, PointsSet.Count)
            );
        }
    }

    private Vector3 CurveDegreeN(Vector3[] pointsCoords, float u)
    {
        float X = 0, Y = 0, Z = 0;
        float n = pointsCoords.Length - 1;

        for (int i = 0; i < pointsCoords.Length; i++)
        {
            var coef = (Factorial(n) / (Factorial((float)i) * Factorial(n - i))) * Mathf.Pow(u, i) * Mathf.Pow(1 - u, n - i);
            X += coef * pointsCoords[i].x;
            Y += coef * pointsCoords[i].y;
            Z += coef * pointsCoords[i].z;
        }

        return new Vector3(X, Y, Z);
    }

    private float Factorial(float n)
    {
        if (n == 0) return 1;

        float res = 0.0f;
        for (int i = 1; i < n; i++) res += (float)Math.Log(i);
        return (float)Math.Exp(res);
    }

    private float Rt(int current, int count)
    {
        return ((float)current - 0) / ((float)count - 0) * (1 - 0) + 0;
    }

I hope this will be clear for someone!
Thank you in advance!
UPDATE:
I reduced amount of points to 3. Here is the result: 3 Points curve.
It is clearly visible here that something is wrong with the computations... Any more suggestions?

A: Start by simplifying that code, because this is going to be unreliable to debug. Step one: let's not use calculus unless there is an actual benefit to doing so. Using the full binomial calculation and powers-of-t is typically just as fast (or slow) as interpolation (Bezier curves are trivially expressed as list reductions), but interpolation is dead-easily implemented with simple addition and multiplication, while binomial computation and powers are more work. So let's evaluate geometrically instead of using calculus:
function drawCurve(coords[]):
  points = []
  // the higher you make "steps", the more curve points you generate:
  for (s=0, steps=10; s<=steps; s++):
    t = s/steps
    nt = 1 - t
    list[] = coords.shallowCopy()

    // We now run our list reduction to get our on-curve
    // point at t, using de Casteljau's algorithm:
    while(list.length > 1)
      for(i = 0, e = list.length; i < e; i++):
        list[i] = nt * list[i] + t * list[i+1]
      list.pop()

    // And what's left is our on-curve point at t.
    // Beauty; push and move on to the next point.
    points.push(list[0])
  return points

Done. By ruling out binomials and powers, and implementing curve evaluation purely based on the iterative interpolation (i.e. using de Casteljau's algorithm) there is literally nothing that can be "done wrong" in this code: a great quality for code to have!
You can make this code even more efficient by being explicit about your coordinates, using array[3] instead of 3d vector classes so that you don't have to rely on operator overloading, or function call slowldowns, during the interpolation steps, so you get something like:
function drawCurve(coords[]):
  coords = flatten(coords) // one-time convert Vector3 to flat [x,y,z] arrays
    ...
    while(list.length > 1)
      for(i = 0, e = list.length; i < e; i++):
        v1 = list[i]
        v2 = list[i+1]
        list[i][0] = nt * v1[0] + t * v2[0] // x
        list[i][1] = nt * v1[1] + t * v2[1] // y
        list[i][2] = nt * v1[2] + t * v2[2] // z
      list.pop()
    points.push(new Vector3(list[0]))
  return points

(and a final optimization, though typically not worth it, is to unroll the while as well, to effect a single for loop based on the initial L=list.length and counter i, where L is decremented by one and i resets to 0 when i==L, and which terminates when L==1)
And if you absolutely need calculus (which is honestly not the case here) at the very least generate your binomial coefficients "efficiently": they are super simple to generate based on Pascal's triangle so for the love of your math coprocessor do not use factorials to evaluate them, they can literally be generated by just adding up some integers:
lut = [      [1],           // n=0
            [1,1],          // n=1
           [1,2,1],         // n=2
          [1,3,3,1],        // n=3
         [1,4,6,4,1],       // n=4
        [1,5,10,10,5,1],    // n=5
       [1,6,15,20,15,6,1]]  // n=6

binomial(n,k):
  while(n >= lut.length):
    s = lut.length
    nextRow = []
    nextRow[0] = 1
    for(i=1, prev=s-1; i<prev; i++):
      nextRow[i] = lut[prev][i-1] + lut[prev][i]
    nextRow[s] = 1
    lut.push(nextRow)
  return lut[n][k]

(If you do this, either make sure you remember that you're programming and array offsets start at 0, or add dummy values at row/column positions [0] so that you can "intuitively" call binomial(4,2) to get 4 choose 2 rather than 5 choose 3)

A: Apart from the fact that this is a most inefficient computation of the binomials, that you should pre-compute the binomial sequence and not recompute them for every point you plot, and that you could avoid most of the calls to the power function by employing a Horner like method, ....
your code seems to be correct and also the visual is consistent with the control points forcing the middle part into a straight line. High order polynomial interpolation can have some complicated wiggles at segments where the sample or control points have (relatively) large variations in value.

Update: I did not at first look too closely at the helper functions as I would not compute binomials using separate computation of factorials, but your factorial function does not contain the factor n for the call with argument n, i.e., it computes (n-1)!.

redpajama_set_name: RedPajamaStackExchange


text:
What is prop trader and Steps to become a Prop Trader?
Ethan More - January 23, 2023
Prop trading is something you need to be aware of, understand the benefits and drawbacks of, obtain a licenced for, and fund your account to become a proprietary trader. Additionally, you need...
Why Should Your Organisation Integrate Scheduling Systems into the Workforce Management Software?
Ethan More - January 6, 2023
Roster or scheduling software is a type of software that helps organisations to manage their employee schedules and shift patterns. It allows employers to create, maintain, and track employee schedules in an...
Boosting Productivity – 3 Areas to Focus On
Ethan More - December 24, 2022
Productivity is an odd professional term due to how nebulous and vague it can feel while also being such a core concept to the idea of success. You might even be aware...
Some Of The Gold IRA Investment Companies Who Shine
Radhe - December 20, 2022
Following the successful completion of a rollover to a gold or silver IRA, you will be able to make annual contributions to your account by buying coins or bars. Those who are...
How technology support can smoothen business operations
How can technology support help smoothen business operations: What is technical support? It is the process and activity through which an organization assists users of...
How much does an SEO Agency charge in London?
You've recently decided that your business needs to invest in Search Engine Optimisation (SEO). Congratulations! This is a great decision that will help you draw more traffic to your website and, as...
Ethereum price prediction: A shot Guide
Ethan More - September 28, 2022
Following Bitcoin's breakthrough, a young programmer named Vitalik Buterin took an interest in the emerging financial technology and concluded that it might be developed further and put to use for more than...
Forex No Deposit Bonus – A Basic Review
Forex brokers offering a welcome bonus have increased by 15% since 2018. Several recent studies also claim that nearly 45% of new traders use the no-deposit bonus as a BOOST to begin...
Must-Have Windows Apps and Software for a New PC
Ethan More - September 8, 2022
Windows comes preloaded on most modern PCs, making it the most widely used Operating System globally. Its most recent version is Windows 11, which is highly recommendable due to its new features...
Top tips for controlling dust in mines and construction projects
If you're tasked with containing dust at a mining site or construction site, there are some things you can do to reduce it. Water sprays attached to pneumatic and hydraulic tools can...

redpajama_set_name: RedPajamaCommonCrawl


How do I roll over my Defined Contribution (DC) account?
There are two ways to receive a rollover of your Defined Contribution (DC) account. You can choose either a direct rollover of all or part of the taxable portion of your DC account, or a direct rollover of all or part of the non-taxable portion of your DC account.
Read more about rollovers and taxes.
Do I have to annuitize my DC account? What are my payment options?
What is my PERF pension benefit?
How do I apply for a distribution of my Defined Contribution (DC) account after I retire?
How can I find out how much my employer is contributing to my defined contribution account?


Hello all, I consider myself a first time f body owner but a long time bowtie guy I just recently purchased a Yellow 1987 IROC. The car is mostly original but was not very loved in the years prior to my purchase. The seats were destroyed and moldy and the engine oil is mixed with coolent. I am thinking that it has a blown head gasket, the engine and under hood accesories are all there and seem unmodified.
I am still collecting parts for the resto and plan to hopfully finish the car over the summer. My wife says I am a car addict as i currently have 4 trucks and two cars, not including my wifes Tahoe or 1967 camaro(another project).
Trucks are, 1996 chevy 1 ton with a 454 its not a dually, 1992 S10 standered cab short bed which is my "econo work ride", 1987 GMC S15 4x4 ext cab short bed I converted to front strait axle using a leaf sprung dana 30 it has approx 12 inches of suspention lift with 33 inch tires not yet completly finished. and finally a 1994 full size 4wd Blazer needing a front clip and very minor frame pulling which I purchased at the locall fall swap meet.
my cars are the 87 IROC and 1978 Malibu which is my street car/weekend racer.
I look forward to spending time on the board.
Welcome. Can you work on 2 Camaro projects at the same time?
Hi Ed and welcome to the site!


text:
var gulp = require('gulp');
var server = require('gulp-server-livereload');

gulp.task('webserver', function() {
  gulp.src('src')
    .pipe(server({
      defaultFile: 'index.html',
      livereload: true,
      directoryListing: false,
      open: true
    }));
});

gulp.task('default', ['webserver']);

redpajama_set_name: RedPajamaGithub


text:
Back to Global News
Wednesday May 1, 2019
Are Investors Putting Climate Change Before Modern Slavery?
Major investors should not simply focus on climate change and global warming, but also compel companies to tackle modern slavery when considering environmental, social, and governance (ESG) policies.
Fiona Reynolds, head of London-based Principles of Responsible Investment (PRI), says that "There are a lot of ESG conversations around climate change … but it is interlinked with modern slavery."
Take Action: Stop Investments in Eritrean Forced Labor
"We see many climate migrants and refugees who end up vulnerable and at risk of being trafficked."
The unbalanced focus among big investors, such as BlackRock, means that companies may be publicly lauded for tackling climate change while failing to address human trafficking and forced labor in their supply chains.
Thomson Reuters Foundation reports:
"Look for the laggards, target them and point to best practice from the top performers in their sector," said Reynolds. "Give them time to improve, and measure the change … it must be a collaborative and collective, long-term engagement."
Reynolds said companies must be pushed to implement and enforce robust anti-slavery policies, carry out investigations within their supply chains and closely monitor sub-contractors.
"We can't think about modern slavery alone, there needs to be a holistic human rights approach that considers fair wages, labour laws, freedom of association," Reynolds said. "You won't fix any one of these issues without addressing the others."
Britain's six biggest tea companies have all revealed their suppliers, while fashion giant H&M has done the same for each garment on its website amid rising pressure on firms to be open.
"Transparency is at the heart of good governance but it is just a starting point," added Reynolds.
Still, she believes that the private sector has a long way to go.
"The turning point will be when we don't have to talk about responsible investment but just investment … and can move beyond the mindset of making profit at any cost."
Chip in and help end modern slavery once and for all.
Chip in
Freedom United is interested in hearing from our community and welcomes relevant, informed comments, advice, and insights that advance the conversation around our campaigns and advocacy. We value inclusivity and respect within our community. To be approved, your comments should be civil.
A few things we do not tolerate: comments that promote discrimination, prejudice, racism, or xenophobia, as well as personal attacks or profanity. We screen submissions in order to create a space where the entire Freedom United community feels safe to express and exchange thoughtful opinions.
Tuesday January 24, 2023
Ukraine war potentially increasing number of known trafficking victims
A new UN report outlines how numbers of known trafficking victims are increasing following the pandemic which may be as a result of the war in...
Tuesday January 24, 2023Jan 24, 2023
Indian hospital once again tied to organ trafficking
Sunday January 15, 2023Jan 15, 2023
Trafficked brides in Kashmir
Wednesday January 11, 2023Jan 11, 2023
U.S. anti-trafficking law putting sex workers & trafficking survivors in danger


The most important and indispensible resource for any and every Organization, what so ever the size and nature of Business is the Human Resource. If you need a rapid and hands-on solution to expansion or personnel shortage? Not sure where to turn for skilled professionals who are trained to contribute immediately in a variety of areas?
AAA FM Staffing Solutions offer experienced, well groomed and connoisseur professionals in all relevant areas concerning your Functions and Operation of skilled and semi skilled in nature. You do not have to bother as we can do that at very short notice.
We shoulder this responsibility in the close perception of all applied regulatory and statutory requirements relating to Recruitment and Staffing , so that you can focus on your core business and feel all hassle free .Our solutions match the right professionals to your facility, to help you keep your operations running smooth.


Representing Minor Histories: Contemporary Womens Filmmaking and the Archive.
Play/writing histories: Navigating the Personal, Public and Institutional stories of theatre space: An Architextural study of the Citizens Theatre.
The Italian early 17thC toccata form and its developers G.G. Kapsberger and G. Frescobaldi.
The violin in Scotland from its beginnings to 1750.
Performing Geochronology in the Anthropocene: Siting Depths and Temporality along the North Atlantic Drift.
The Art of Musical Conversation: Behavioural Attitudes in the Performance Practice of Italian Music from c. 1580-1640.
Is J. S. Bach a compositional theorist?


text:
For those with more Christian tastes, the so-called experts at Wikipedia have an article about Y.
Y is the alphanumeric character that comes somewhere between the letters O and Z, and the number 17. Y recently sold out to the stock market and as such, frequently sponsors Sesame Street.
2 Sometimes Y
3 Symbolism
Y is theorized to have evolved from proto-voweltaic ancestors which roamed the Earth billions and billions of years ago. Later, in 1066, a horrific and bloody civil war erupted in France over Y's ambiguous vowel/consonant status. There were no survivors.
Continuing this bloody history, Congress decreed Y to be an unnecessary addition to the alphabet in December 8th, 1769, on the grounds that can be replaced by I under pretty much every conceivable circumstance. Y was already envious of I and his resemblance of an erect penis, and proceeded to go on a bloody rampage during the biannual Alphabet Gathering Convention Meeting Assembly Thing ( AGCMAT ). However, Congress re-assessed its decision and concluded that Y was useful in the popular internet combination of "( o Y o )", representing female breasts. Unfortunately, there were losses during Y's Rampage of the Alphabet Congress, the only notable ones being the annihilation of the letters "Þ" ( pronounced "grojj" ) and "Æ" ( pronounced "penis", and later replaced by the letter J ).
Sometimes Y[edit]
The sometimes Y is a rare, but increasingly utilized form of the factory-standard Y. Evolving out of the original Y's bi-consonantality, possibly due to the French experience, the sometimes Y is now considered as a viable alternative in that it swings both ways. Either consonantual or voweltaic depending on its intermediate context, many of today's modern enlightened words are often ambivalent toward the sometimes Y. With cry, it is a vowel, as every nth word must have a vowel. But with you, it is a consonant, as every other word must have a consonant.
In some areas of the world, this switch hitting has caused sometimes Y to be ostracized by both the vowels and the consonants. As a result, the sometimes Y may be dropped from some words altogether. Kyrgyzstan dropped the first Y as it was a sometimes Y. The second was retained as it was unambiguously voweltaic. The dropping was actually due to a misunderstanding by the former Soviet Premier, his well-meaning young companion, and his biographer. But the sometimes Y has remained optional since, by the Krgyst people.
The letter Y should not be confused with its antimatter counterpart: the Ȳ ( pronounced "Y-not" ). Contact between Y and Ȳ is likely to result in disagreement.
Symbolism[edit]
Y is the international symbol of a sexually promiscuous woman, usually found on autopsy reports to indicate that the female concerned should be buried in a Y-shaped coffin.
Retrieved from "https://daemonica.org/index.php?title=Y&oldid=69148"


While all eyes were on Derek Sheils and Joe Loughlin to secure the Man of the Meeting award, Derek McGee knew a decent result in the Grand Final wouldn't do his chances any harm either. Finishing 2nd was enough in the end and so it was, a repeat of 2015, that Derek would pick up the accolade.
Three 2nd places in the Open, the Grand Final, the 125 and a 4th in the Supersport race secured the award for Derek whose consistency is playing a pivotal role in his 2017 campaign. In particular, the Supetwins and 125GP race provided solid points and may make all the difference come the end of the season.
Of course, all 4 bikes are running sweetly from the MSS built ZX10r to the Noel Doyne R6, leaving everything technically reliable for Derek and the team steered by Roddy Hayes at the minute. With this in mind, Armoy and the build up to the Ulster GP couldn't come quick enough and more premium results are sure to be earned from their combined efforts.


text:
London developers embrace the benefits of building up
The tallest building in the world today is the Burj Khalifa in Dubai measuring 2716 feet. In order to reach the mile high mark (5,280 feet) this would need to nearly double in size.
The audience at our most recent Building Up event predicted the world's first mile high building would most likely be in Bejing (40%) with Dubai (32%) a close second. The large majority felt it was unlikely to be completed until at least 2040 (36%) with many thinking we'd have to wait another ten years until 2050 (38%).
With pressure for growth and land values at record levels, property experts are seeking innovative ways to deliver high quality developments at increased densities. The second in our Building Up series of events looked at how new techniques and developments in the construction of tall buildings can help address the challenges building up poses.
Our panel discussed a number of topical issues in front of a full house at our Fleet Place offices. Speakers included:
Professor Michael Cesarz, CEO for MULTI at thyssenkrupp Elevator showcased their impressive rope-less elevator, which not only moves vertically but also horizontally.
Matt Gough, Director of innovation and work winning at Mace group, discussed their innovative Jump Factory and how it tackles the challenges of building up - as well as being 30% faster than traditional methods.
Steve Toon, Design Director at AKT, showcased a number of high-rise residential developments in the context of the challenges around stability and how these are overcome.
Bart Kavanagh of Probyn Miers touched upon the threats when building high – particularly around fire. Followed by Peter Chesterfield of Marsh, who gave his view on the key insurance risks for tall buildings.
Over 100 attendees from the real estate and construction sector were polled on a number of issues and provided some really interesting results. Around 50% of participants believed that the most innovation in the design and construction of tall buildings over the next 5 years will come from changes in off-site construction technology and methodology. When then asked about the outlook over a longer period of 10 years, off-site construction technology and methodology remained the top choice at 29% but was followed closely by innovations in building design processes, including BIM, at 25%.
The questions then moved on to tall buildings in London generally. 52% of the audience considered them an inevitable consequence of pressure on land use and 40% said they were fans of tall buildings. Perhaps surprisingly in the wider context only 8% viewed tall buildings in a negative light but we did have an audience full of developers! With this in mind, we asked when and where we are likely to see the first 'mile-high' building – our audience was largely divided between 2040 (36%) and 2050 (38%) and between Beijing (40%) or Dubai (32%).
Finally we asked our guests if they were living in a tall residential building of 40 storeys, what floor level they would choose. 49% of those surveyed had a head for heights and would prefer to be on the upper most floors, with perhaps unsurprisingly the ground floor the least favoured.
Our next event in the campaign will look at the specific challenges posed by tall buildings in the residential context. Visit the Building Up campaign hub for regular updates in our thought leadership series and do let us know if there are any particular issues you would like us to explore.
Show all News & Insights
Insights Paul Stone 15 January, 2020
Focus Antitrust - 15 January 2020
The latest edition of our regular Focus Antitrust update.
Continue Readingabout Focus Antitrust - 15 January 2020
Insights Tessa Newman 15 January, 2020
All bets are off: ASA rules Betway YouTube video breached the CAP Code
ASA found Betway had breached the age restrictions contained in the CAP Code in relation to a video published on its YouTube account.
Continue Readingabout All bets are off: ASA rules Betway YouTube video breached the CAP Code
Insights David Savage 15 January, 2020
Smart contracts, blockchain and construction dispute resolution
David Savage writes an article for Practical Law Construction about smart contracts' impact on construction dispute resolution processes.
Continue Readingabout Smart contracts, blockchain and construction dispute resolution
Events 21 January, 2020
Bad AGMs (and how to avoid them)
Practical tips to prepare for the 2020 "AGM Season"
Continue Readingabout Bad AGMs (and how to avoid them)
David Savage
Partner Construction, Engineering & Projects
Tel David +44(0)1483 252614
david.savage@crsblaw.com
Claire Fallows
Partner Real Estate
Tel Claire +44 (0)20 7427 1046
Email Claire
claire.fallows@crsblaw.com
James Souter
Partner Property Litigation
Tel James +44 (0)20 7427 6716
james.souter@crsblaw.com


text:
#include <ctype.h>
#include <errno.h>
#ifndef __STDC__
#include <math.h>
#endif
#include <string.h>
#include <stdio.h>
#ifndef __OS3__
#include <stdlib.h>
#endif

/* these includes pick up the SID strings in the header files */
#define HEADER_ID
#include "boolean.h"
#include "error.h"
#include "params.h"
#include "storage.h"
#ifdef DEBUG_ALLOC
#include "debug_alloc.h"
#endif
#ifdef CLOCKTIME
#include "clocktime.h"
#endif
#undef HEADER_ID

#include "boolean.h"
#include "error.h"
#include "storage.h"
#include "params.h"
#include "p_struct.inc"

#ifdef DEBUG_ALLOC
#include "debug_alloc.h"
#endif

#ifdef CLOCKTIME
#include "clocktime.h"
#endif

/* global variables for this module */

static char *P_filename;             /* name of parameter file */
static FILE *P_fileptr;              /* file pointer for parameter file */
static char *P_parmname;             /* name of current parameter */
static char  P_noname[] = "(null)";  /* when "P_parmname" not available */

static int   P_error = P_OK;         /* error code for current operation */

#define REC_ERR BASE-50  /* Recoverable (record) error while reading entry */
#define SYN_ERR BASE-51  /* Recoverable (syntax) error while reading entry */
#define BAD_ERR BASE-52  /* Unrecoverable error while reading entry */

static char typ_msg[] =
            "%s unknown basic type %d for parameter '%s' in file '%s';";
#ifdef DEBUG
static char und_msg[] =
            "%s parameter '%s' in file '%s' has values of undefined type;";
#endif
static char not_msg[] = "parameter values were NOT %s";

/* functions local to this module */

#ifdef __STDC__

static int    P_delete (void *name, void *info);
static int    P_write (void *name, void *info);
static int    P_read_param (FILE *file_ptr, PARAM **pp);
static int    P_get_param_line (FILE *file_ptr, char *buffer, int size);
static char  *P_get_param_name (char *buffer, char **p_next);
static STRDBL P_get_param_values (FILE *file_ptr, char *buffer, char *p_buff,
						short type, short *size);
static char *P_get_value_string (FILE *file_ptr, char *buffer, char *p_buff,
				char *o_buff, unsigned *length);
static int    P_write_param (FILE *file_ptr, PARAM *p);
static int    P_put_param_values (FILE *file_ptr, short size, short type,
                                  STRDBL value);
static int    P_free_param (PARAM *p);
static int    P_free_param_values (short basictype, short size, STRDBL value);

#else

static int    P_delete();
static int    P_write();
static int    P_read_param();
static int    P_get_param_line();
static char  *P_get_param_name();
static STRDBL P_get_param_values();
static char  *P_get_value_string();
static int    P_write_param();
static int    P_put_param_values();
static int    P_free_param();
static int    P_free_param_values();

#endif

#ifdef __STDC__
ParamSet PS_init (void)
#else
ParamSet PS_init()
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set to be created.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_init:";
#endif
   PARAM_SET *ps;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   /* allocate space for a parameter-set header */
   if ( (ps = (PARAM_SET *)calloc (1, sizeof (PARAM_SET))) == (PARAM_SET *)NULL)
   {
      SYS_ERROR(("%s calloc header for VNMR parameter set",sub_msg));
   }
   /* create the parameter-set storage area for this file */
   else if ( (ps->p_set = Storage_create (211,strcmp,P_delete)) == (Storage)NULL)
   {
      ERROR(("%s can't create storage area for VNMR parameter set",sub_msg));

      /* free the header */
      (void)free (ps);

      ps = (PARAM_SET *)NULL;
   }
   return ((ParamSet)ps);

}  /* end of function "PS_init" */

#ifdef __STDC__
ParamSet PS_read (char *filename, ParamSet params)
#else
ParamSet PS_read (filename, params)
 char    *filename;
 ParamSet params;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   sub_msg  The name of this function, for error messages.
   fp       A file pointer for the input file.
   ps       A pointer to the "parameter set".
   p        A pointer to a parameter information structure, returned by the
            file reader function.
   res      The result of the load operation.
   */
   static char sub_msg[] = "PS_read:";
   FILE       *fp;
   PARAM_SET  *ps;
   PARAM      *p;
   int         res;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   /* set the pointer to the parameter set */
   ps = (PARAM_SET *)params;

   /* set a name for the VNMR parameter input file */
   if (filename == (char *)NULL || !isprint(*filename) )
   {
      filename = (ps != (PARAM_SET *)NULL && ps->p_name != (char *)NULL) ?
                 ps->p_name : "stdin";
   }
   /* open the VNMR parameter file for reading */
   if (strcmp (filename, "stdin") == 0)
   {
      fp = stdin;
   }
   else if ( (fp = fopen (filename, "r")) == (FILE *)NULL)
   {
      SYS_ERROR(("%s fopen VNMR parameter file '%s'",sub_msg,filename));
      return ((ParamSet)NULL);
   }
   /* if no "parameter set" was specified, create one */
   if (ps == (PARAM_SET *)NULL)
   {
      if ( (ps = (PARAM_SET *)PS_init()) == (PARAM_SET *)NULL)
      {
         (void)fclose (fp);
         return ((ParamSet)NULL);
      }
   }
   /* update the file name in the "parameter set" */
   if (ps->p_name == (char *)NULL)
   {
      ps->p_name = (char *)malloc (strlen (filename) + 1);
#ifdef DEBUG
      if (ps->p_name == (char *)NULL)
         sys_error ("%s malloc space for VNMR parameter file name '%s'",
                    sub_msg,filename);
#endif
   }
   else if (strlen(filename) > strlen(ps->p_name))
   {
      ps->p_name = (char *)realloc (ps->p_name, strlen (filename) + 1);
#ifdef DEBUG
      if (ps->p_name == (char *)NULL)
         sys_error ("%s realloc space for VNMR parameter file name '%s'",
                    sub_msg,filename);
#endif
   }
   if (ps->p_name != (char *)NULL)
      (void)strcpy (ps->p_name, filename);

   /* set the file name for error messages in this module */
   P_filename = ps->p_name;

#ifdef CLOCKTIME
  if (init_timer (1) != 0)
  {
     fprintf (stderr, "'init_timer (1)' failed\n");
     exit (1);
  }
  /* Turn on a clocktime timer */
  (void)start_timer ( 0 );
#endif

   /* load the parameters into the storage area */
   while ( (res = P_read_param (fp, &p)) != EOF)
   {
      /* continue reading on minor (recoverable) errors */
      if (res == REC_ERR)
         continue;

      /* stop reading if a serious error occurred */
      else if (res != P_OK && res != SYN_ERR)
      {
         error ("%s not all parameters read from file '%s'", sub_msg, filename);
         break;
      }
      /* if a parameter entry was read, put it into the parameter set */
      if (p != (PARAM *)NULL)
      {
#ifdef FUBAR
         ERROR(("%s: basictype %d, subtype %d, size %d, enum_size %d",
                p->name, p->basictype, p->subtype, p->size, p->enum_size));
#endif
         if (Storage_insert (ps->p_set, (void *)p->name, (void *)p, REPLACE) !=
             S_OK)
         {
            error ("%s can't store VNMR parameter '%s' from file '%s'",
                   sub_msg, p->name, filename);
         }
      }
   }
#ifdef CLOCKTIME
  /* Turn off the clocktime timer */
  (void)stop_timer (0);

  if (report_timer ("PS_read.out", filename) != 0)
     fprintf (stderr, "\"report_timer (\"PS_read.out\", \"%s\")\" failed\n",
              filename);
#endif

   /* close the parameter file */
   if (fp != stdin)
      (void)fclose (fp);

   /* return the pointer to the header */
   return ((ParamSet)ps);

}  /* end of function "PS_read" */

#ifdef __STDC__
int PS_insert (ParamSet params, char *pname, int type)
#else
int PS_insert (params, pname, type)
 ParamSet params;
 char    *pname;
 int      type;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to parameter set which contains parameter to be created.
   p        A pointer to parameter to be created.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_insert:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if (type != T_UNDEF && type != T_REAL && type != T_STRING)
   {
      ERROR(("%s illegal type %d for parameter '%s'",sub_msg,type,pname));
      P_error = P_TYPE;
   }
   /* get space for a parameter information structure */
   else if ( (p = (PARAM *)calloc (1, sizeof(PARAM))) == (PARAM *)NULL)
   {
      SYS_ERROR(("%s calloc info struct for parameter '%s'",sub_msg,pname));
      P_error = errno;
   }
   /* get memory to store the name string */
   else if ( (p->name = (char *)malloc (strlen(pname) + 1)) == (char*)NULL)
   {
      SYS_ERROR(("%s malloc memory for parameter '%s' name",sub_msg,pname));
      P_error = errno;
   }
   else
   {
      /* copy the name string into storage */
      (void)strcpy (p->name, pname);

      /* set the parameter type */
      p->basictype = (short)type;

      /* put this parameter into the storage area */
      if (Storage_insert (ps->p_set, (void *)pname, (void *)p, REPLACE) != S_OK)
      {
         ERROR(("%s can't store VNMR parameter '%s'",sub_msg,pname));
         P_error = P_INS;
      }
   }
   return (P_error);

}  /* end of function "PS_insert" */

#ifdef __STDC__
int PS_exist (ParamSet params, char *pname)
#else
int PS_exist (params, pname)
 ParamSet params;
 char    *pname;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   res   The result of the search operation.
   */
   PARAM_SET *ps;
   int        res = FALSE;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if (Storage_search (ps->p_set, (void *)pname) != (void *)NULL)
   {
      res = TRUE;
   }
   return (res);

}  /* end of function "PS_exist" */

#ifdef __STDC__
int PS_size (ParamSet params, char *pname, int *size)
#else
int PS_size (params, pname, size)
 ParamSet params;
 char    *pname;
 int     *size;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *size = (int)p->size;
   }
   return (P_error);

}  /* end of function "PS_size" */

#ifdef __STDC__
int PS_enum_size (ParamSet params, char *pname, int *enum_size)
#else
int PS_enum_size (params, pname, enum_size)
 ParamSet params;
 char    *pname;
 int     *enum_size;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *enum_size = (int)p->enum_size;
   }
   return (P_error);

}  /* end of function "PS_enum_size" */

#ifdef __STDC__
int PS_type (ParamSet params, char *pname, int *type)
#else
int PS_type (params, pname, type)
 ParamSet params;
 char    *pname;
 int     *type;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *type = (int)p->basictype;
   }
   return (P_error);

}  /* end of function "PS_type" */

#ifdef __STDC__
int PS_set_subtype (ParamSet params, char *pname, int subtype)
#else
int PS_set_subtype (params, pname, subtype)
 ParamSet params;
 char    *pname;
 int      subtype;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      switch (subtype)
      {
         case ST_UNDEF:
         case ST_REAL:
         case ST_STRING:
         case ST_DELAY:
         case ST_FLAG:
         case ST_FREQUENCY:
         case ST_PULSE:
         case ST_INTEGER:
            p->subtype = (short)subtype;
            break;
         default:
            ERROR(("PS_set_subtype: invalid subtype value %d",subtype));
            P_error = P_SUBT;
            break;
      }
   }
   return (P_error);

}  /* end of function "PS_set_subtype" */

#ifdef __STDC__
int PS_set_active (ParamSet params, char *pname, int active)
#else
int PS_set_active (params, pname, active)
 ParamSet params;
 char    *pname;
 int      active;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      p->active = (short)active;
   }
   return (P_error);

}  /* end of function "PS_set_active" */

#ifdef __STDC__
int PS_set_protect (ParamSet params, char *pname, int protect)
#else
int PS_set_protect (params, pname, protect)
 ParamSet params;
 char    *pname;
 int      protect;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      p->prot = protect;
   }
   return (P_error);

}  /* end of function "PS_set_protect" */

#ifdef __STDC__
int PS_set_real_value (ParamSet params, char *pname, int index, double value)
#else
int PS_set_real_value (params, pname, index, value)
 ParamSet params;
 char    *pname;
 int      index;
 double   value;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_set_real_value:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   /* check the requested value index */
   else if (index < 1)
   {
      P_error = P_INDX;
   }
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter is not a string type */
   else if (p->basictype == T_STRING)
   {
      P_error = P_TYPE;
   }
   else
   {
      /* for an undefined type, set the type to real */
      if (p->basictype == T_UNDEF)
      {
#ifdef DEBUG
         if (p->value.dbl != (double *)NULL)
            error ("%s parameter '%s' value type undefined",sub_msg,pname);
#endif
         p->basictype = T_REAL;
         p->subtype   = ST_REAL;
      }
      if (index > p->size)
      {
         int i;

         /* if there is no array of values, allocate one */
         if (p->value.dbl == (double *)NULL)
         {
            if ( (p->value.dbl = (double *)malloc (
                       (unsigned)(index) * sizeof(double))) == (double *)NULL)
            {
               SYS_ERROR(("%s malloc space for %d values",sub_msg,index));
               return (P_error = P_MEM);
            }
         }
         /* otherwise, resize the array (realloc preserves the contents) */
         else if ( (p->value.dbl = (double *)realloc (p->value.dbl,
                       (unsigned)(index * sizeof(double)))) == (double *)NULL)
         {
            SYS_ERROR(("%s realloc value size from %d to %d",
                       sub_msg,p->size,index));
            return (P_error = P_MEM);
         }
         /* clear all the new values and set the new size */
         for (i = p->size; i < index - 1; ++i)
            p->value.dbl[i] = 0.0;
         p->size = index;
      }
      p->value.dbl [--index] = value;
   }
   return (P_error);

}  /* end of function "PS_set_real_value" */

#ifdef __STDC__
int PS_set_string_value (ParamSet params, char *pname, int index, char *value)
#else
int PS_set_string_value (params, pname, index, value)
 ParamSet params;
 char    *pname;
 int      index;
 char    *value;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   len      The length of the input string value, for storing it.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_set_string_value:";
#endif
   PARAM_SET *ps;
   PARAM     *p;
   unsigned   len;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   /* check the requested value index */
   else if (index < 1)
   {
      P_error = P_INDX;
   }
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter is not a real type */
   else if (p->basictype == T_REAL)
   {
      P_error = P_TYPE;
   }
   else
   {
      /* for an undefined type, set the type to string */
      if (p->basictype == T_UNDEF)
      {
#ifdef DEBUG
         if (p->value.str != (char **)NULL)
            error ("%s parameter '%s' value type undefined",sub_msg,pname);
#endif
         p->basictype = T_STRING;
         p->subtype   = ST_STRING;
      }
      if (index > p->size)
      {
         int i;

         /* if there is no array of values, allocate one */
         if (p->value.str == (char **)NULL)
         {
            if ( (p->value.str = (char **)malloc (
                       (unsigned)(index * sizeof(char *)))) == (char **)NULL)
            {
               SYS_ERROR(("%s malloc space for %d values",sub_msg,index));
               return (P_error = P_MEM);
            }
         }
         /* otherwise, resize the array (realloc preserves the contents) */
         else if ( (p->value.str = (char **)realloc (p->value.str,
                       (unsigned)(index * sizeof(char *)))) == (char **)NULL)
         {
            SYS_ERROR(("%s realloc value size from %d to %d",
                       sub_msg,p->size,index));
            return (P_error = P_MEM);
         }
         /* clear all the new values and set the new size */
         for (i = p->size; i < index; ++i)
            p->value.str[i] = (char *)NULL;
         p->size = index;
      }
      /* set the length of the value, to prepare for storing it */
      len = strlen (value);

      /* store the string */
      if (p->value.str [--index] == (char *)NULL)
      {
         if ( (p->value.str[index] = (char *)malloc (len+1)) == (char *)NULL)
         {
            SYS_ERROR(("%s malloc space for value '%s'",sub_msg,value));
            return (P_error = P_MEM);
         }
      }
      else if (len > strlen (p->value.str[index]) )
      {
         if ( (p->value.str[index] =
               (char *)realloc (p->value.str[index], len+1)) == (char *)NULL)
         {
            SYS_ERROR(("%s realloc space for value '%s'",sub_msg,value));
            return (P_error = P_MEM);
         }
      }
      (void)strcpy (p->value.str[index], value);
   }
   return (P_error);

}  /* end of function "PS_set_string_value" */

#ifdef __STDC__
int PS_set_real_evalue (ParamSet params, char *pname, int index, double evalue)
#else
int PS_set_real_evalue (params, pname, index, evalue)
 ParamSet params;
 char    *pname;
 int      index;
 double   evalue;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_set_real_evalue:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   /* check the requested value index */
   else if (index < 1)
   {
      P_error = P_INDX;
   }
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter is not a string type */
   else if (p->basictype == T_STRING)
   {
      P_error = P_TYPE;
   }
   else
   {
      /* for an undefined type, set the type to real */
      if (p->basictype == T_UNDEF)
      {
#ifdef DEBUG
         if (p->enum_value.dbl != (double *)NULL)
            error ("%s parameter '%s' value type undefined",sub_msg,pname);
#endif
         p->basictype = T_REAL;
         p->subtype   = ST_REAL;
      }
      if (index > p->enum_size)
      {
         int i;

         /* if there is no array of values, allocate one */
         if (p->enum_value.dbl == (double *)NULL)
         {
            if ( (p->enum_value.dbl = (double *)malloc (
                       (unsigned)(index) * sizeof(double))) == (double *)NULL)
            {
               SYS_ERROR(("%s malloc space for %d values",sub_msg,index));
               return (P_error = P_MEM);
            }
         }
         /* otherwise, resize the array (realloc preserves the contents) */
         else if ( (p->enum_value.dbl = (double *)realloc (p->enum_value.dbl,
                       (unsigned)(index * sizeof(double)))) == (double *)NULL)
         {
            SYS_ERROR(("%s realloc value size from %d to %d",
                       sub_msg,p->size,index));
            return (P_error = P_MEM);
         }
         /* clear all the new values and set the new size */
         for (i = p->size; i < index - 1; ++i)
            p->enum_value.dbl[i] = 0.0;
         p->size = index;
      }
      p->enum_value.dbl [--index] = evalue;
   }
   return (P_error);

}  /* end of function "PS_set_real_evalue" */

#ifdef __STDC__
int PS_set_string_evalue (ParamSet params, char *pname, int index, char *evalue)
#else
int PS_set_string_evalue (params, pname, index, evalue)
 ParamSet params;
 char    *pname;
 int      index;
 char    *evalue;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   len      The length of the input string value, for storing it.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_set_string_evalue:";
#endif
   PARAM_SET *ps;
   PARAM     *p;
   unsigned   len;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   /* check the requested value index */
   else if (index < 1)
   {
      P_error = P_INDX;
   }
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter is not a real type */
   else if (p->basictype == T_REAL)
   {
      P_error = P_TYPE;
   }
   else
   {
      /* for an undefined type, set the type to string */
      if (p->basictype == T_UNDEF)
      {
#ifdef DEBUG
         if (p->enum_value.str != (char **)NULL)
            error ("%s parameter '%s' value type undefined",sub_msg,pname);
#endif
         p->basictype = T_STRING;
         p->subtype   = ST_STRING;
      }
      if (index > p->enum_size)
      {
         int i;

         /* if there is no array of values, allocate one */
         if (p->enum_value.str == (char **)NULL)
         {
            if ( (p->enum_value.str = (char **)malloc (
                       (unsigned)(index * sizeof(char *)))) == (char **)NULL)
            {
               SYS_ERROR(("%s malloc space for %d values",sub_msg,index));
               return (P_error = P_MEM);
            }
         }
         /* otherwise, resize the array (realloc preserves the contents) */
         else if ( (p->enum_value.str = (char **)realloc (p->enum_value.str,
                       (unsigned)(index * sizeof(char *)))) == (char **)NULL)
         {
            SYS_ERROR(("%s realloc value size from %d to %d",
                       sub_msg,p->size,index));
            return (P_error = P_MEM);
         }
         /* clear all the new values and set the new size */
         for (i = p->size; i < index; ++i)
            p->enum_value.str[i] = (char *)NULL;
         p->size = index;
      }
      /* set the length of the value, to prepare for storing it */
      len = strlen (evalue);

      /* store the string */
      if (p->enum_value.str [--index] == (char *)NULL)
      {
         if ( (p->enum_value.str[index] = (char *)malloc(len+1)) == (char *)NULL)
         {
            SYS_ERROR(("%s malloc space for value '%s'",sub_msg,evalue));
            return (P_error = P_MEM);
         }
      }
      else if (len > strlen (p->enum_value.str[index]) )
      {
         if ( (p->enum_value.str[index] =
             (char *)realloc (p->enum_value.str[index], len+1)) == (char *)NULL)
         {
            SYS_ERROR(("%s realloc space for value '%s'",sub_msg,evalue));
            return (P_error = P_MEM);
         }
      }
      (void)strcpy (p->enum_value.str[index], evalue);
   }
   return (P_error);

}  /* end of function "PS_set_string_evalue" */

#ifdef __STDC__
int PS_set_G_group (ParamSet params, char *pname, int G_group)
#else
int PS_set_G_group (params, pname, G_group)
 ParamSet params;
 char    *pname;
 int      G_group;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      switch (G_group)
      {
         case G_ALL:
         case G_SAMPLE:
         case G_ACQUISITION:
         case G_PROCESSING:
         case G_DISPLAY:
         case G_SPIN:
            p->Ggroup = (short)G_group;
            break;
         default:
            ERROR(("PS_set_G_group: invalid G_group value %d",G_group));
            P_error = P_GGRP;
            break;
      }
   }
   return (P_error);

}  /* end of function "PS_set_G_group" */

#ifdef __STDC__
int PS_set_D_group (ParamSet params, char *pname, int D_group)
#else
int PS_set_D_group (params, pname, D_group)
 ParamSet params;
 char    *pname;
 int      D_group;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      switch (D_group)
      {
         case D_ALL:
         case D_ACQUISITION:
         case D_2DACQUISITION:
         case D_SAMPLE:
         case D_DECOUPLING:
         case D_AFLAGS:
         case D_PROCESSING:
         case D_SPECIAL:
         case D_DISPLAY:
         case D_REFERENCE:
         case D_PHASE:
         case D_CHART:
         case D_2DDISPLAY:
         case D_INTEGRAL:
         case D_DFLAGS:
         case D_FID:
         case D_SHIMCOILS:
         case D_AUTOMATION:
         case D_NUMBERS:
         case D_STRINGS:
            p->Dgroup = (short)D_group;
            break;
         default:
            ERROR(("PS_set_D_group: invalid D_group value %d",D_group));
            P_error = P_DGRP;
            break;
      }
   }
   return (P_error);

}  /* end of function "PS_set_D_group" */

#ifdef __STDC__
int PS_set_minval (ParamSet params, char *pname, double minval)
#else
int PS_set_minval (params, pname, minval)
 ParamSet params;
 char    *pname;
 double   minval;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      p->minval = minval;
   }
   return (P_error);

}  /* end of function "PS_set_minval" */

#ifdef __STDC__
int PS_set_maxval (ParamSet params, char *pname, double maxval)
#else
int PS_set_maxval (params, pname, maxval)
 ParamSet params;
 char    *pname;
 double   maxval;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      p->maxval = maxval;
   }
   return (P_error);

}  /* end of function "PS_set_maxval" */

#ifdef __STDC__
int PS_set_step (ParamSet params, char *pname, double step)
#else
int PS_set_step (params, pname, step)
 ParamSet params;
 char    *pname;
 double   step;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to set.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      p->step = step;
   }
   return (P_error);

}  /* end of function "PS_set_step" */

#ifdef __STDC__
int PS_get_subtype (ParamSet params, char *pname, int *subtype)
#else
int PS_get_subtype (params, pname, subtype)
 ParamSet params;
 char    *pname;
 int     *subtype;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *subtype = (int)p->subtype;
   }
   return (P_error);

}  /* end of function "PS_get_subtype" */

#ifdef __STDC__
int PS_get_active (ParamSet params, char *pname, int *active)
#else
int PS_get_active (params, pname, active)
 ParamSet params;
 char    *pname;
 int     *active;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *active = (int)p->active;
   }
   return (P_error);

}  /* end of function "PS_get_active" */

#ifdef __STDC__
int PS_get_protect (ParamSet params, char *pname, int *protect)
#else
int PS_get_protect (params, pname, protect)
 ParamSet params;
 char    *pname;
 int     *protect;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *protect = p->prot;
   }
   return (P_error);

}  /* end of function "PS_get_protect" */

#ifdef __STDC__
int PS_get_real_value (ParamSet params, char *pname, int index, double *value)
#else
int PS_get_real_value (params, pname, index, value)
 ParamSet params;
 char    *pname;
 int      index;
 double  *value;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_get_real_value:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
#ifdef DEBUG
   else if (value == (double *)NULL)
   {
      error ("%s NULL value pointer",sub_msg);
      P_error = P_BAD;
   }
#endif
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set,(void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter has the correct type */
   else if (p->basictype != T_REAL)
   {
      P_error = P_TYPE;
   }
   /* check the requested value index */
   else if (index < 1 || index > p->size)
   {
      P_error = P_INDX;
   }
   else
   {
      *value = p->value.dbl [--index];
   }
   return (P_error);

}  /* end of function "PS_get_real_value" */

#ifdef __STDC__
int PS_get_string_value (ParamSet params, char *pname, int index, char **value)
#else
int PS_get_string_value (params, pname, index, value)
 ParamSet params;
 char    *pname;
 int      index;
 char   **value;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_get_string_value:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
#ifdef DEBUG
   else if (value == (char **)NULL)
   {
      error ("%s NULL value pointer",sub_msg);
      P_error = P_BAD;
   }
#endif
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set,(void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter has the correct type */
   else if (p->basictype != T_STRING)
   {
      P_error = P_TYPE;
   }
   /* check the requested value index */
   else if (index < 1 || index > p->size)
   {
      P_error = P_INDX;
   }
   else
   {
      *value = p->value.str [--index];
   }
   return (P_error);

}  /* end of function "PS_get_string_value" */

#ifdef __STDC__
int PS_get_real_evalue (ParamSet params, char *pname, int index, double *evalue)
#else
int PS_get_real_evalue (params, pname, index, evalue)
 ParamSet params;
 char    *pname;
 int      index;
 double  *evalue;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_get_real_evalue:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
#ifdef DEBUG
   else if (evalue == (double *)NULL)
   {
      error ("%s NULL value pointer",sub_msg);
      P_error = P_BAD;
   }
#endif
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set,(void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter has the correct type */
   else if (p->basictype != T_REAL)
   {
      P_error = P_TYPE;
   }
   /* check the requested value index */
   else if (index < 1 || index > p->enum_size)
   {
      P_error = P_INDX;
   }
   else
   {
      *evalue = p->enum_value.dbl [--index];
   }
   return (P_error);

}  /* end of function "PS_get_real_evalue" */

#ifdef __STDC__
int PS_get_string_evalue (ParamSet params, char *pname, int index, char **evalue)
#else
int PS_get_string_evalue (params, pname, index, evalue)
 ParamSet params;
 char    *pname;
 int      index;
 char   **evalue;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter for
            which the value is to be set.
   p        A pointer to the parameter for which the value is to be set.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_get_string_evalue:";
#endif
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
#ifdef DEBUG
   else if (evalue == (char **)NULL)
   {
      error ("%s NULL value pointer",sub_msg);
      P_error = P_BAD;
   }
#endif
   /* get the parameter from storage */
   else if ( (p = (PARAM *)Storage_search (ps->p_set,(void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   /* make sure that this parameter has the correct type */
   else if (p->basictype != T_STRING)
   {
      P_error = P_TYPE;
   }
   /* check the requested value index */
   else if (index < 1 || index > p->enum_size)
   {
      P_error = P_INDX;
   }
   else
   {
      *evalue = p->enum_value.str [--index];
   }
   return (P_error);

}  /* end of function "PS_get_string_evalue" */

#ifdef __STDC__
int PS_get_G_group (ParamSet params, char *pname, int *G_group)
#else
int PS_get_G_group (params, pname, G_group)
 ParamSet params;
 char    *pname;
 int     *G_group;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *G_group = (int)p->Ggroup;
   }
   return (P_error);

}  /* end of function "PS_get_G_group" */

#ifdef __STDC__
int PS_get_D_group (ParamSet params, char *pname, int *D_group)
#else
int PS_get_D_group (params, pname, D_group)
 ParamSet params;
 char    *pname;
 int     *D_group;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *D_group = (int)p->Dgroup;
   }
   return (P_error);

}  /* end of function "PS_get_D_group" */

#ifdef __STDC__
int PS_get_minval (ParamSet params, char *pname, double *minval)
#else
int PS_get_minval (params, pname, minval)
 ParamSet params;
 char    *pname;
 double  *minval;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *minval = p->minval;
   }
   return (P_error);

}  /* end of function "PS_get_minval" */

#ifdef __STDC__
int PS_get_maxval (ParamSet params, char *pname, double *maxval)
#else
int PS_get_maxval (params, pname, maxval)
 ParamSet params;
 char    *pname;
 double  *maxval;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *maxval = p->maxval;
   }
   return (P_error);

}  /* end of function "PS_get_maxval" */

#ifdef __STDC__
int PS_get_step (ParamSet params, char *pname, double *step)
#else
int PS_get_step (params, pname, step)
 ParamSet params;
 char    *pname;
 double  *step;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set which contains the parameter to get.
   p     A pointer to the parameter information structure.
   */
   PARAM_SET *ps;
   PARAM     *p;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else if ( (p = (PARAM *)Storage_search (ps->p_set, (void *)pname)) ==
            (PARAM *)NULL)
   {
      P_error = P_SRCH;
   }
   else
   {
      *step = p->step;
   }
   return (P_error);

}  /* end of function "PS_get_step" */

#ifdef __STDC__
int PS_delete (ParamSet params, char *pname)
#else
int PS_delete (params, pname)
 ParamSet params;
 char    *pname;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps       A pointer to the parameter set which contains the parameter to be
            deleted.
   res      The result of the write operation.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_delete:";
#endif
   PARAM_SET *ps;
   int        res;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      ERROR(("%s NULL parameter set pointer",sub_msg));
      P_error = P_BAD;
   }
   else
   {
      switch (res = Storage_delete (ps->p_set, (void *)pname))
      {
         case S_OK:
            break;
         case S_EMT:
            P_error = P_EMT;
            break;
         case S_DERR:
            P_error = P_DERR;
            break;
         case S_SRCH:
            P_error = P_SRCH;
            break;
         default:
            ERROR(("%s Storage_delete returned error %d",sub_msg,res));
         case S_BAD:
            P_error = P_BAD;
            break;
      }
   }
   return (P_error);

}  /* end of function "PS_delete" */

#ifdef __STDC__
int PS_write (char *filename, ParamSet params)
#else
int PS_write (filename, params)
 char    *filename;
 ParamSet params;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set to be written.
   fp    The file pointer for the output file.
   res   The result of the write operation.
   */
#ifdef DEBUG
   static char sub_msg[] = "PS_write:";
#endif
   PARAM_SET *ps;
   FILE      *fp = (FILE *)NULL;
   int        res;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      ERROR(("%s NULL parameter set pointer",sub_msg));
      P_error = P_BAD;
   }
   else
   {
      /* set a name for the VNMR parameter output file */
      if (filename == (char *)NULL || !isprint(*filename) )
      {
         filename = (ps->p_name!=(char *)NULL && strcmp(ps->p_name,"stdin")!=0) ?
                    ps->p_name : "stdout";
      }
      /* open the VNMR parameter file for writing */
      if (strcmp (filename, "stdout") == 0)
         fp = stdout;
      else if ( (fp = fopen (filename, "w")) == NULL)
      {
         SYS_ERROR(("%s can't open output VNMR param file '%s'",
                    sub_msg,filename));
         return (P_error = errno);
      }
      /* set the name and code for error messages in this module */
      P_error    = P_OK;
      P_filename = ps->p_name;
      P_fileptr  = fp;

      /* write the contents of this parameter set to the output file */
      switch (res = Storage_output (ps->p_set, P_write))
      {
         case S_OK:
            break;
         case S_EMT:
            P_error = P_EMT;
            break;
         default:
            ERROR(("PS_write: Storage_output returned error %d",res));
         case S_BAD:
            P_error = P_BAD;
            break;
      }
      /* close the output file */
      if (fp != stdout)
         (void)fclose (fp);
   }
   return (P_error);

}  /* end of function "PS_write" */

#ifdef __STDC__
int PS_clear (ParamSet params)
#else
int PS_clear (params)
 ParamSet params;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set to be cleared.
   res   The result of the clear operation.
   */
   PARAM_SET *ps;
   int        res;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else
   {
      switch (res = Storage_clear (ps->p_set))
      {
         case S_OK:
            break;
         case S_EMT:
            P_error = P_EMT;
            break;
         case S_DERR:
            P_error = P_DERR;
            break;
         default:
            ERROR(("PS_clear: Storage_clear returned error %d",res));
         case S_BAD:
            P_error = P_BAD;
            break;
      }
      /* free the memory for the file name and clear the pointer */
      if (ps->p_name != (char *)NULL)
      {
         (void)free (ps->p_name);
         ps->p_name = (char *)NULL;
      }
   }
   return (P_error);

}  /* end of function "PS_clear" */

#ifdef __STDC__
int PS_release (ParamSet params)
#else
int PS_release (params)
 ParamSet params;
#endif
{
   /**************************************************************************
   LOCAL VARIABLES:

   ps    A pointer to the parameter set to be released.
   res   The result of the release operation.
   */
   PARAM_SET *ps;
   int        res;

   /* clear the return code for errors in this module */
   P_error = P_OK;

   if ( (ps = (PARAM_SET *)params) == (PARAM_SET *)NULL ||
       ps->p_set == (Storage)NULL)
   {
      P_error = P_BAD;
   }
   else
   {
      switch (res = Storage_release (ps->p_set))
      {
         case S_BAD:
            P_error = P_BAD;
            break;
         case S_EMT:
            P_error = P_EMT;
            break;
         case S_DERR:
            P_error = P_DERR;
            break;
         case S_OK:
            break;
         default:
            ERROR(("PS_release: Storage_release returned error %d",res));
            break;
      }
      /* free the memory for the file name */
      if (ps->p_name != (char *)NULL)
         (void)free (ps->p_name);

      /* free the memory for the parameter set header */
      (void)free (ps);
   }
   return (P_error);

}  /* end of function "PS_release" */

#include "p_static.inc"


text:
Spook Bridge, located on the county line between Brooks County and Lowndes County in the U.S. state of Georgia, is an abandoned open spandrel arch bridge crossing the Withlacoochee River on a closed section of Old Quitman Highway (also known as Blue Springs Road, formerly U.S. Route 84). It is considered Lowndes County's most famous relic and is decaying, becoming a dangerous site, due to its abandonment. For decades, it has served as the center of urban legends and small town curiosity in the nearby cities of Quitman and Valdosta. The bridge has developed a reputation for being a popular "hangout" for teenagers and is rumored to be haunted due to its isolated and overgrown environment.

History
According to Charles Arnold, electrical superintendent for Quitman, the bridge was built circa 1920; however, its actual date of completion is unknown. The land near the bridge was owned by the Walter Cunningham family, and a resort called Blue Springs was located across the bridge near a train stop on the Brooks County side. Blue Springs resort attracted tourists from around the state of Georgia and included Blue Hole, a natural spring located near the bridge, and cabins for the tourists to stay in. According to Larry Cunningham, nephew of the late land owner Walter Cunningham, in the mid-1940s a gas truck crashed into the bridge's railing on the Brooks County side, tearing between 50 and 100 feet of railing. The railing was never repaired. According to Cunningham, at least two drownings occurred at Blue Hole prior to 1970.

In the late 1940s, a flood washed out and eventually destroyed the road on either side of the bridge, making the road unsafe for vehicle traffic. A new bridge in conjunction with US 84 opened in 1950, dramatically reducing the amount of traffic on the bridge, and around 1970, Blue Hole dried up, bringing the local tourism to a halt. According to Cunningham, satanic graffiti, such as pentagrams, began appearing in 1974 and 1975, and because of the graffiti locals gave it the name "Spook Bridge".

Legends and rumors
Some of the most common tales associated with the bridge involve a dilapidated house that stands nearby, which as local folklore claims, once housed a couple, and the husband who resided there killed his wife before committing suicide. A different version of the story states that the couple was walking on the bridge when the husband shoved his wife off of the bridge and into the water, and the wife haunts the bridge, trying to climb onto the bridge from the river below. Another legend states that a high school couple was driving on the bridge when their car ran through the railings and off of the bridge, sweeping them into the river. It was rumored that if one drives onto the bridge, one can hear screaming and feel the vibrations of someone beating on the hood of the vehicle. It has also been rumored that a school bus full of children was driven off of one side of the bridge.

Spook Bridge in its current state
The destroyed section of the road on Old Quitman Hwy has been blocked off on both the Lowndes County and Brooks County entrances. The road is torn apart, and the asphalt has been ripped, cracked, and scorched by fires. The roadway and railings are covered with graffiti, and the cracks in the concrete are lined with broken glass. When flooding occurs, sections of the bridge sometimes become submerged under the flood water.

Brooks County sheriffs have expressed a great deal of concern for the danger of the bridge and often patrol the abandoned roadway, making several arrests for trespassing. According to Brooks County sheriff, Richard A. Chafin, a murder occurred on the bridge and was believed to be a "drug deal gone bad". Chafin has stated that the bridge is dangerous and should be torn down,  and some citizens of Valdosta are also supportive of the bridge's demolition.

In popular media
A feature film was produced in 2016 featuring stories dating back from the 1870s, and was shot in various Brooks County locations including abandoned bridge itself. The movie released October 25th, 2017.

References

Road bridges in Georgia (U.S. state)
U.S. Route 84
Former road bridges in the United States
Bridges of the United States Numbered Highway System
Buildings and structures in Lowndes County, Georgia
Buildings and structures in Brooks County, Georgia
Reportedly haunted locations in Georgia (U.S. state)
Open-spandrel deck arch bridges in the United States
Bridges completed in the 20th century

redpajama_set_name: RedPajamaWikipedia


text:
News Articles by Andrea Turner
Andrea Turner
Damage assessed at Union's biblical center
By Andrea Turner, posted February 15, 2008 in
JACKSON, Tenn. (BP)--The Ryan Center for Biblical Studies at Union University lost approximately 10 percent of its holdings when the EF-4 tornado swept through the Jackson, Tenn., campus Feb. 5. The center is located on the top floor of Jennings Hall, which had half its roof ripped off in the tornado. Most of the damage was caused by water, mildew or mold.
Tenn. Sen. praises Union as inspiring
ORIGINALLY POSTED Feb 9, 2008 JACKSON, Tenn. (BP)–Tennessee Sen. Bob Corker praised Union University's leadership, students and community today for the inspiring way they have responded to the devastating tornado that struck the campus Feb. 5. "The devastation here is hard to visualize, even on TV," Corker, R.-Tenn., said during a Feb. 8 news conference. […]


Online casinos are a way to enjoy a good time from home. Online casinos are opening their virtual doors every day, all of which offer quality and quantity of cash prizes. Start playing top casino games now!


One introvert's stories about taking risks, growing relationships, and facing challenges without getting lost between faith and fear.
165 backers pledged $9,175 to help bring this project to life.
This is a week of great progress! Read the full update.
After 7 drafts, one last round of edits.
What a 23 days it has been. Now pass the eggnog and let's celebrate!
Well, we just saw one.
If you've been waiting to order a copy of my book, there's no better chance than this.
Live Q&A Monday, a book review, and the final few days!
We surpassed the 50% mark, and we've got a precious few days left to reach the $8,500 goal!
We're over 1/3rd of the way there with 11 days remaining!
It's been a few years since I've been on the radio. Wow, I was so nervous.
The End of Day 1: You are the heroic ones.